Scikit Learn - Hỗ trợ Máy Vector

Chương này đề cập đến một phương pháp học máy được gọi là Máy vectơ hỗ trợ (SVM).

Giới thiệu

Máy vectơ hỗ trợ (SVM) là phương pháp học máy được giám sát mạnh mẽ nhưng linh hoạt được sử dụng để phân loại, hồi quy và phát hiện các ngoại lệ. SVM rất hiệu quả trong không gian chiều cao và thường được sử dụng trong các bài toán phân loại. SVM phổ biến và hiệu quả về bộ nhớ vì chúng sử dụng một tập hợp con các điểm huấn luyện trong hàm quyết định.

Mục tiêu chính của SVM là chia bộ dữ liệu thành số lớp để tìm maximum marginal hyperplane (MMH) có thể được thực hiện theo hai bước sau:

  • Máy hỗ trợ Vector đầu tiên sẽ tạo lặp đi lặp lại các siêu máy bay để phân tách các lớp theo cách tốt nhất.

  • Sau đó, nó sẽ chọn siêu phẳng phân tách các lớp một cách chính xác.

Một số khái niệm quan trọng trong SVM như sau:

  • Support Vectors- Chúng có thể được định nghĩa là các điểm dữ liệu gần nhất với siêu phẳng. Các vectơ hỗ trợ giúp quyết định đường phân cách.

  • Hyperplane - Mặt phẳng quyết định hoặc không gian phân chia tập hợp các đối tượng có các lớp khác nhau.

  • Margin - Khoảng cách giữa hai dòng trên các điểm dữ liệu tủ của các lớp khác nhau được gọi là lề.

Các sơ đồ sau sẽ cung cấp cho bạn cái nhìn sâu sắc về các khái niệm SVM này -

SVM trong Scikit-learning hỗ trợ cả vectơ mẫu thưa thớt và dày đặc làm đầu vào.

Phân loại SVM

Scikit-learning cung cấp ba lớp cụ thể là SVC, NuSVCLinearSVC có thể thực hiện phân loại lớp đa kính.

SVC

Đó là phân loại vectơ hỗ trợ C mà việc triển khai dựa trên libsvm. Mô-đun được sử dụng bởi scikit-learning làsklearn.svm.SVC. Lớp này xử lý hỗ trợ đa kính theo sơ đồ một chọi một.

Thông số

Bảng theo dõi bao gồm các thông số được sử dụng bởi sklearn.svm.SVC lớp học -

Sr.No Mô tả về Thông Số
1

C - float, tùy chọn, mặc định = 1.0

Nó là tham số phạt của thuật ngữ lỗi.

2

kernel - string, option, default = 'rbf'

Tham số này chỉ định loại hạt nhân sẽ được sử dụng trong thuật toán. chúng ta có thể chọn bất kỳ cái nào trong số,‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’. Giá trị mặc định của kernel sẽ là‘rbf’.

3

degree - int, tùy chọn, mặc định = 3

Nó thể hiện mức độ của chức năng hạt nhân 'poly' và sẽ bị bỏ qua bởi tất cả các hạt nhân khác.

4

gamma - {'scale', 'auto'} hoặc float,

Nó là hệ số nhân cho các nhân 'rbf', 'poly' và 'sigmoid'.

5

optinal default - = 'quy mô'

Nếu bạn chọn mặc định tức là gamma = 'scale' thì giá trị của gamma được SVC sử dụng là 1 / (_ ∗. ()).

Mặt khác, nếu gamma = 'auto', nó sử dụng 1 / _.

6

coef0 - float, tùy chọn, Mặc định = 0.0

Một thuật ngữ độc lập trong hàm nhân chỉ có ý nghĩa trong 'poly' và 'sigmoid'.

7

tol - float, tùy chọn, mặc định = 1.e-3

Tham số này thể hiện tiêu chí dừng cho các lần lặp.

số 8

shrinking - Boolean, tùy chọn, mặc định = True

Tham số này thể hiện rằng chúng ta có muốn sử dụng heuristic thu nhỏ hay không.

9

verbose - Boolean, mặc định: false

Nó bật hoặc tắt đầu ra dài dòng. Giá trị mặc định của nó là sai.

10

probability - boolean, tùy chọn, mặc định = true

Tham số này bật hoặc tắt các ước tính xác suất. Giá trị mặc định là false, nhưng nó phải được bật trước khi chúng tôi gọi là fit.

11

max_iter - int, tùy chọn, mặc định = -1

Như tên gợi ý, nó đại diện cho số lần lặp lại tối đa trong bộ giải. Giá trị -1 nghĩa là không có giới hạn về số lần lặp.

12

cache_size - phao, tùy chọn

Tham số này sẽ chỉ định kích thước của bộ nhớ đệm hạt nhân. Giá trị sẽ tính bằng MB (MegaBytes).

13

random_state - int, RandomState instance hoặc None, tùy chọn, default = none

Tham số này đại diện cho hạt giống của số ngẫu nhiên giả được tạo ra được sử dụng trong khi xáo trộn dữ liệu. Tiếp theo là các tùy chọn -

  • int- Trong trường hợp này, random_state là hạt giống được sử dụng bởi trình tạo số ngẫu nhiên.

  • RandomState instance - Trong trường hợp này, random_state là bộ tạo số ngẫu nhiên.

  • None - Trong trường hợp này, trình tạo số ngẫu nhiên là thể hiện RandonState được sử dụng bởi np.random.

14

class_weight - {dict, 'balance'}, tùy chọn

Tham số này sẽ đặt tham số C của lớp j thành _ℎ [] ∗ cho SVC. Nếu chúng ta sử dụng tùy chọn mặc định, điều đó có nghĩa là tất cả các lớp phải có trọng số là một. Mặt khác, nếu bạn chọnclass_weight:balanced, nó sẽ sử dụng các giá trị của y để tự động điều chỉnh trọng số.

15

decision_function_shape - ovo ',' ovr ', default =' ovr '

Tham số này sẽ quyết định liệu thuật toán có trả về ‘ovr’ (một so với phần còn lại) chức năng quyết định của hình dạng như tất cả các bộ phân loại khác, hoặc ban đầu ovo(một đối một) chức năng quyết định của libsvm.

16

break_ties - boolean, tùy chọn, mặc định = false

True - Dự đoán sẽ phá vỡ mối quan hệ theo các giá trị tin cậy của hàm quyết định

False - Dự đoán sẽ trả về lớp đầu tiên trong số các lớp bị ràng buộc.

Thuộc tính

Bảng theo dõi bao gồm các thuộc tính được sử dụng bởi sklearn.svm.SVC lớp học -

Sr.No Thuộc tính & Mô tả
1

support_ - dạng mảng, hình dạng = [n_SV]

Nó trả về các chỉ số của các vectơ hỗ trợ.

2

support_vectors_ - dạng mảng, hình dạng = [n_SV, n_features]

Nó trả về các vectơ hỗ trợ.

3

n_support_ - giống mảng, dtype = int32, shape = [n_class]

Nó đại diện cho số lượng các vectơ hỗ trợ cho mỗi lớp.

4

dual_coef_ - mảng, hình dạng = [n_class-1, n_SV]

Đây là hệ số của các vectơ hỗ trợ trong hàm quyết định.

5

coef_ - mảng, hình dạng = [n_class * (n_class-1) / 2, n_features]

Thuộc tính này, chỉ khả dụng trong trường hợp hạt nhân tuyến tính, cung cấp trọng số được gán cho các tính năng.

6

intercept_ - mảng, hình dạng = [n_class * (n_class-1) / 2]

Nó đại diện cho thuật ngữ độc lập (hằng số) trong chức năng quyết định.

7

fit_status_ - int

Đầu ra sẽ là 0 nếu nó được lắp đúng. Đầu ra sẽ là 1 nếu nó được lắp không chính xác.

số 8

classes_ - mảng hình dạng = [n_classes]

Nó đưa ra các nhãn của các lớp.

Implementation Example

Giống như các bộ phân loại khác, SVC cũng phải được trang bị hai mảng sau:

  • Một mảng Xgiữ các mẫu đào tạo. Nó có kích thước [n_samples, n_features].

  • Một mảng Ygiữ các giá trị đích tức là nhãn lớp cho các mẫu huấn luyện. Nó có kích thước [n_samples].

Sử dụng script Python sau sklearn.svm.SVC lớp học -

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import SVC
SVCClf = SVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
SVCClf.fit(X, y)

Output

SVC(C = 1.0, cache_size = 200, class_weight = None, coef0 = 0.0,
   decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
   max_iter = -1, probability = False, random_state = None, shrinking = False,
   tol = 0.001, verbose = False)

Example

Bây giờ, sau khi được trang bị, chúng ta có thể lấy vector trọng lượng với sự trợ giúp của tập lệnh python sau:

SVCClf.coef_

Output

array([[0.5, 0.5]])

Example

Tương tự, chúng ta có thể lấy giá trị của các thuộc tính khác như sau:

SVCClf.predict([[-0.5,-0.8]])

Output

array([1])

Example

SVCClf.n_support_

Output

array([1, 1])

Example

SVCClf.support_vectors_

Output

array(
   [
      [-1., -1.],
      [ 1., 1.]
   ]
)

Example

SVCClf.support_

Output

array([0, 2])

Example

SVCClf.intercept_

Output

array([-0.])

Example

SVCClf.fit_status_

Output

0

NuSVC

NuSVC là Phân loại Vectơ hỗ trợ Nu. Nó là một lớp khác được cung cấp bởi scikit-learning có thể thực hiện phân loại nhiều lớp. Nó giống như SVC nhưng NuSVC chấp nhận các bộ thông số hơi khác một chút. Tham số khác với SVC như sau:

  • nu - float, tùy chọn, mặc định = 0.5

Nó đại diện cho giới hạn trên của phần nhỏ lỗi đào tạo và giới hạn dưới của phần nhỏ của vectơ hỗ trợ. Giá trị của nó phải nằm trong khoảng (o, 1].

Phần còn lại của các tham số và thuộc tính giống như của SVC.

Ví dụ triển khai

Chúng ta có thể triển khai cùng một ví dụ bằng cách sử dụng sklearn.svm.NuSVC lớp cũng vậy.

import numpy as np
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])
from sklearn.svm import NuSVC
NuSVCClf = NuSVC(kernel = 'linear',gamma = 'scale', shrinking = False,)
NuSVCClf.fit(X, y)

Đầu ra

NuSVC(cache_size = 200, class_weight = None, coef0 = 0.0,
   decision_function_shape = 'ovr', degree = 3, gamma = 'scale', kernel = 'linear',
   max_iter = -1, nu = 0.5, probability = False, random_state = None,
   shrinking = False, tol = 0.001, verbose = False)

Chúng ta có thể lấy kết quả đầu ra của phần còn lại của các thuộc tính như trong trường hợp SVC.

LinearSVC

Đó là Phân loại véc tơ hỗ trợ tuyến tính. Nó tương tự như SVC có kernel = 'linear'. Sự khác biệt giữa chúng làLinearSVC được triển khai theo liblinear trong khi SVC được triển khai trong libsvm. Đó là lý doLinearSVClinh hoạt hơn trong việc lựa chọn hình phạt và chức năng thua lỗ. Nó cũng mở rộng quy mô tốt hơn với số lượng lớn mẫu.

Nếu chúng ta nói về các tham số và thuộc tính của nó thì nó không hỗ trợ ‘kernel’ vì nó được giả định là tuyến tính và nó cũng thiếu một số thuộc tính như support_, support_vectors_, n_support_, fit_status_ và, dual_coef_.

Tuy nhiên, nó hỗ trợ penaltyloss các thông số như sau -

  • penalty − string, L1 or L2(default = ‘L2’)

    Tham số này được sử dụng để xác định quy chuẩn (L1 hoặc L2) được sử dụng trong hình phạt (chính quy hóa).

  • loss − string, hinge, squared_hinge (default = squared_hinge)

    Nó đại diện cho hàm mất mát trong đó 'bản lề' là tổn thất SVM tiêu chuẩn và 'squared_hinge' là bình phương của tổn thất bản lề.

Ví dụ triển khai

Sử dụng script Python sau sklearn.svm.LinearSVC lớp học -

from sklearn.svm import LinearSVC
from sklearn.datasets import make_classification
X, y = make_classification(n_features = 4, random_state = 0)
LSVCClf = LinearSVC(dual = False, random_state = 0, penalty = 'l1',tol = 1e-5)
LSVCClf.fit(X, y)

Đầu ra

LinearSVC(C = 1.0, class_weight = None, dual = False, fit_intercept = True,
   intercept_scaling = 1, loss = 'squared_hinge', max_iter = 1000,
   multi_class = 'ovr', penalty = 'l1', random_state = 0, tol = 1e-05, verbose = 0)

Thí dụ

Bây giờ, sau khi được trang bị, mô hình có thể dự đoán các giá trị mới như sau:

LSVCClf.predict([[0,0,0,0]])

Đầu ra

[1]

Thí dụ

Đối với ví dụ trên, chúng ta có thể lấy vector trọng lượng với sự trợ giúp của tập lệnh python sau:

LSVCClf.coef_

Đầu ra

[[0. 0. 0.91214955 0.22630686]]

Thí dụ

Tương tự, chúng ta có thể lấy giá trị của intercept với sự trợ giúp của tập lệnh python sau:

LSVCClf.intercept_

Đầu ra

[0.26860518]

Hồi quy với SVM

Như đã thảo luận trước đó, SVM được sử dụng cho cả vấn đề phân loại và hồi quy. Phương pháp phân loại véc tơ hỗ trợ (SVC) của Scikit-learning cũng có thể được mở rộng để giải các bài toán hồi quy. Phương pháp mở rộng đó được gọi là hồi quy vectơ hỗ trợ (SVR).

Điểm giống nhau cơ bản giữa SVM và SVR

Mô hình do SVC tạo ra chỉ phụ thuộc vào một tập con dữ liệu huấn luyện. Tại sao? Bởi vì hàm chi phí để xây dựng mô hình không quan tâm đến các điểm dữ liệu huấn luyện nằm ngoài lề.

Trong khi đó, mô hình được tạo ra bởi SVR (Hồi quy vectơ hỗ trợ) cũng chỉ phụ thuộc vào một tập con của dữ liệu huấn luyện. Tại sao? Bởi vì hàm chi phí để xây dựng mô hình bỏ qua bất kỳ điểm dữ liệu huấn luyện nào gần với dự đoán của mô hình.

Scikit-learning cung cấp ba lớp cụ thể là SVR, NuSVR and LinearSVR như ba cách triển khai khác nhau của SVR.

SVR

Nó là hồi quy vectơ hỗ trợ Epsilon mà việc triển khai dựa trên libsvm. Đối lập vớiSVC Có hai tham số miễn phí trong mô hình là ‘C’‘epsilon’.

  • epsilon - float, tùy chọn, mặc định = 0,1

Nó đại diện cho epsilon trong mô hình epsilon-SVR và chỉ định ống epsilon trong đó không có hình phạt nào được liên kết trong chức năng mất tập luyện với các điểm được dự đoán trong khoảng cách epsilon so với giá trị thực.

Phần còn lại của các tham số và thuộc tính tương tự như chúng tôi đã sử dụng trong SVC.

Ví dụ triển khai

Sử dụng script Python sau sklearn.svm.SVR lớp học -

from sklearn import svm
X = [[1, 1], [2, 2]]
y = [1, 2]
SVRReg = svm.SVR(kernel = ’linear’, gamma = ’auto’)
SVRReg.fit(X, y)

Đầu ra

SVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, epsilon = 0.1, gamma = 'auto',
   kernel = 'linear', max_iter = -1, shrinking = True, tol = 0.001, verbose = False)

Thí dụ

Bây giờ, sau khi được trang bị, chúng ta có thể lấy vector trọng lượng với sự trợ giúp của tập lệnh python sau:

SVRReg.coef_

Đầu ra

array([[0.4, 0.4]])

Thí dụ

Tương tự, chúng ta có thể lấy giá trị của các thuộc tính khác như sau:

SVRReg.predict([[1,1]])

Đầu ra

