Python: Hướng dẫn phân loại sử dụng SVM (Support Vector Machines)


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

SVM (Support Vector Machines) là các thuật toán học máy có giám sát được sử dụng cho mục đích phân loại và hồi quy. Trong bài viết này, tôi xây dựng bộ phân loại SVM để phân loại sao Pulsar. Tôi đã sử dụng bộ dữ liệu Predicting a Pulsar Star cho dự án này.

1. Giới thiệu về máy vectơ hỗ trợ
Mục lục

Support Vector Machines (viết tắt là SVM) là các thuật toán học máy được sử dụng cho mục đích phân loại và hồi quy. SVM là một trong những thuật toán học máy mạnh mẽ cho mục đích phân loại, hồi quy và phát hiện ngoại lệ. Trình phân loại SVM xây dựng một mô hình gán các điểm dữ liệu mới cho một trong các danh mục đã cho. Do đó, nó có thể được xem như một bộ phân loại tuyến tính nhị phân phi xác suất.

Thuật toán SVM ban đầu được phát triển bởi Vladimir N Vapnik và Alexey Ya. Chervonenkis vào năm 1963. Vào thời điểm đó, thuật toán đang ở giai đoạn đầu. Khả năng duy nhất là vẽ các siêu phẳng cho bộ phân loại tuyến tính. Năm 1992, Bernhard E. Boser, Isabelle M Guyon và Vladimir N Vapnik đã đề xuất một cách để tạo các bộ phân loại phi tuyến tính bằng cách áp dụng thủ thuật nhân cho các siêu phẳng có biên cực đại. Tiêu chuẩn hiện tại được đề xuất bởi Corinna Cortes và Vapnik vào năm 1993 và được xuất bản vào năm 1995.

SVM có thể được sử dụng cho mục đích phân loại tuyến tính. Ngoài việc thực hiện phân loại tuyến tính, các SVM có thể thực hiện phân loại phi tuyến tính một cách hiệu quả bằng thủ thuật kernel. Nó cho phép chúng tôi ánh xạ hoàn toàn các đầu vào vào các không gian đặc trưng nhiều chiều.

2. Hỗ trợ trực giác Vector Machines
Mục lục

Bây giờ, chúng ta nên làm quen với một số thuật ngữ SVM.

siêu phẳng
Siêu phẳng là một ranh giới quyết định phân tách giữa tập hợp các điểm dữ liệu đã cho có các nhãn lớp khác nhau. Trình phân loại SVM phân tách các điểm dữ liệu bằng siêu phẳng với số lượng lề tối đa. Siêu phẳng này được gọi là siêu phẳng lề tối đa và bộ phân loại tuyến tính mà nó xác định được gọi là bộ phân loại lề tối đa.

Vectơ hỗ trợ
Các vectơ hỗ trợ là các điểm dữ liệu mẫu, gần siêu phẳng nhất. Các điểm dữ liệu này sẽ xác định đường phân cách hoặc siêu phẳng tốt hơn bằng cách tính toán các lề.

Lề
Lề là khoảng cách tách biệt giữa hai dòng trên các điểm dữ liệu gần nhất. Nó được tính bằng khoảng cách vuông góc từ đường thẳng đến vectơ hỗ trợ hoặc điểm dữ liệu gần nhất. Trong các SVM, chúng tôi cố gắng tối đa hóa khoảng cách phân tách này để có được mức tối đa.

Sơ đồ sau đây minh họa các khái niệm này một cách trực quan.

Ký quỹ trong SVM
Ký quỹ trong SVM

SVM Dưới mui xe
Trong các SVM, mục tiêu chính của chúng tôi là chọn một siêu phẳng có lề tối đa có thể giữa các vectơ hỗ trợ trong tập dữ liệu đã cho. SVM tìm kiếm siêu phẳng lề tối đa trong quy trình 2 bước sau –

Tạo các siêu phẳng phân tách các lớp theo cách tốt nhất có thể. Có nhiều siêu phẳng có thể phân loại dữ liệu. Chúng ta nên tìm siêu phẳng tốt nhất đại diện cho khoảng cách lớn nhất, hoặc lề, giữa hai lớp.

