[ML] 機器學習技法:第六講 Support Vector Regression (SVR)

ML:基礎技法學習
Package:scikit-learn
課程:機器學習技法
簡介:第六講 Support Vector Regression (SVR)

Kernel Ridge Regression (KRR)

minβ  Ein(β)=minβ  λNn=1Nm=1NβnβmK(xn,xm)+1Nn=1N(ynm=1NβmK(xn,xm))2=minβ  λNβTKβ+1N(βTKTKβ2βTKTy+yTy)optimal w=n=1Nβnznβ=(λI+K)1y 時間複雜度為 O(N3),且 β 大部分不為 0
L2-regularized linear model
minw  λNwTw+1Nn=1N(ynwTzn)2 By Representer Theorem optimal w=n=1Nβnzn
w 代入
minw  Ein(w)=minw  λNwTw+Ein(w)=minw  λNwTw+1Nn=1N(ynwTzn)2(w=n=1Nβnzn=Zβ) minβ  Ein(β)=minβ  λN(Zβ)TZβ+1Nn=1N(yn(Zβ)Tzn)2=minβ  λNβTZTZβ+1NyT(Zβ)TZ2=minβ  λNβTZTZβ+1N(yTβTZTZ)(yTβTZTZ)T=minβ  λNβTZTZβ+1N(yTβTZTZ)(yZTZβ)=minβ  λNβTZTZβ+1N(yTyyTZTZββTZTZy+βTZTZZTZβ)(ZTZ=K)=minβ  λNβTKβ+1N(yTyyTKββTKy+βTKKβ)=minβ  λNβTKβ+1N(yTyyTKββTKy+βTKKβ)=minβ  λNβTKβ+1N(yTy2βTKy+βTKKβ)(K is symetric K=KT)=minβ  λNβTKβ+1N(yTy2βTKTy+βTKTKβ)=minβ  λNβTKβ+1N(βTKTKβ2βTKTy+yTy) 若直接展開如下
minw  Ein(w)=minw  λNwTw+Ein(w)=minw  λNwTw+1Nn=1N(ynwTzn)2(w=n=1Nβnzn) minβ  Ein(β)=minw  λNn=1NβnznTn=1Nβnzn+1Nn=1N(ynm=1NβmzmTzn)2=minw  λNn=1Nm=1NβnβmznTzm+1Nn=1N(ynm=1NβmzmTzn)2(znTzm=K(xn,xm))=minw  λNn=1Nm=1NβnβmK(xn,xm)+1Nn=1N(ynm=1NβmK(xm,xn))2(K(xm,xn)=K(xn,xm))=minw  λNn=1Nm=1NβnβmK(xn,xm)+1Nn=1N(ynm=1NβmK(xn,xm))2 借由矩陣微分
Ein(β)=β(λNβTKβ+1N(βTKTKβ2βTKTy+yTy))=2λNKβ+1N(2KTKβ2KTy)=2N(Kλβ+KTKβKTy)=2NKT(λβ+Kβy)=2NKT((λI+K)βy) 區域最佳解,微分等於 0,故
Ein(β)=2NKT((λI+K)βy)=00=(λI+K)βyβ=(λI+K)1yλ>0K 為半正定,故反矩陣必定存在
時間複雜度為 O(N3),且 β 大部分不為 0

Support Vector Regression (SVR)

Primal
minb,w,ξ,ξ  12wTw+Cn=1N(ξn+ξn)s.t.  ϵξnwTzn+bynϵ+ξnξn0, ξn0 QP of d~+1+N 個變數,2N+2N 個條件

Dual
minα,α  12n=1Nm=1N(αnαn)(αmαm)K(xn,xm)+n=1N((ϵyn)αn+(ϵ+yn)αn)s.t.  n=1N(αnαn)=00αnC, 0αnC, QP of 2N 個變數,4N+1 個條件

