[ML] 機器學習技法:第四講 soft-margin SVM

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第四講 soft-margin SVM (support vector machine)

建議的 Library


soft-margin SVM primal

minb,w,ξ  12wTw+Cn=1Nξnsubject to  yn(wTxn+b)1ξn and ξn0 for all n QP of d~+1+N 個變數,2N 個條件
第一講得知
minb,w  12wTwsubject to  yn(wTzn+b)1 for all nPocket 得知,希望得到最小的錯誤總數
minb,wn=1N[ynsign(wTzn+b)] 將兩者合併,並加入 C 參數,控制 trade-off
看是以 large margin 為主,還是 noise tolerance
minb,w  12wTw+Cn=1N[ynsign(wTzn+b)]s.t.  yn(wTzn+b)1 for correct n  yn(wTzn+b) for incorrect n 可再簡化為
minb,w  12wTw+Cn=1N[ynsign(wTzn+b)]s.t.  yn(wTzn+b)1[ynsign(wTzn+b)] for all n [ynsign(wTzn+b)] 不是 linear,所以不再是 QP
而且也無法分辨錯誤的距離大小
若改成記錄違反 margin 的距離呢?並用此取代計數錯誤的數目
yn=±1,距離可為 margin(b,w)=1wyn(wTxn+b)
可以以後面那項為代表,以 ξn 表示離 yn(wTzn+b)=1 有多遠,可得
minb,w,ξ  12wTw+Cn=1Nξns.t.  yn(wTzn+b)1ξn and ξn0 for all nwb,共 d~+1 個變數,再加上 Nξn
並有兩個絛件,各有 N

soft-margin SVM dual

minα   12n=1Nm=1NαnαmynymznTzmn=1Nαnsubject to   n=1Nynαn=0;   Cαn0,for n=1,2,,Nimplicitly   w=n=1Nαnynzn;   βn=Cαn,for n=1,2,,N QP of N 個變數,2N+1 個條件
利用 Lagrange multipliers,隱藏限制條件,此處將 λnαn & βn 取代
L(b,w,ξ,α,β)=12wTw+Cn=1Nξn+n=1Nαn(1ξnyn(wTzn+b))+n=1Nβn(ξn)maxall αn0,βn0 L(b,w,ξ,α,β) 會發現
  • (b,w,ξ) 違反限制條件時,會導致
    •  1ξnyn(wTzn+b)>0
      又因 L(b,w,ξ,α,β) 針對 αn 取 max 的緣故,αn 越大越好
    •  ξn>0
      又因 L(b,w,ξ,α,β) 針對 βn 取 max 的緣故,βn 越大越好
    • 使得 L(b,w,ξ,α,β)
  • (b,w,ξ) 符合限制條件時,會導致
    • 1ξnyn(wTzn+b)0
      又因 L(b,w,ξ,α,β) 針對 αn 取 max 的緣故,αn1ξnyn(wTzn+b) 兩者至少有一個必須為 0
    •  ξn0
      又因 L(b,w,ξ,α,β) 針對 βn 取 max 的緣故,βnξn 兩者至少有一個必須為 0
    • 使得 L(b,w,ξ,α,β)12wTw
故此式子與原本的求解一樣,如下,只是限制條件被隱藏到 max 中
SVMminb,w,ξ(maxall αn0,βn0 L(b,w,ξ,α,β))=minb,w,ξ( if violate;12wTw if feasible)
此時 (b,w,ξ) 仍在式子最外面,如何把它跟裡面的 αn,βn 交換呢?
這樣才能初步得到 2N 個變數的式子
任取一個 α,β with αn0,βn0,因取 max 一定比任意還大,可得下式
minb,w,ξ(maxall αn0,βn0 L(b,w,ξ,α,β))minb,w,ξ L(b,w,ξ,α,β)
那如果對 α0,β0 取 max,也不影響此等式,如下
minb,w,ξ(maxall αn0,βn0 L(b,w,ξ,α,β))maxall αn0,βn0(minb,w,ξ L(b,w,ξ,α,β))α=α,β=βmaxall αn0,βn0(minb,w,ξ L(b,w,ξ,α,β))Lagrange dual problem
比較直覺的想法,就像是「從最大的一群中取最小」一定 「從最小的一群中取最大」
minb,w,ξ(maxall αn0,βn0 L(b,w,ξ,α,β))original(primal)) SVMmaxall αn0,βn0(minb,w,ξ L(b,w,ξ,α,β))Lagrange dual 目前的關係稱作 weak duality

但這還不夠,最好是 = strong duality,才能初步得到 2N 個變數的式子
幸運的是,在 QP 中,只要滿足以下條件,便是 strong duality
  • convex primal (原來的問題為 convex)
  • feasible primal (原來的問題有解的,也就是線性可分)
  • linear constraints (限制條件為線性的)