Vì vậy, chúng tôi chọn siêu phẳng sao cho khoảng cách từ nó đến các vectơ hỗ trợ ở mỗi bên là tối đa. Nếu một siêu phẳng như vậy tồn tại, nó được gọi là siêu phẳng lề tối đa và bộ phân loại tuyến tính mà nó xác định được gọi là bộ phân loại lề tối đa.

Sơ đồ sau đây minh họa khái niệm về lề tối đa và siêu phẳng lề tối đa một cách rõ ràng.

Siêu phẳng lề tối đa
Siêu phẳng lề tối đa

Vấn đề với tập dữ liệu phân tán
Đôi khi, các điểm dữ liệu mẫu phân tán đến mức không thể tách chúng ra bằng siêu phẳng tuyến tính. Trong tình huống như vậy, các SVM sử dụng thủ thuật hạt nhân để chuyển đổi không gian đầu vào thành không gian chiều cao hơn như trong sơ đồ bên dưới. Nó sử dụng chức năng ánh xạ để chuyển đổi không gian đầu vào 2-D thành không gian đầu vào 3-D. Giờ đây, chúng ta có thể dễ dàng phân tách các điểm dữ liệu bằng cách sử dụng phân tách tuyến tính.

Thủ thuật hạt nhân - chuyển đổi không gian đầu vào sang không gian chiều cao hơn
thủ thuật hạt nhân

thêm Codeadd Markdown
3. Thủ thuật hạt nhân
Mục lục

Trong thực tế, thuật toán SVM được triển khai bằng kernel. Nó sử dụng một kỹ thuật gọi là thủ thuật hạt nhân. Nói một cách đơn giản, kernel chỉ là một chức năng ánh xạ dữ liệu lên một chiều cao hơn, nơi dữ liệu có thể tách rời. Nhân biến đổi không gian dữ liệu đầu vào có chiều thấp thành không gian có chiều cao hơn. Vì vậy, nó chuyển đổi các vấn đề có thể tách phi tuyến tính thành các vấn đề có thể tách tuyến tính bằng cách thêm nhiều chiều hơn vào nó. Như vậy thủ thuật kernel giúp chúng ta xây dựng bộ phân loại chính xác hơn. Do đó, nó rất hữu ích trong các bài toán tách phi tuyến tính.

thêm Codeadd Markdown
Chúng ta có thể định nghĩa một hàm kernel như sau-

chức năng hạt nhân
chức năng hạt nhân

thêm Codeadd Markdown
Trong ngữ cảnh của SVM, có 4 nhân phổ biến - Nhân tuyến tính, Nhân đa thức, Nhân hàm cơ sở xuyên tâm (RBF) (còn gọi là Nhân Gaussian) và Nhân Sigmoid. Chúng được mô tả dưới đây -

thêm Codeadd Markdown
3.1 Nhân tuyến tính
Trong kernel tuyến tính, hàm kernel có dạng hàm tuyến tính như sau-

nhân tuyến tính: K(xi , xj ) = xiT xj

Hạt nhân tuyến tính được sử dụng khi dữ liệu có thể phân tách tuyến tính. Điều đó có nghĩa là dữ liệu có thể được phân tách bằng một dòng. Nó là một trong những hạt nhân phổ biến nhất được sử dụng. Nó chủ yếu được sử dụng khi có số lượng lớn các tính năng trong tập dữ liệu. Nhân tuyến tính thường được sử dụng cho mục đích phân loại văn bản.

Đào tạo với nhân tuyến tính thường nhanh hơn, bởi vì chúng ta chỉ cần tối ưu hóa tham số chuẩn hóa C. Khi huấn luyện với các nhân khác, chúng ta cũng cần tối ưu hóa tham số γ. Vì vậy, thực hiện tìm kiếm dạng lưới thường sẽ mất nhiều thời gian hơn.

Nhân tuyến tính có thể hình dung bằng hình sau.

hạt nhân tuyến tính
hạt nhân tuyến tính

thêm Codeadd Markdown
3.2 Hạt nhân đa thức
Hạt nhân đa thức biểu thị sự giống nhau của các vectơ (mẫu huấn luyện) trong một không gian đặc trưng so với đa thức của các biến ban đầu. Nhân đa thức không chỉ xem xét các tính năng đã cho của các mẫu đầu vào để xác định độ giống nhau của chúng mà còn cả sự kết hợp của các mẫu đầu vào.

