1. 程式人生 > >SVM演算法例項解析及應用

SVM演算法例項解析及應用

SVM簡介

Support Vector Machine (SVM) 是一個監督學習演算法,既可以用於分類(主要)也可以用於迴歸問題。SVM演算法中,我們
將資料繪製在n維空間中(n代表資料的特徵數),然後查詢可以將資料分成兩類的超平面。支援向量指的是觀察的樣本在n為空間中的座標,SVM是將樣本分成兩類的最佳超平面。

SVM的作用機制

上面的簡介告訴我們的是SVM是通過超平面將兩類樣本分開,本部分主要講解如何將兩類樣本分開。以下舉幾個粒子:
情境1: 更好的分開兩類樣本的超平面,如下圖中的平面B
這裡寫圖片描述

情境2: 選取能最大化支援向量和超平面距離的超平面,如下圖的平面C(原因是魯棒性更強)
這裡寫圖片描述


情境3: 在情境1和情境2矛盾時,SVM會優先選擇分類正確,即SVM偏好分類正確大於更大的margin,如下圖SVM會選擇超平面A
這裡寫圖片描述

情境4: 當某類存在異常值無法通過線性超平面將兩類樣本區分開時,SVM可以通過忽略異常值而尋找到超平面(soSVM對異常值具有魯棒性)
這裡寫圖片描述

情境5: 某些情況下,SVM並不能找到一個線性超平面去劃分兩個類,如下圖所示:
這裡寫圖片描述
SVM的解決方案是:增加額外的特徵,比如增加z=x2+y2作為一個新的特徵,增加特徵後的資料如下圖所示:
這裡寫圖片描述
以上的轉變基於以下兩點:
1. 所有的Z值都是正數;
2. 在原始的圖中,紅色點離x和y軸更近,z值相對較小;星相對較遠會有較大的z值。

在兩類樣本中找一個線性超平面較為簡單,但是我們是否需要手動加入類似於z的特徵從而獲得線性超平面,SVM有一個j技術叫核函式,核函式具有將低維資料轉化成高維資料的作用,從而具有將線性不可分問題轉化為線性可分問題的作用。

SVM應用

如果用Python的話,scikit-learn是應用機器學習演算法最廣泛的庫,SVM演算法也可以通過它加以應用。

from sklearn import svm
# Create SVM classification object 
model = svm.svc(kernel='linear', c=1, gamma=1) 
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

SVM調參

首先看一下引數列表:

sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=0.0, coef0=0.0, shrinking=True, probability=False,tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, random_state=None)

其中最重要的三個引數為: “kernel”, “gamma” and “C”。
1. kernel: 可以選擇的kernel有 “linear”, “rbf”(預設),”poly” and others。其中“rbf”和“poly”適用於非線性超平面。下面舉例說明線性核和非線性核在雙特徵鳶尾花資料上的表現。
+++ 線性kernel

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
C = 1.0 # SVM regularization parameter
svc = svm.SVC(kernel='linear', C=1,gamma=0).fit(X, y)

# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))

plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()

這裡寫圖片描述

+++ 非線性kernel:rbf
這裡寫圖片描述

黨特徵數較大(>1000)比較建議使用線性的kernel,因為在高維空間中,資料更容易線性可分,也可用使用RBF但需要同時做交叉驗證以防止過擬合問題。

2.gamma:當Kernel一定時,gamma值越大,SVM就會傾向於越準確的劃分每一個訓練集裡的資料,這會導致泛化誤差較大和過擬合問題,如下圖所示:
這裡寫圖片描述

3.C: 錯誤項的懲罰引數C,用於平衡(trade off)控制平滑決策邊界和訓練資料分類的準確性。
這裡寫圖片描述

具體的引數的調節我們應該通過交叉驗證的結果進行調節。

SVM的優缺點

優點:
1. 對於clear margin 分類問題效果好;
2. 對高維分類問題效果好;
3. 當維度高於樣本數的時候,SVM較為有效;
4. 因為最終只使用訓練集中的支援向量,所以節約記憶體

缺點
1. 當資料量較大時,訓練時間會較長;
2. 當資料集的噪音過多時,表現不好;
3. SVM不直接提供結果的概率估計,它在計算時直接使用5倍交叉驗證。