對於 SVM 滿足這些條件並不困難,故解以下的式子,如同解原本的式子
maxall αn0,βn0(minb,w,ξ 12wTw+Cn=1Nξn+n=1Nαn(1ξnyn(wTzn+b))+n=1Nβn(ξn)L(b,w,ξ,α,β))
但如何把內部的 (b,w,ξ) 拿掉呢?
內部的問題,當最佳化時,必定符合
L(b,w,ξ,α,β)b=0=n=1Nαnynn=1Nαnyn=0L(b,w,ξ,α,β)w=0=wn=1Nαnynznw=n=1NαnynznL(b,w,ξ,α,β)ξn=0=Cαnβnβn=Cαn 從以上的這些條件,可得
dual=maxall αn0,βn0(minb,w,ξ 12wTw+Cn=1Nξn+n=1Nαn(1ξnyn(wTzn+b))+n=1Nβn(ξn))=maxall αn0,βn0(minb,w,ξ 12wTw+Cn=1Nξn+n=1Nαnξn+n=1Nαn(1yn(wTzn+b))+n=1Nβn(ξn))=maxall αn0,βn0(minb,w,ξ 12wTw+n=1N(Cαnβn)ξn+n=1Nαn(1yn(wTzn+b)))[0=Cαnβn]=maxall αn0,βn0,βn=Cαn(minb,w,ξ 12wTw+n=1Nαn(1yn(wTzn+b)))[βn0αnC]=maxall Cαn0, βn=Cαn(minb,w,ξ 12wTw+n=1Nαn(1yn(wTzn+b)))=maxall Cαn0, βn=Cαn(minb,w,ξ  12wTw+n=1Nαn(1ynwTzn)n=1Nαnynb)[n=1Nαnyn=0]=maxall Cαn0, βn=Cαn, n=1Nαnyn=0(minb,w  12wTw+n=1Nαn(1ynwTzn))=maxall Cαn0, βn=Cαn, n=1Nαnyn=0(minb,w,ξ  12wTw+n=1Nαnn=1NαnynwTzn)=maxall Cαn0, βn=Cαn, n=1Nαnyn=0(minb,w,ξ  12wTw+n=1NαnwTn=1Nαnynzn)[w=n=1Nαnynzn]=maxall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w,ξ  12wTw+n=1NαnwTw)=maxall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w,ξ  12wTw+n=1Nαn)=maxall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn(minb,w,ξ  12n=1Nαnynzn2+n=1Nαn)[no b,w,ξ remove min]=maxall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nαnynzn2+n=1Nαn=minall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nαnynzn2n=1Nαn=minall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1NαnynznT(m=1Nαmymzm)n=1Nαn=minall Cαn0, βn=Cαn, n=1Nαnyn=0, w=n=1Nαnynzn  12n=1Nm=1NαnαmynymznTzmn=1Nαn
將限制條件移出
  • w=n=1Nαnynzn 只是求 w 並不限制 α
  • βn=Cαn 只是求 βn 並不限制 α
可得
minα   12n=1Nm=1NαnαmynymznTzmn=1Nαnsubject to   n=1Nynαn=0;   Cαn0,for n=1,2,,Nimplicitly   w=n=1Nαnynzn;   βn=Cαn,for n=1,2,,NαN 個變數
限制條件 αn2N 個,加上 n=1Nynαn=0,共 2N+1
與 Hard margin 只差在 αn 有上限限制 C

Kernel soft-margin SVM

b 的求解,必須為 free SV,極少數若無 free SV 則需滿足 KKT 條件(與 hard-margin 略有不同)
xn 可用 zn 取代,延伸至更高維度的轉換
任意 αn>0,則 1ξnyn(wTzn+b)=0 (by KKT)
0=1ξnyn(wTzn+b)yn(wTzn+b)=1ξnynb=1ξnynwTznb=1ξnynwTznynif yn=±1b=ynynξnwTznξn 來自 bb 又來自 ξn,無法求解
利用另一條件,任意 βn=Cαn>0,則 ξn=0 (by KKT)
故當 Cαn>0αn<C,則 ξn=0 同時滿足兩個條件的為 free SV,可得
b=ynwTzs=ynn=1NαnynznTzs=ynn=1NαnynK(zn,zs)=ynSV indices nαnynK(zn,zs)
仍會有 overfit 的風險,需小心選取 (γ,C)

αn 的意義

兩組 complementary slackness
αn(1ξnyn(wTzn+b))=0(Cαn)ξn=0
  •  αn=0,ξn=0
    • non SV
    • 可能遠離邊界或剛好在邊界上
  •  C>αn>0,ξn=0
    • free SV 
    • 剛好在邊界上
  •  αn=C,ξn=1yn(wTzn+b) 即是違反的值
    • bounded SV 
    • 違反或剛好在邊界上
  • 可視情況用在資料的解析上,何者有幫助、何者無幫助、何者可能有 noise

Model Selection