Đối với đa thức bậc d, nhân đa thức được định nghĩa như sau –

Nhân đa thức : K(xi , xj ) = (γxiT xj + r)d , γ > 0

Nhân đa thức rất phổ biến trong Xử lý ngôn ngữ tự nhiên. Mức độ phổ biến nhất là d = 2 (bậc hai), vì mức độ lớn hơn có xu hướng phù hợp hơn với các vấn đề NLP. Có thể hình dung bằng sơ đồ sau.

nhân đa thức
nhân đa thức

thêm Codeadd Markdown
3.3 Hạt nhân chức năng cơ sở xuyên tâm
Hạt nhân chức năng cơ sở xuyên tâm là một hạt nhân mục đích chung

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt # for data visualization
import seaborn as sns # for statistical data visualization
%matplotlib inline

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# Any results you write to the current directory are saved as output.

 

 

 

import warnings

warnings.filterwarnings('ignore')

 

 

7. Nhập tập dữ liệu
Mục lục

data = '/kaggle/input/predicting-a-pulsar-star/pulsar_stars.csv'

df = pd.read_csv(data)

8. Phân tích dữ liệu khám phá

Mục lục

Bây giờ, tôi sẽ khám phá dữ liệu để hiểu rõ hơn về dữ liệu.

# view dimensions of dataset

df.shape

Chúng ta có thể thấy rằng có 17898 trường hợp và 9 biến trong tập dữ liệu.

# let's preview the dataset

df.head()

Chúng ta có thể thấy rằng có 9 biến trong tập dữ liệu. 8 là biến liên tục và 1 là biến rời rạc. Biến rời rạc là biến target_class. Nó cũng là biến mục tiêu.

Bây giờ, tôi sẽ xem các tên cột để kiểm tra khoảng trắng ở đầu và cuối.

# view the column names of the dataframe

col_names = df.columns

col_names

Chúng ta có thể thấy rằng có các khoảng trắng ở đầu (khoảng trắng ở đầu tên chuỗi) trong khung dữ liệu. Vì vậy, tôi sẽ loại bỏ những không gian hàng đầu này.

# remove leading spaces from column names

df.columns = df.columns.str.strip()

Tôi đã xóa các khoảng trắng ở đầu tên cột. Hãy xem lại các tên cột để xác nhận điều tương tự.

# view column names again

df.columns

Chúng ta có thể thấy rằng các khoảng trắng ở đầu đã bị xóa khỏi tên cột. Nhưng tên cột rất dài. Vì vậy, tôi sẽ làm cho chúng ngắn lại bằng cách đổi tên chúng.

# rename column names

df.columns = ['IP Mean', 'IP Sd', 'IP Kurtosis', 'IP Skewness',
              'DM-SNR Mean', 'DM-SNR Sd', 'DM-SNR Kurtosis', 'DM-SNR Skewness', 'target_class']

 

# view the renamed column names

df.columns

Chúng ta có thể thấy rằng các tên cột được rút ngắn. IP là viết tắt của cấu hình tích hợp và DM-SNR là viết tắt của điều chế delta và tỷ lệ tín hiệu trên tạp âm. Giờ đây, việc làm việc với các cột trở nên dễ dàng hơn nhiều.

Biến mục tiêu của chúng tôi là cột target_class. Vì vậy, tôi sẽ kiểm tra phân phối của nó.

# check distribution of target_class column

df['target_class'].value_counts()

 

# view the percentage distribution of target_class column

df['target_class'].value_counts()/np.float(len(df))

Ta có thể thấy tỷ lệ quan sát của nhãn lớp 0 và 1 là 90,84% và 9,16%. Vì vậy, đây là một vấn đề mất cân bằng giai cấp. Tôi sẽ đối phó với điều đó trong phần sau.

# view summary of dataset

df.info()

Chúng ta có thể thấy rằng không có giá trị nào bị thiếu trong tập dữ liệu và tất cả các biến đều là biến số.

Khám phá các giá trị còn thiếu trong các biến

 

» Tiếp: Xây dựng ứng dụng di động với framework Python Kivy
« Trước: Bài 6. Đồ họa
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!