SVM-支持向量機(二)非線性SVM分類


非線性SVM分類

盡管SVM分類器非常高效,並且在很多場景下都非常實用。但是很多數據集並不是可以線性可分的。一個處理非線性數據集的方法是增加更多的特征,例如多項式特征。在某些情況下,這樣可以讓數據集變成線性可分。下面我們看看下圖左邊那個圖:

 

它展示了一個簡單的數據集,只有一個特征x1,這個數據集一看就知道不是線性可分。但是如果我們增加一個特征x2 = (x1)2,則這個2維數據集便成為了一個完美的線性可分。

使用sk-learn實現這個功能時,我們可以創建一個Pipeline,包含一個PolynomialFeatures transformer,然后緊接着一個StandardScaler以及一個LinearSVC。下面我們使用moons數據集測試一下,這個是一個用於二元分類的數據集,數據點以交錯半圓的形狀分布,如下圖所示:

 

 

我們可以使用make_moons() 方法構造這個數據集:

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
X, y
= make_moons(n_samples=100, noise=0.15, random_state=42) def plot_dataset(X, y, axes): plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs") plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^") plt.axis(axes) plt.grid(True, which='both') plt.xlabel(r"$x_1$", fontsize=20) plt.ylabel(r"$x_2$", fontsize=20, rotation=0) plot_dataset(X, y, [-1.5, 2.5, -1, 1.5]) plt.show()

 

然后訓練即可:

polynomial_svm_clf = Pipeline([
    ('poly_features', PolynomialFeatures(degree=3)),
    ('scaler', StandardScaler()),
    ('svm_clf', LinearSVC(C=10, loss='hinge'))
])
 
polynomial_svm_clf.fit(X, y)

 