w=n=1N(αnαn)βnznC>αn>0b=ynwTzn+ϵC>αn>0b=ynwTznϵ 只有在 tube 邊界和以外的才是 SV
希望 β 的特性與 α 一樣,大部分皆是 0
首先重新定義 err 從 square regression 改為 tube regression
也就是當錯誤在水管範圍內,則視為沒有錯誤,也就是 |sy|ϵ 時,err=0
若超過時,則扣掉水管範圍部分,也就是 |sy|>ϵ 時,err=|sy|ϵ
可得 err(y,s)=max(0,|sy|ϵ)
如圖,可看到 err 在兩者接近 s 時,大約相同,遠離時 tube 成長幅度比較沒那麼劇烈
於是得到 L2-Regularized Tube Regression
minw  λNwTw+1Nn=1Nmax(0,|wTznyn|ϵ) 為了更接近標準的 SVM 定義,重新調整參數
minw  λNwTw+1Nn=1Nmax(0,|wTznyn|ϵ)  minw  λ2NwTw+12Nn=1Nmax(0,|wTznyn|ϵ)λ>0  minw  12NwTw+12Nλn=1Nmax(0,|wTznyn|ϵ)N>0  minw  12wTw+12λn=1Nmax(0,|wTznyn|ϵ)  minw  12wTw+Cn=1Nmax(0,|wTznyn|ϵ)  minb,w  12wTw+Cn=1Nmax(0,|wTzn+byn|ϵ) 最後加上 b 的原因,是為了更加符合標準的定義,且因為加上 b 但又對其最小化,不影響原先結果
ξn 表達錯誤,重新定義方程式,當 |wTzn+byn|ϵ 時,ξn=0,不然就 ξn>0
minb,w  12wTw+Cn=1Nmax(0,|wTzn+byn|ϵ)  minb,w,ξ  12wTw+Cn=1Nξns.t.  |wTzn+byn|ϵ+ξn      ξn0 絕對值仍存在,還不是線性方程式,故再將之展開,並將 ξn 定義上下限
且將 |wTzn+byn| 反向,符合常用定義
minb,w,ξ  12wTw+Cn=1Nξns.t.  |wTzn+byn|ϵ+ξn          ξn0  minb,w,ξ,ξ  12wTw+Cn=1N(ξn+ξn)s.t.      ϵξnynwTznbϵ+ξn              ξn0, ξn0 故可得 primal,QP of d~+1+N 個變數,2N+2N 個條件

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

但這還不夠,最好是 = strong duality,才能初步得到 4N 個變數的式子
幸運的是,在 QP 中,只要滿足以下條件,便是 strong duality
  • convex primal (原來的問題為 convex)
  • feasible primal (原來的問題有解的,也就是線性可分)
  • linear constraints (限制條件為線性的)
對於 SVM 滿足這些條件並不困難,故解以下的式子,如同解原本的式子
maxall αn0,αn0,βn0,βn0(minb,w,ξ,ξ 12wTw+Cn=1N(ξn+ξn)+n=1Nαn(yn+wTzn+bϵξn)+n=1Nαn(ynwTznbϵξn)+n=1Nβn(ξn)+n=1Nβn(ξn)L(b,w,ξ,ξ,α,α,β,β))
但如何把內部的 (b,w,ξ,ξ) 拿掉呢?
內部的問題,當最佳化時,必定符合
L(b,w,ξ,ξ,α,α,β,β)b=0=n=1N(αnαn)n=1N(αnαn)=0L(b,w,ξ,ξ,α,α,β,β)w=0=w+n=1Nαnznn=1Nαnznw=n=1N(αnαn)βnznL(b,w,ξ,ξ,α,α,β,β)ξ=0=Cαnβnβn=CαnL(b,w,ξ,ξ,α,α,β,β)ξ=0=Cαnβnβn=Cαn 從以上的這些條件,可得
dual=maxall αn0,αn0,βn0,βn0(minb,w,ξ,ξ 12wTw+Cn=1N(ξn+ξn)+n=1Nαn(yn+wTzn+bϵξn)+n=1Nαn(ynwTznbϵξn)+n=1Nβn(ξn)+n=1Nβn(ξn))=maxall αn0,αn0,βn0,βn0(minb,w,ξ,ξ 12wTw+Cn=1N(ξn+ξn)+n=1N(αnξn+αnξn)+n=1Nαn(yn+wTzn+bϵ)+n=1Nαn(ynwTznbϵ)+n=1Nβn(ξn)+n=1Nβn(ξn))=maxall αn0,αn0,βn=Cαn,βn=Cαn(minb,w,ξ,ξ 12wTw+n=1N((Cαnβn)ξn+(Cαnβn)ξn)+n=1Nαn(yn+wTzn+bϵ)+n=1Nαn(ynwTznbϵ))[0=Cαnβn,0=Cαnβn]=maxall αn0,αn0,βn0,βn0(minb,w,ξ,ξ 12wTw+n=1Nαn(yn+wTzn+bϵ)+n=1Nαn(ynwTznbϵ))[βn0αnC,βn0αnC]=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn(minb,w,ξ,ξ 12wTw+n=1Nαn(yn+wTzn+bϵ)+n=1Nαn(ynwTznbϵ))=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn(minb,w,ξ,ξ 12wTw+n=1N(αnαn)(b)+n=1Nαn(yn+wTznϵ)+n=1Nαn(ynwTznϵ))[n=1N(αnαn)=0]=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0(minb,w,ξ,ξ 12wTw+n=1Nαn(yn+wTznϵ)+n=1Nαn(ynwTznϵ))=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0(minb,w,ξ,ξ 12wTw+n=1N(αnαn)(wTzn)+n=1Nαn(ynϵ)+n=1Nαn(ynϵ))=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0(minb,w,ξ,ξ 12wTw+n=1NwT(αnαn)zn+n=1Nαn(ynϵ)+n=1Nαn(ynϵ)) [w=n=1N(αnαn)zn]=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn(minb,w,ξ,ξ 12wTwwTw+n=1Nαn(ynϵ)+n=1Nαn(ynϵ))=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn(minb,w,ξ,ξ 12wTw+n=1Nαn(ynϵ)+αn(ynϵ))=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn(minb,w,ξ,ξ 12n=1N(αnαn)zn2+n=1Nαn(ynϵ)+αn(ynϵ))[no b,w,ξ,ξ remove min]=maxall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn12n=1N(αnαn)zn2+n=1N(αn(ynϵ)+αn(ynϵ))=minall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn12n=1N(αnαn)zn2+n=1N(αn(ϵ+yn)+αn(ϵyn))=minall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn12n=1N(αnαn)znTn=1N(αnαn)zn+n=1N(αn(ϵ+yn)+αn(ϵyn))=minall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn12n=1Nm=1N(αnαn)(αmαm)znTzm+n=1N(αn(ϵ+yn)+αn(ϵyn))=minall Cαn0,Cαn0,βn=Cαn,βn=Cαn,n=1N(αnαn)=0,w=n=1N(αnαn)zn12n=1Nm=1N(αnαn)(αmαm)K(xn,xm)+n=1N((ϵyn)αn+(ϵ+yn)αn)
將限制條件移出
  • w=n=1N(αnαn)zn 只是求 w 並不限制 α,α
  • βn=Cαn,βn=Cαn 只是求 βn,βn 並不限制 α,α
