支援向量機——sklearn 實現支援向量機(SVM)
阿新 • • 發佈:2019-01-31
《Python machine learning》書籍學習~~~
支援向量機的數學模型稍後補上,先來講一下sklearn中的實現。
Support Vector Machine(SVM) ,優化目標與感知機相反,感知機是實現錯誤的最小優化;SVM實現邊緣最大優化。
邊緣(margin):兩個分離差超平面之間的距離
支援向量(support vector):距離分割超平面最近的訓練樣本點
SVM的數學模型稍後補上。
SVC:SVM的一種型別,用於分類;SVR用於迴歸。
【sklearn庫實現SVM】
呼叫sklearn.svm庫中的SVC類。其中C引數是懲罰鬆弛變數。
C值越大,表示對誤分類的懲罰增大,趨向於對於訓練集全部正確分類,泛化能力弱。
C值越小,表示可以容忍錯誤分類,泛化能力強。
from sklearn.svm import SVC svm = SVC(kernel = 'linear', C = 1.0, random_state = 1) svm.fit(X_combined_std, y_combined) plot_decision_regions(X = X_combined_std, y = y_combined, classifier = svm, test_idx = range(105,150)) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.legend(loc='upper left') plt.tight_layout() #plt.savefig('images/03_06.png', dpi=300) plt.show()
【解決極大資料集的 SGDClassifier】
perceptron ,LogisticRegression來自於liblinear庫,svc來自於libsvm庫,這兩個庫對於大量的線性分類器允許進行極其快速的訓練。 但是如果訓練資料極其大, sklearn庫提供了SGDclassifier 類,即stochastic gradient descent classifier(隨機梯度遞減)。可以分別用perceptron,LR,SVM初始化SGDClassifier,loss引數表示損失函式選項,可選擇不同分類器的損失函式。
例如:
from sklearn.linear_model import SGDClassifier ppn = SGDClassifier(loss = 'perceptron') lr = SGDClassifier(loss = 'log')#LogisticRegression svm = SGDClassifier(loss = 'hinge')
【kernel methods for linearly inseparable data】
#利用異或構造線性不可分資料集#inlinear dataset
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
X_xor = np.random.randn(200, 2)
#logical_xor(X1,X2)函式,返回 x1邏輯異或x2的結果
y_xor = np.logical_xor(X_xor[:, 0] > 0 ,
X_xor[:, 1] > 0)
y_xor = np.where(y_xor,1,-1)
plt.scatter(X_xor[y_xor == 1, 0],
X_xor[y_xor == 1, 1],
c = 'b', marker = 'x',
label = '1')
plt.scatter(X_xor[y_xor == -1, 0],
X_xor[y_xor == -1, 1],
c = 'r', marker = 's',
label = '-1')
plt.xlim([-3, 3])
plt.ylim([-3, 3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()
#利用kernel methods 分類資料集kernel methods 即將二維非線性資料轉換為三維可分資料集,利用下列φ函式
定義kernel function為:
其中比較常用的為radial basic function (RBF)也稱為高斯kernel(Gaussian kenel)
常寫作,其中。
svc = SVC(kernel ='rbf', C = 10.0, gamma =0.1, random_state = 1 )
svc.fit(X_xor, y_xor)
plot_decision_regions(X= X_xor, y = y_xor, classifier = svc)
plt.legend(loc = 'best')
plt.show()
其中gamma引數越大,分離超平面越嚴格,但是泛化能力越弱。所以gamma函式的調整是調整泛華能力的關鍵。