利用 validation 選擇合適的參數
橫軸為 C,縱軸為 γEcv 對於 SVM 非常常用
Eloocv#SVN N 為資料個數
假設擁有 N 個資料 (x1,y1),(x1,y1),,(xN,yN)
當選擇的資料 (xn,yn),其對應的 αn=0,即是非 SV
也就是說即使被挑去做 validation 也不影響最佳化結果
而 non-SV 分類必為正確,故其 enonSV=0
錯誤的定義是跟 0 的差值,畢竟對於 sign 而言,只要大過 0 或小過 0 即可
所以此時的 gn 未取 sign,而放縮過的 wTzn+b=±1(yn=±1)
eSV 不是 0,就是 1,故 eSV1
所以 Eloocv#SVN
下圖為 SV 的個數,但可看出並無法用來挑選最佳 model
因上面的式子只是表達其錯誤上限,實際上的錯誤還是未知
實際上是用來排除不合理的 model,再進行 Ecv 的計算

程式碼

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import svm
  4. from sklearn.model_selection import cross_val_score
  5.  
  6. # 訓練資料
  7. X = np.c_[(.4, -.7),
  8. (-1.5, -1),
  9. (-1.4, -.9),
  10. (-1.3, -1.2),
  11. (-1.1, -.2),
  12. (-1.2, -.4),
  13. (-.5, 1.2),
  14. (-1.5, 2.1),
  15. (1, 1),
  16. # --
  17. (1.3, .8),
  18. (1.2, .5),
  19. (.2, -2),
  20. (.5, -2.4),
  21. (.2, -2.3),
  22. (0, -2.7),
  23. (1.3, 2.1)].T
  24. Y = np.r_[[0] * 8 + [1] * 8]
  25.  
  26. # C 越大表示越無法容忍錯誤
  27. C = 1
  28. # fit 表示訓練
  29. # x^Tx'
  30. g_svm_linear = svm.SVC(kernel='linear', C=C).fit(X, Y)
  31. # (5+10x^Tx')^3
  32. g_svm_poly = svm.SVC(kernel='poly', degree=3, coef0=5, gamma=10, C=C).fit(X, Y)
  33. # exp(-2|x-x'|^2)
  34. g_svm_rbf = svm.SVC(kernel='rbf', gamma=2, C=C).fit(X, Y)
  35.  
  36. # title for the plots
  37. titles = ['linear kernel => $\mathbf{x}^T\mathbf{x}\'$',
  38. 'polynomial kernel => $(5+10\mathbf{x}^T\mathbf{x}\')^3$',
  39. 'Gaussian kernel => $e^{(-2|\mathbf{x}-\mathbf{x}\'|^2)}$',]
  40.  
  41. # 產生 meshgrid,共 200x100 的點
  42. XX1, XX2 = np.mgrid[-2:2:200j, -3:3:100j]
  43.  
  44. for i, g_svm in enumerate([g_svm_linear, g_svm_poly, g_svm_rbf]):
  45. # 5-Fold Cross Validation
  46. scores = cross_val_score(g_svm, X, Y, cv=5)
  47. # 平均埴
  48. m = scores.mean()
  49. # 標準差
  50. sd = scores.std()
  51. plt.subplot(3, 1, i + 1)
  52. # 調整之間的空白高度
  53. plt.subplots_adjust(hspace=.6)
  54. # 代進值,得到距離
  55. # 回傳判斷結果
  56. YY = g_svm.predict(np.c_[XX1.ravel(), XX2.ravel()])
  57. # 重新排列結果,符合 XX1
  58. YY = YY.reshape(XX1.shape)
  59.  
  60. # 畫圖,contour 不填滿顏色,contourf 填滿顏色
  61. plt.contourf(XX1, XX2, YY, cmap=plt.cm.bone, alpha=0.5)
  62. # 得到 free SV 的距離
  63. margin = max(g_svm.decision_function(g_svm.support_vectors_))
  64. # 只取足夠距離的 free SV
  65. index0 = g_svm.decision_function(X[g_svm.support_[Y[g_svm.support_]==0]])+margin<0.1
  66. index1 = g_svm.decision_function(X[g_svm.support_[Y[g_svm.support_]==1]])-margin<0.1
  67. index = np.r_[index0, index1]
  68. # 畫出所有點
  69. plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)
  70. # 將 free support vector 標示出來
  71. plt.scatter(g_svm.support_vectors_[index, 0], g_svm.support_vectors_[index, 1], color='g', linewidths=3, linestyle='-', s=100, facecolors='none')
  72.  
  73. # 回傳距離
  74. YY = g_svm.decision_function(np.c_[XX1.ravel(), XX2.ravel()])
  75. # 重新排列結果,符合 XX1
  76. YY = YY.reshape(XX1.shape)
  77. # 畫出界線
  78. plt.contour(XX1, XX2, YY, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'], levels=[-margin, 0, margin])
  79. # 標題
  80. plt.title('{} Accuracy: {:0.2f}$\pm${:0.2f}'.format(titles[i],m,sd*3))
  81.  
  82. plt.show()

參考

sklearn.svm.SVC

留言