可得
minα,α  12n=1Nm=1N(αnαn)(αmαm)K(xn,xm)+n=1N((ϵyn)αn+(ϵ+yn)αn)s.t.  n=1N(αnαn)=00αnC, 0αnC,αn,αn2N 個變數
限制條件 αn,αn4N 個,加上 n=1N(αnαn)=0,共 4N+1
已知 w=n=1N(αnαn)zn
那如何得 b 呢?利用 KKT
αn(yn+wTzn+bϵξn)=0αn>0yn+wTzn+bϵξn=0βn=Cαn>0ξn=0αn<Cαn(ynwTznbϵξn)=0αn>0ynwTznbϵξn=0βn=Cαn>0ξn=0αn<C 利用以上其中一組條件可得
0=yn+wTzn+bϵξnb=ynwTzn+ϵ+ξnαn<C  b=ynwTzn+ϵ 或是 0=ynwTznbϵξnb=ynwTznϵξnαn<C  b=ynwTznϵ
C>αn>0b=ynwTzn+ϵC>αn>0b=ynwTznϵ 而可以發現,當錯誤在 tube 內的話
  • 若為下限處
    ξn=0 & yn+wTzn+bϵξn<0
    αn=0
  • 若為上限處
    ξn=0 & ynwTznbϵξn<0
    αn=0
  • 此時 w=n=1N(αnαn)zn
    (αnαn)=0 也就是 βn=0
    達到 sparse β 的要求,只有在 tube 邊界和以外的才是 SV

Model 總結

  • s=wTzn+b
  • 分類
    • linear
      • PLA/pocket
        • err0/1(s,y)=[ys0] 
        • solver : update 
        • 不常用,表現不好
      • linear soft-margin SVM
        • err^SVM(s,y)=max(1ys,0) 
        • solver : QP
        • librabry:LIBLINEAR
    • kernel
      • SVM
        • err^SVM(s,y)=max(1ys,0),dual SVM
        • solver : QP 
        • librabry:LIBSVM
  • 回歸
    • linear
      • linear SVR
        • errtube=max(0,|sy|ϵ) 
        • solver : QP
        • 不常用,表現不好
      • linear ridge regression
        • errSQR=(sy)2
        • solver : 分析求解
        • librabry:LIBLINEAR
    • kernel
      • kernel ridge regression (KRR)
        • errSQR=(sy)2
        • solver : 分析求解
        • 不常用,效率不好
      • SVR
        • errtube=max(0,|sy|ϵ) 
        • solver : QP
        • librabry:LIBSVM
  • 機率預測 
  • kernel model 務必小心 overfitting

