【機器學習】支持向量機(SVM)


  感謝中國人民大學胡鶴老師,課程深入淺出,非常好

一、關於SVM

可以做線性分類、非線性分類、線性回歸等,相比邏輯回歸、線性回歸、決策樹等模型(非神經網絡)功效最好

傳統線性分類:選出兩堆數據的質心,並做中垂線(准確性低)——上圖左

SVM:擬合的不是一條線,而是兩條平行線,且這兩條平行線寬度盡量大,主要關注距離車道近的邊緣數據點(支撐向量support vector),即large margin classification——上圖右

 

使用前,需要對數據集做一個scaling,以做出更好的決策邊界(decision boundary)

但需要容忍一些點跨越分割界限,提高泛化性,即softmax classification

在sklearn中,有一個超參數c,控制模型復雜度,c越大,容忍度越小,c越小,容忍度越高。c添加一個新的正則量,可以控制SVM泛化能力,防止過擬合。(一般使用gradsearch)

SVM特有損失函數Hinge Loss

二、LinearSVC(liblinear庫,不支持kernel函數,但是相對簡單,復雜度O(m*n))

同SVM特點吻合,僅考慮落在分類面附近和越過分類面到對方領域的向量,給於一個線性懲罰(l1),或者平方項(l2)

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X = iris["data"][:,(2,3)]
y = (iris["target"]==2).astype(np.float64)
svm_clf = Pipeline((
    ("scaler",StandardScaler()),
    ("Linear_svc",LinearSVC(C=1,loss="hinge")),
    ))
svm_clf.fit(X,y)
print(svm_clf.predit([[5.5,1.7]]))

三、對於nonlinear數據的分類

  有兩種方法,構造高維特征,構造相似度特征

1. 使用高維空間特征(即kernel的思想),將數據平方、三次方。。映射到高維空間上

 

from sklearn.preprocessing import PolynomialFeatures
polynomial_svm_clf = Pipeline((
     ("poly_features", PolynomialFeatures(degree=3)),
     ("scaler", StandardScaler()),
     ("svm_clf", LinearSVC(C=10, loss="hinge"))
   ))
polynomial_svm_clf.fit(X, y)

 

這種kernel trick可以極大地簡化模型,不需要顯示的處理高維特征,可以計算出比較復雜的情況

但模型復雜度越強,過擬合風險越大

SVC(基於libsvm庫,支持kernel函數,但是相對復雜,不能用太大規模數據,復雜度O(m^2 *n)-O(m^3 *n))

 可以直接使用SVC(coef0:高次與低次權重)

from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline((
      ("scaler", StandardScaler()),
      ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
    ))
poly_kernel_svm_clf.fit(X, y)

2. 添加相似度特征(similarity features)

例如,下圖分別創造x1,x2兩點的高斯分布,再創建新的坐標系統,計算高斯距離(Gaussian RBF Kernel徑向基函數)

gamma(γ)控制高斯曲線形狀胖瘦,數據點之間的距離發揮更強作用

rbf_kernel_svm_clf = Pipeline((
      ("scaler", StandardScaler()),
      ("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
   ))
rbf_kernel_svm_clf.fit(X, y)

如下是不同gamma和C的取值影響 

 

 SGDClassifier(支持海量數據,時間復雜度O(m*n))

 

四、SVM Regression(SVM回歸)

盡量讓所用instance都fit到車道上,車道寬度使用超參數控制,越大越寬

使用LinearSVR

from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)

 使用SVR

from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

 五、數學原理:

 

w通過控制h傾斜的角度,控制車道的寬度,越小越寬,並且使得違反分類的數據點更少

1. hard margin linear SVM

優化目標:,並且保證

2. soft margin linear SVM

增加一個新的松弛變量(slack variable),起正則化作用

優化目標:,並且保證

放寬條件,即使有個別實例違反條件,也懲罰不大

3. LinearSVM

使用拉格朗日乘子法進行計算,α是松弛項后的結果

計算結果:取平均值

KernelizedSVM

由於

 故可先在低位空間里做點積計算,再映射到高維空間中。

下列公式表示,在高維空間計算可用kernel trick方式,直接在低維上面計算

幾個常見的kernal及其function

 


免責聲明!

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



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