array([1.1])

Tương tự, chúng ta cũng có thể lấy giá trị của các thuộc tính khác.

NuSVR

NuSVR là hồi quy vectơ hỗ trợ Nu. Nó giống như NuSVC, nhưng NuSVR sử dụng một tham sốnuđể kiểm soát số lượng vectơ hỗ trợ. Và hơn nữa, không giống như NuSVC, nơinu thay thế tham số C, ở đây nó thay thế epsilon.

Ví dụ triển khai

Sử dụng script Python sau sklearn.svm.SVR lớp học -

from sklearn.svm import NuSVR
import numpy as np
n_samples, n_features = 20, 15
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
NuSVRReg = NuSVR(kernel = 'linear', gamma = 'auto',C = 1.0, nu = 0.1)^M
NuSVRReg.fit(X, y)

Đầu ra

NuSVR(C = 1.0, cache_size = 200, coef0 = 0.0, degree = 3, gamma = 'auto',
   kernel = 'linear', max_iter = -1, nu = 0.1, shrinking = True, tol = 0.001,
   verbose = False)

Thí dụ

Bây giờ, sau khi được trang bị, chúng ta có thể lấy vector trọng lượng với sự trợ giúp của tập lệnh python sau:

NuSVRReg.coef_

Đầu ra

array(
   [
      [-0.14904483, 0.04596145, 0.22605216, -0.08125403, 0.06564533,
      0.01104285, 0.04068767, 0.2918337 , -0.13473211, 0.36006765,
      -0.2185713 , -0.31836476, -0.03048429, 0.16102126, -0.29317051]
   ]
)

Tương tự, chúng ta cũng có thể lấy giá trị của các thuộc tính khác.

Tuyến tínhSVR

Nó là hồi quy vectơ hỗ trợ tuyến tính. Nó tương tự như SVR có kernel = 'linear'. Sự khác biệt giữa chúng làLinearSVR được thực hiện trong điều kiện liblinear, trong khi SVC được triển khai trong libsvm. Đó là lý doLinearSVRlinh hoạt hơn trong việc lựa chọn hình phạt và chức năng thua lỗ. Nó cũng mở rộng quy mô tốt hơn với số lượng lớn mẫu.

Nếu chúng ta nói về các tham số và thuộc tính của nó thì nó không hỗ trợ ‘kernel’ vì nó được giả định là tuyến tính và nó cũng thiếu một số thuộc tính như support_, support_vectors_, n_support_, fit_status_ và, dual_coef_.

Tuy nhiên, nó hỗ trợ các thông số 'mất mát' như sau:

  • loss - string, option, default = 'epsilon_insensitive'

Nó đại diện cho hàm mất mát trong đó tổn thất epsilon_insensitive là tổn thất L1 và tổn thất epsilon không nhạy cảm bình phương là tổn thất L2.

Ví dụ triển khai

Sử dụng script Python sau sklearn.svm.LinearSVR lớp học -

from sklearn.svm import LinearSVR
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 4, random_state = 0)
LSVRReg = LinearSVR(dual = False, random_state = 0,
loss = 'squared_epsilon_insensitive',tol = 1e-5)
LSVRReg.fit(X, y)

Đầu ra

LinearSVR(
   C=1.0, dual=False, epsilon=0.0, fit_intercept=True,
   intercept_scaling=1.0, loss='squared_epsilon_insensitive',
   max_iter=1000, random_state=0, tol=1e-05, verbose=0
)

Thí dụ

Bây giờ, sau khi được trang bị, mô hình có thể dự đoán các giá trị mới như sau:

LSRReg.predict([[0,0,0,0]])

Đầu ra

array([-0.01041416])

Thí dụ

Đối với ví dụ trên, chúng ta có thể lấy vector trọng lượng với sự trợ giúp của tập lệnh python sau:

LSRReg.coef_

Đầu ra

array([20.47354746, 34.08619401, 67.23189022, 87.47017787])

Thí dụ

Tương tự, chúng ta có thể lấy giá trị của intercept với sự trợ giúp của tập lệnh python sau:

LSRReg.intercept_

Đầu ra

array([-0.01041416])