程式碼

  1. from __future__ import division
  2. import time
  3. import numpy as np
  4. from sklearn.svm import SVR
  5. from sklearn.kernel_ridge import KernelRidge
  6. from sklearn.model_selection import learning_curve
  7. import matplotlib.pyplot as plt
  8.  
  9. # 設定 seed
  10. rng = np.random.RandomState(0)
  11.  
  12. # 訓練資料
  13. X = 5 * rng.rand(10000, 1)
  14. y = np.sin(X).ravel()
  15.  
  16. # 加入 noise
  17. y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))
  18.  
  19. # 畫圖的資料,新增二維維度
  20. X_plot = np.linspace(0, 5, 100000)[:, None]
  21.  
  22. # 訓練大小
  23. train_size = 1000
  24.  
  25. # model
  26. svr = SVR(kernel='rbf', gamma=0.1, epsilon=0.1)
  27. krr = KernelRidge(kernel='rbf', gamma=0.1)
  28.  
  29. # 計算 SVR 訓練時間
  30. t0 = time.time()
  31. svr.fit(X[:train_size], y[:train_size])
  32. svr_fit = time.time() - t0
  33. print("SVR complexity and bandwidth selected and model fitted in %.3f s"
  34. % svr_fit)
  35.  
  36. # 計算 KRR 訓練時間
  37. t0 = time.time()
  38. krr.fit(X[:train_size], y[:train_size])
  39. krr_fit = time.time() - t0
  40. print("KRR complexity and bandwidth selected and model fitted in %.3f s"
  41. % krr_fit)
  42.  
  43. # 計算 SVR 預測時間
  44. t0 = time.time()
  45. y_svr = svr.predict(X_plot)
  46. svr_predict = time.time() - t0
  47. print("SVR prediction for %d inputs in %.3f s"
  48. % (X_plot.shape[0], svr_predict))
  49.  
  50. # 計算 KRR 預測時間
  51. t0 = time.time()
  52. y_krr = krr.predict(X_plot)
  53. krr_predict = time.time() - t0
  54. print("KRR prediction for %d inputs in %.3f s"
  55. % (X_plot.shape[0], krr_predict))
  56.  
  57. # SVR 的 support vector
  58. sv_ind = svr.support_
  59.  
  60. plt.subplot(2,1,1)
  61. # 畫出 SV
  62. plt.scatter(X[sv_ind], y[sv_ind], c='b', s=50, label='SVR support vectors', zorder=2)
  63. # 畫出 data
  64. plt.scatter(X[:], y[:], c='k', label='data', zorder=1)
  65. # 畫出 SVR 的曲線
  66. plt.plot(X_plot, y_svr, c='r',
  67. label='SVR (fit: %.3fs, predict: %.3fs)' % (svr_fit, svr_predict))
  68. # 畫出 KRR 的曲線
  69. plt.plot(X_plot, y_krr, c='g',
  70. label='KRR (fit: %.3fs, predict: %.3fs)' % (krr_fit, krr_predict))
  71. plt.xlabel('data')
  72. plt.ylabel('target')
  73. plt.title('SVR versus Kernel Ridge')
  74. plt.legend()
  75.  
  76. # Visualize learning curves
  77. plt.subplot(2,1,2)
  78.  
  79. # model
  80. svr = SVR(kernel='rbf', C=1e1, gamma=0.1, epsilon=0.1)
  81. krr = KernelRidge(kernel='rbf', alpha=0.1, gamma=0.1)
  82.  
  83. # cv = cross-validation,5 表示五份
  84. train_sizes, train_scores_svr, test_scores_svr = \
  85. learning_curve(svr, X[:100], y[:100], train_sizes=np.linspace(0.1, 1, 10),
  86. scoring="neg_mean_squared_error", cv=5)
  87. train_sizes_abs, train_scores_krr, test_scores_krr = \
  88. learning_curve(krr, X[:100], y[:100], train_sizes=np.linspace(0.1, 1, 10),
  89. scoring="neg_mean_squared_error", cv=5)
  90.  
  91. plt.plot(train_sizes, -test_scores_svr.mean(1), 'o-', color="r",
  92. label="SVR")
  93. plt.plot(train_sizes, -test_scores_krr.mean(1), 'o-', color="g",
  94. label="KRR")
  95. plt.xlabel("Train size")
  96. plt.ylabel("Mean Squared Error")
  97. plt.title('Learning curves')
  98. plt.legend(loc="best")
  99.  
  100. # 調整之間的空白高度
  101. plt.subplots_adjust(hspace=0.6)
  102. plt.show()

參考

sklearn.kernel_ridge.KernelRidge
sklearn.svm.SVR
sklearn.model_selection.learning_curve

留言