多項式核(Polynomial Kernel

增加多項式特征的辦法易於實現,並且非常適用於所有的機器學習算法(不僅僅是SVM)。但是如果多項式的次數較低的話,則無法處理非常復雜的數據集;而如果太高的話,會創建出非常多的特征,讓模型速度變慢。

不過在使用SVM時,我們可以使用一個非常神奇的數學技巧,稱為核方法(kernel trick)。它可以在不添加額外的多項式屬性的情況下,實現與之一樣的效果。這個方法在SVC類中實現,下面我們還是在moons 數據集上進行測試:

from sklearn.svm import SVC

poly_kernel_svm_clf = Pipeline([
    ('scalar', StandardScaler()),
    ('svm_clf', SVC(kernel='poly', degree=3, coef0=1, C=5))
])

poly_kernel_svm_clf.fit(X, y)

 

上面的代碼會使用一個3階多項式核訓練一個SVM分類器,如下面的左圖所示:

 

 

右圖是另一個SVM分類器,使用的是10階多項式核。很明顯,如果模型存在過擬合的現象,則可以減少多項式的階。反之,如果欠擬合,則可以嘗試增加它的階。超參數coef0 控制的是多項式特征如何影響模型。

一個比較常見的搜索合適的超參數的方法是使用網格搜索(grid search)。一般使用一個較大的網格搜索范圍快速搜索,然后用一個更精細的網格搜索在最佳值附近再嘗試。最好是能了解每個超參數是做什么,這樣有助於設置超參數的搜索空間。

 

增加相似特征

另外一個處理非線性問題的技巧是增加一些特定的特征,這些特征由一個相似函數(similarity function)計算所得,這個相似函數衡量的是:對於每條數據,它與一個特定地標(landmark)的相似程度。舉個例子,我們看一個之前討論過的一維的數據集,給它加上兩個地標(landmark)x1=-2以及x1=1(如下左圖)。下面我們定義一個相似函數(similarity function),Gaussian Radial Basis Function(RBF),並指定γ = 0.3 (如下公式):

Gaussian RBF公式

 

 

 

這個函數的圖像是一個鍾形,取值范圍從0 到 1。越接近於0,離landmark越遠;越接近於1,離landmark越近,等於1時就是在landmark處。現在我們可以開始計算新特征,例如,我們可以看看x1=-1的那個實例:它與第一個地標的距離是1,與第二個地標的距離是2。所以它的新特征是x2=exp(-0.3 x 12) ≈ 0.74,x3=exp(-0.3 x 22) ≈ 0.30(這里x1代表的是左圖中的橫坐標取值x1,x2代表的是右圖中橫坐標取值x2,x3代表的是右圖中縱坐標取值x3)。上圖中的右圖顯示的是轉換后的數據集(剔除掉原先的特征),可以很明顯地看到,現在是線性可分的。

大家可能會好奇如何選擇landmark。最簡單的辦法是:為數據集中的每條數據的位置創建一個landmark。這個會創建出非常多的維度,並也因此可以讓轉換后訓練集是線性可分的概率增加。缺點是,如果一個訓練集有m條數據n個特征,則在轉換后會有m條數據與m個特征(假設拋棄之前的特征)。如果訓練集非常大的話,則會有數量非常大的特征數量。

 

高斯(GaussianRBF

與多項式特征的方法一樣,相似特征(similarity features)的方法在所有機器學習算法中都非常有用。但是它在計算所有的額外特征時,計算可能會非常昂貴,特別是在大的訓練集上。不過,在SVM中,使用核方法非常好的一點是:它可以在不增加這些similarity features 的情況下,達到與增加這些特征相似的結果。下面我們使用SVC類試一下Gaussian RBF核:

rbf_kernel_svm_clf = Pipeline([
    ('scalar', StandardScaler()),
    ('svm_clf', SVC(kernel='rbf', gamma=5, C=0.001))
])

rbf_kernel_svm_clf.fit(X, y)

 

這個模型如下圖中左下角的圖所示:

 

其他圖代表的是使用不同的超參數 gamma(γ)與C訓練出來的模型。增加gamma值可以讓鍾型曲線更窄(如左邊上下兩個圖所示),並最終導致每個數據實例的影響范圍更小:決策邊界最終變的更不規則,更貼近各個實例。與之相反,較小的gamma值會讓鍾型曲線更寬,所以實例有更大的影響范圍,並最終導致決策邊界更平滑。所以gamma值的作用類似一個正則化超參數:如果模型有過擬合,則應該減少此值;而如果有欠擬合,則應該增加此值(與超參數c類似)。

當然也存在其他核,但是使用的非常少。例如,有些核是經常僅用於特定的數據結構。String Kernel 有時候用於分類文本文檔或是DNA序列(例如,使用string subsequence kernel或者基於Levenshtein distance 的kernel)。

有這么多的核可供使用,到底如何選擇使用哪個呢?根據經驗,務必首先嘗試線性核(linear kernel,之前提到過LinearSVC比SVC(kernel=’linear’)速度快地多),特別是訓練集非常大,或者是有特別多特征的情況下。如果訓練集並不是很大,我們也可以嘗試Gaussian RBF kernel,它在大多數情況下否非常好用。如果我們還有充足的時間以及計算資源的話,我們也可以試驗性地嘗試幾個其他kernel,使用交叉驗證與網格搜索,特別是在有某些kernel是特別適合這個訓練集的時候。

 

計算復雜度

LinearSVC類基於的是liblinear庫,它為線性SVM實現了一個優化的算法。它並不支持核方法,但是隨着訓練數據與特征數目的增加,它基本是線性擴展的,它的訓練時間復雜度大約是O(m x n)。

如果對模型精確度要求很高的話,算法會執行的時間更長。這個由tolerance超參數ϵ(在sk-learn中稱為tol)決定。在大部分分類問題中,默認的tolerance即可。

SVC類基於的是libsvm庫,它實現了一個支持核方法的算法,訓練時間復雜度一般在O(m2 × n) 與 O(m3 × n) 之間。也就是說,在訓練數據條目非常大時(例如幾十萬條),它的速度會下降到非常慢。所以這個算法特別適用於問題復雜、但是訓練數據集為小型數據集或中型數據集時。不過它對特征數目的擴展良好,特別是對稀疏特征(sparse features,例如,每條數據都幾乎沒有非0特征)。在這種情況下,這個算法會根據大約每條數據中平均非0特征數進行擴展。下圖對比了sk-learn中的SVM 分類類:

之后我們會繼續介紹 SVM 回歸。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM