2. 使用sklearn建構完整的機器學習項目流程
一般來說,一個完整的機器學習項目分為以下步驟:
- 明确項目任務:回歸/分類
- 收集資料集并選擇合适的特征。
- 選擇度量模型性能的名額。
- 選擇具體的模型并進行訓練以優化模型。
- 評估模型的性能并調參。
2.1 使用sklearn建立完整的回歸項目
2.1.1 收集資料集并選擇合适的特征
在資料集上我們使用我們比較熟悉的Boston房價資料集,原因是:
- 第一個,我們通過這些簡單的資料集快速讓我們上手sklearn,以及掌握sklearn的相關操作。
- 第二個,我們用簡單的資料集能更加清晰地介紹機器學習的相關模型,避免在處理資料上花費較大的精力。
資料集的導入和特征參考https://blog.csdn.net/youself_jin/article/details/114821519
2.1.2 選擇度量模型性能的名額
- MSE均方誤差: MSE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ( y i − y ^ i ) 2 . \text{MSE}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples} - 1} (y_i - \hat{y}_i)^2. MSE(y,y^)=nsamples1∑i=0nsamples−1(yi−y^i)2.
- MAE平均絕對誤差: MAE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \frac{1}{n_{\text{samples}}} \sum_{i=0}^{n_{\text{samples}}-1} \left| y_i - \hat{y}_i \right| MAE(y,y^)=nsamples1∑i=0nsamples−1∣yi−y^i∣
- R 2 R^2 R2決定系數: R 2 ( y , y ^ ) = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} R2(y,y^)=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
- 解釋方差得分: e x p l a i n e d _ v a r i a n c e ( y , y ^ ) = 1 − V a r { y − y ^ } V a r { y } explained\_{}variance(y, \hat{y}) = 1 - \frac{Var\{ y - \hat{y}\}}{Var\{y\}} explained_variance(y,y^)=1−Var{y}Var{y−y^}
https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics

在這個案例中,我們使用MSE均方誤差為模型的性能度量名額。
2.1.3 選擇具體的模型并進行訓練
-
線性回歸模型
回歸這個概念是19世紀80年代由英國統計學家郎西斯.高爾頓在研究父子身高關系提出來的,他發現:在同一族群中,子代的平均身高介于父代的身高以及族群的平均身高之間。具體而言,高個子父親的兒子的身高有低于其父親身高的趨勢,而矮個子父親的兒子身高則有高于父親的身高的趨勢。也就是說,子代的身高有向族群平均身高"平均"的趨勢,這就是統計學上"回歸"的最初含義。回歸分析是一種預測性的模組化技術,它研究的是因變量(目标)和自變量(特征)之間的關系。這種技術通常用于預測分析,時間序列模型以及發現變量之間的因果關系。通常使用曲線來拟合資料點,目标是使曲線到資料點的距離差異最小。而線性回歸就是回歸問題中的一種,線性回歸假設目标值與特征之間線性相關,即滿足一個多元一次方程。通過建構損失函數,來求解損失函數最小時的參數w :
假設:資料集 D = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } D = \{(x_1,y_1),...,(x_N,y_N) \} D={(x1,y1),...,(xN,yN)}, x i ∈ R p , y i ∈ R , i = 1 , 2 , . . . , N x_i \in R^p,y_i \in R,i = 1,2,...,N xi∈Rp,yi∈R,i=1,2,...,N, X = ( x 1 , x 2 , . . . , x N ) T , Y = ( y 1 , y 2 , . . . , y N ) T X = (x_1,x_2,...,x_N)^T,Y=(y_1,y_2,...,y_N)^T X=(x1,x2,...,xN)T,Y=(y1,y2,...,yN)T
假設X和Y之間存線上性關系,模型的具體形式為 y ^ = f ( w ) = w T x \hat{y}=f(w) =w^Tx y^=f(w)=wTx
二、內建學習——基本的回歸模型 (a) 最小二乘估計:
我們需要衡量真實值 y i y_i yi與線性回歸模型的預測值 w T x i w^Tx_i wTxi之間的差距,在這裡我們使用二範數的平方和L(w)來描述這種差距,即:
L ( w ) = ∑ i = 1 N ∣ ∣ w T x i − y i ∣ ∣ 2 2 = ∑ i = 1 N ( w T x i − y i ) 2 = ( w T X T − Y T ) ( w T X T − Y T ) T = w T X T X w − 2 w T X T Y + Y Y T L(w) = \sum\limits_{i=1}^{N}||w^Tx_i-y_i||_2^2=\sum\limits_{i=1}^{N}(w^Tx_i-y_i)^2 = (w^TX^T-Y^T)(w^TX^T-Y^T)^T = w^TX^TXw - 2w^TX^TY+YY^T\\ L(w)=i=1∑N∣∣wTxi−yi∣∣22=i=1∑N(wTxi−yi)2=(wTXT−YT)(wTXT−YT)T=wTXTXw−2wTXTY+YYT
是以,我們需要找到使得L(w)最小時對應的參數w,即:
w ^ = a r g m i n L ( w ) \\ \hat{w} = argmin\;L(w)\\ w^=argminL(w)
為了達到求解最小化L(w)問題,我們應用高等數學的知識,使用求導來解決這個問題:
∂ L ( w ) ∂ w = 2 X T X w − 2 X T Y = 0 , \\ \frac{\partial L(w)}{\partial w} = 2X^TXw-2X^TY = 0, ∂w∂L(w)=2XTXw−2XTY=0,是以: w ^ = ( X T X ) − 1 X T Y \\ \hat{w} = (X^TX)^{-1}X^TY w^=(XTX)−1XTY
(b) 幾何解釋:
線上性代數中,我們知道兩個向量a和b互相垂直可以得出:
< a , b > = a . b = a T b = 0 <a,b> = a.b = a^Tb = 0 <a,b>=a.b=aTb=0
而平面X的法向量為Y-Xw,與平面X互相垂直,是以: X T ( Y − X w ) = 0 X^T(Y-Xw) = 0 XT(Y−Xw)=0,即: w = ( X T X ) − 1 X T Y w = (X^TX)^{-1}X^TY w=(XTX)−1XTY
二、內建學習——基本的回歸模型
(c)機率視角:
假設噪聲 ϵ ∽ N ( 0 , σ 2 ) , y = f ( w ) + ϵ = w T x + ϵ \epsilon \backsim N(0,\sigma^2),y=f(w)+\epsilon=w^Tx+\epsilon ϵ∽N(0,σ2),y=f(w)+ϵ=wTx+ϵ,是以: y ∣ x i , w N ( w T x , σ 2 ) y|x_i,w ~ N(w^Tx,\sigma^2) y∣xi,w N(wTx,σ2)
我們使用極大似然估計MLE對參數w進行估計:
L ( w ) = l o g P ( Y ∣ X ; w ) = l o g ∏ i = 1 N P ( y i ∣ x i ; w ) = ∑ i = 1 N l o g P ( y i ∣ x i ; w ) = ∑ i = 1 N l o g ( 1 2 π σ e x p ( − ( y i − w T x i ) 2 2 σ 2 ) ) = ∑ i = 1 N [ l o g ( 1 2 π σ ) − 1 2 σ 2 ( y i − w T x i ) 2 ] a r g m a x w L ( w ) = a r g m i n w [ l ( w ) = ∑ i = 1 N ( y i − w T x i ) 2 ] L(w) = log\;P(Y|X;w) = log\;\prod_{i=1}^N P(y_i|x_i;w) = \sum\limits_{i=1}^{N} log\; P(y_i|x_i;w)\\ = \sum\limits_{i=1}^{N}log(\frac{1}{\sqrt{2\pi \sigma}}exp(-\frac{(y_i-w^Tx_i)^2}{2\sigma^2})) = \sum\limits_{i=1}^{N}[log(\frac{1}{\sqrt{2\pi}\sigma})-\frac{1}{2\sigma^2}(y_i-w^Tx_i)^2] \\ argmax_w L(w) = argmin_w[l(w) = \sum\limits_{i = 1}^{N}(y_i-w^Tx_i)^2]\\ L(w)=logP(Y∣X;w)=logi=1∏NP(yi∣xi;w)=i=1∑NlogP(yi∣xi;w)=i=1∑Nlog(2πσ
1exp(−2σ2(yi−wTxi)2))=i=1∑N[log(2π
σ1)−2σ21(yi−wTxi)2]argmaxwL(w)=argminw[l(w)=i=1∑N(yi−wTxi)2]
是以:線性回歸的最小二乘估計<==>噪聲\epsilon\backsim N(0,\sigma^2)的極大似然估計。
下面,我們使用sklearn的線性回歸執行個體來示範:
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
from sklearn import linear_model # 引入線性回歸方法
lin_reg = linear_model.LinearRegression() # 建立線性回歸的類
lin_reg.fit(X,y) # 輸入特征X和因變量y進行訓練
print("模型系數:",lin_reg.coef_) # 輸出模型的系數
print("模型得分:",lin_reg.score(X,y)) # 輸出模型的決定系數R^2
模型系數: [-1.08011358e-01 4.64204584e-02 2.05586264e-02 2.68673382e+00
-1.77666112e+01 3.80986521e+00 6.92224640e-04 -1.47556685e+00
3.06049479e-01 -1.23345939e-02 -9.52747232e-01 9.31168327e-03
-5.24758378e-01]
模型得分: 0.7406426641094095
-
線性回歸的推廣
線上性回歸中,我們假設因變量與特征之間的關系是線性關系,這樣的假設使得模型很簡單,但是缺點也是顯然的,那就是當資料存在非線性關系時,我們使用線性回歸模型進行預測會導緻預測性能極其低下,因為模型的形式本身是線性的,無法表達資料中的非線性關系。我們一個很自然的想法就是去推廣線性回歸模型,使得推廣後的模型更能表達非線性的關系。
(a) 多項式回歸:
為了展現因變量和特征的非線性關系,一個很自然而然的想法就是将标準的線性回歸模型:
y i = w 0 + w 1 x i + ϵ i y_i = w_0 + w_1x_i + \epsilon_i yi=w0+w1xi+ϵi
換成一個多項式函數:
y i = w 0 + w 1 x i + w 2 x i 2 + . . . + w d x i d + ϵ y_i = w_0 + w_1x_i + w_2x_i^2 + ...+w_dx_i^d + \epsilon yi=w0+w1xi+w2xi2+...+wdxid+ϵ
對于多項式的階數d不能取過大,一般不大于3或者4,因為d越大,多項式曲線就會越光滑,在X的邊界處有異常的波動。(圖中的邊界處的4階多項式拟合曲線的置信區間(虛線表示置信區間)明顯增大,預測效果的穩定性下降。)
二、內建學習——基本的回歸模型 二、內建學習——基本的回歸模型 (b) 廣義可加模型(GAM):
廣義可加模型GAM實際上是線性模型推廣至非線性模型的一個架構,在這個架構中,每一個變量都用一個非線性函數來代替,但是模型本身保持整體可加性。GAM模型不僅僅可以用線上性回歸的推廣,還可以将線性分類模型進行推廣。具體的推廣形式是:
标準的線性回歸模型:
y i = w 0 + w 1 x i 1 + . . . + w p x i p + ϵ i y_i = w_0 + w_1x_{i1} +...+w_px_{ip} + \epsilon_i yi=w0+w1xi1+...+wpxip+ϵi
GAM模型架構:
y i = w 0 + ∑ j = 1 p f j ( x i j ) + ϵ i y_i = w_0 + \sum\limits_{j=1}^{p}f_{j}(x_{ij}) + \epsilon_i yi=w0+j=1∑pfj(xij)+ϵi
GAM模型的優點與不足:
- 優點:簡單容易操作,能夠很自然地推廣線性回歸模型至非線性模型,使得模型的預測精度有所上升;由于模型本身是可加的,是以GAM還是能像線性回歸模型一樣把其他因素控制不變的情況下單獨對某個變量進行推斷,極大地保留了線性回歸的易于推斷的性質。
- 缺點:GAM模型會經常忽略一些有意義的互動作用,比如某兩個特征共同影響因變量,不過GAM還是能像線性回歸一樣加入互動項 x ( i ) × x ( j ) x^{(i)} \times x^{(j)} x(i)×x(j)的形式進行模組化;但是GAM模型本質上還是一個可加模型,如果我們能擺脫可加性模型形式,可能還會提升模型預測精度,詳情請看後面的算法。
(a) 多項式回歸執行個體介紹:
https://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html?highlight=poly#sklearn.preprocessing.PolynomialFeatures
sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order=‘C’):
參數:
degree:特征轉換的階數。
interaction_onlyboolean:是否隻包含互動項,預設False 。
include_bias:是否包含截距項,預設True。
order:str in {‘C’, ‘F’}, default ‘C’,輸出數組的順序。
from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(6).reshape(3, 2)
print("原始X為:\n",X_arr)
poly = PolynomialFeatures(2)
print("2次轉化X:\n",poly.fit_transform(X_arr))
poly = PolynomialFeatures(interaction_only=True)
print("2次轉化X:\n",poly.fit_transform(X_arr))
原始X為:
[[0 1]
[2 3]
[4 5]]
2次轉化X:
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]]
2次轉化X:
[[ 1. 0. 1. 0.]
[ 1. 2. 3. 6.]
[ 1. 4. 5. 20.]]
(b) GAM模型執行個體介紹:
安裝pygam:pip install pygam
https://github.com/dswah/pyGAM/blob/master/doc/source/notebooks/quick_start.ipynb
from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
-
回歸樹:
基于樹的回歸方法主要是依據分層和分割的方式将特征空間劃分為一系列簡單的區域。對某個給定的待預測的自變量,用他所屬區域中訓練集的平均數或者衆數對其進行預測。由于劃分特征空間的分裂規則可以用樹的形式進行概括,是以這類方法稱為決策樹方法。決策樹由結點(node)和有向邊(diredcted edge)組成。結點有兩種類型:内部結點(internal node)和葉結點(leaf node)。内部結點表示一個特征或屬性,葉結點表示一個類别或者某個值。區域 R 1 , R 2 R_1,R_2 R1,R2等稱為葉節點,将特征空間分開的點為内部節點。
建立回歸樹的過程大緻可以分為以下兩步:二、內建學習——基本的回歸模型 - 将自變量的特征空間(即 x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . , x ( p ) x^{(1)},x^{(2)},x^{(3)},...,x^{(p)} x(1),x(2),x(3),...,x(p))的可能取值構成的集合分割成J個互不重疊的區域 R 1 , R 2 , . . . , R j R_1,R_2,...,R_j R1,R2,...,Rj。
-
對落入區域 R j R_j Rj的每個觀測值作相同的預測,預測值等于 R j R_j Rj上訓練集的因變量的簡單算術平均。
具體來說,就是:
a. 選擇最優切分特征j以及該特征上的最優點s:
周遊特征j以及固定j後周遊切分點s,選擇使得下式最小的(j,s) m i n j , s [ m i n c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min_{j,s}[min_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2 + min_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2 ] minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]
b. 按照(j,s)分裂特征空間: R 1 ( j , s ) = { x ∣ x j ≤ s } 和 R 2 ( j , s ) = { x ∣ x j > s } , c ^ m = 1 N m ∑ x ∈ R m ( j , s ) y i , m = 1 , 2 R_1(j,s) = \{x|x^{j} \le s \}和R_2(j,s) = \{x|x^{j} > s \},\hat{c}_m = \frac{1}{N_m}\sum\limits_{x \in R_m(j,s)}y_i,\;m=1,2 R1(j,s)={x∣xj≤s}和R2(j,s)={x∣xj>s},c^m=Nm1x∈Rm(j,s)∑yi,m=1,2
c. 繼續調用步驟1,2直到滿足停止條件,就是每個區域的樣本數小于等于5。
d. 将特征空間劃分為J個不同的區域,生成回歸樹: f ( x ) = ∑ m = 1 J c ^ m I ( x ∈ R m ) f(x) = \sum\limits_{m=1}^{J}\hat{c}_mI(x \in R_m) f(x)=m=1∑Jc^mI(x∈Rm)
如以下生成的關于運動員在棒球大聯盟資料的回歸樹:
二、內建學習——基本的回歸模型
回歸樹與線性模型的比較:
線性模型的模型形式與樹模型的模型形式有着本質的差別,具體而言,線性回歸對模型形式做了如下假定: f ( x ) = w 0 + ∑ j = 1 p w j x ( j ) f(x) = w_0 + \sum\limits_{j=1}^{p}w_jx^{(j)} f(x)=w0+j=1∑pwjx(j),而回歸樹則是 f ( x ) = ∑ m = 1 J c ^ m I ( x ∈ R m ) f(x) = \sum\limits_{m=1}^{J}\hat{c}_mI(x \in R_m) f(x)=m=1∑Jc^mI(x∈Rm)。那問題來了,哪種模型更優呢?這個要視具體情況而言,如果特征變量與因變量的關系能很好的用線性關系來表達,那麼線性回歸通常有着不錯的預測效果,拟合效果則優于不能揭示線性結構的回歸樹。反之,如果特征變量與因變量的關系呈現高度複雜的非線性,那麼樹方法比傳統方法更優。
樹模型的優缺點:二、內建學習——基本的回歸模型 - 樹模型的解釋性強,在解釋性方面可能比線性回歸還要友善。
- 樹模型更接近人的決策方式。
- 樹模型可以用圖來表示,非專業人士也可以輕松解讀。
- 樹模型可以直接做定性的特征而不需要像線性回歸一樣啞元化。
- 樹模型能很好處理缺失值和異常值,對異常值不敏感,但是這個對線性模型來說卻是緻命的。
- 樹模型的預測準确性一般無法達到其他回歸模型的水準,但是改進的方法很多。
sklearn使用回歸樹的執行個體:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html?highlight=tree#sklearn.tree.DecisionTreeRegressor
sklearn.tree.DecisionTreeRegressor(*, criterion=‘mse’, splitter=‘best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort=‘deprecated’, ccp_alpha=0.0)
-
參數:(列舉幾個重要的,常用的,詳情請看上面的官網)
criterion:{“ mse”,“ friedman_mse”,“ mae”},預設=“ mse”。衡量分割标準的函數 。
splitter:{“best”, “random”}, default=”best”。分割方式。
max_depth:樹的最大深度。
min_samples_split:拆分内部節點所需的最少樣本數,預設是2。
min_samples_leaf:在葉節點處需要的最小樣本數。預設是1。
min_weight_fraction_leaf:在所有葉節點處(所有輸入樣本)的權重總和中的最小權重分數。如果未提供sample_weight,則樣本的權重相等。預設是0。
from sklearn.tree import DecisionTreeRegressor
reg_tree = DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X,y)
0.9376307599929274
-
支援向量機回歸(SVR)
在介紹支援向量回歸SVR之前,我們先來了解下限制優化的相關知識:
-
限制優化問題(P):
m i n f ( x ) s . t . g i ( x ) ≤ 0 , i = 1 , 2 , . . . , m h j ( x ) = 0 , j = 1 , 2 , . . . , l min f(x) \\ s.t.\;\;\;g_i(x) \le 0,\; i=1,2,...,m\\ \;\;\;\;\; h_j(x) = 0,\; j=1,2,...,l minf(x)s.t.gi(x)≤0,i=1,2,...,mhj(x)=0,j=1,2,...,l
我們假設 x ∗ x^* x∗為滿足以上條件的局部最優解, p ∗ = f ( x ∗ ) p^* = f(x^*) p∗=f(x∗),我們的目的就是要找到 x ∗ x^* x∗與 p ∗ p^* p∗,滿足不等式和等式限制的x集合成為可行域,記作S。
-
KKT條件(最優解的一階必要條件)
因為KKT條件是最優化的相關内容,在本次開源學習中并不是重點,是以在這裡我用一個更加簡單的例子說明KKT條件,嚴格的證明請參見凸優化相關書籍。
在這個例子中,我們考慮:( x ∗ x^* x∗為我們的最優解)
m i n f ( x ) s . t . g 1 ( x ) ≤ 0 , x ∈ R n g 2 ( x ) ≤ 0 g 3 ( x ) ≤ 0 minf(x)\\ s.t.\;g_1(x) \le 0,\;x \in R^n\\ \;\;\;g_2(x) \le 0\\ \;\;\;g_3(x) \le 0 minf(x)s.t.g1(x)≤0,x∈Rng2(x)≤0g3(x)≤0
二、內建學習——基本的回歸模型
我們可以看到: − ∇ f ( x ∗ ) -\nabla f(x^*) −∇f(x∗)可以由 ∇ g 1 ( x ∗ ) \nabla g_1(x^*) ∇g1(x∗)與 ∇ g 2 ( x ∗ ) \nabla g_2(x^*) ∇g2(x∗)線性表出,是以有: − ∇ f ( x ∗ ) = λ 1 ∇ g 1 ( x ∗ ) + λ 2 ∇ g 2 ( x ∗ ) -\nabla f(x^*) = \lambda_1 \nabla g_1(x^*) + \lambda_2 \nabla g_2(x^*) −∇f(x∗)=λ1∇g1(x∗)+λ2∇g2(x∗),其中 λ 1 , λ 2 ≥ 0 \lambda_1,\lambda_2 \ge 0 λ1,λ2≥0,即:
∇ f ( x ∗ ) + λ 1 ∇ g 1 ( x ∗ ) + λ 2 ∇ g 2 ( x ∗ ) = 0 , 其 中 λ 1 , λ 2 ≥ 0 \nabla f(x^*) + \lambda_1 \nabla g_1(x^*) + \lambda_2 \nabla g_2(x^*) = 0,\;\;\;其中\lambda_1,\lambda_2 \ge 0 ∇f(x∗)+λ1∇g1(x∗)+λ2∇g2(x∗)=0,其中λ1,λ2≥0
我們把沒有起作用的限制 g 3 ( x ) g_3(x) g3(x)也放到式子裡面去,目的也就是為了書寫友善,即要求:
∇ f ( x ∗ ) + λ 1 ∇ g 1 ( x ∗ ) + λ 2 ∇ g 2 ( x ∗ ) + λ 3 ∇ g 3 ( x ∗ ) = 0 , 其 中 λ 1 , λ 2 ≥ 0 , λ 3 = 0 \nabla f(x^*) + \lambda_1 \nabla g_1(x^*) + \lambda_2 \nabla g_2(x^*) + \lambda_3 \nabla g_3(x^*)= 0,\;\;\;其中\lambda_1,\lambda_2 \ge 0,\lambda_3 = 0 ∇f(x∗)+λ1∇g1(x∗)+λ2∇g2(x∗)+λ3∇g3(x∗)=0,其中λ1,λ2≥0,λ3=0
由于點 x ∗ x^* x∗位于方程 g 1 ( x ) = 0 g_1(x)=0 g1(x)=0與 g 2 ( x ) = 0 g_2(x)=0 g2(x)=0上,是以: λ 1 g 1 ( x ∗ ) = 0 , λ 2 g 2 ( x ∗ ) = 0 , λ 3 g 3 ( x ∗ ) = 0 \lambda_1 g_1(x^*) = 0,\lambda_2 g_2(x^*) = 0 , \lambda_3 g_3(x^*)= 0 λ1g1(x∗)=0,λ2g2(x∗)=0,λ3g3(x∗)=0
是以,KKT條件就是:假設 x ∗ x^* x∗為最優化問題(P)的局部最優解,且 x ∗ x^* x∗ 在某個适當的條件下 ,有:
∇ f ( x ∗ ) + ∑ i = 1 m λ i ∇ g ( x ∗ ) + ∑ j = 1 l μ j ∇ h j ( x ∗ ) = 0 ( 對 偶 條 件 ) λ i ≥ 0 , i = 1 , 2 , . . . , m ( 對 偶 條 件 ) g i ( x ∗ ) ≤ 0 ( 原 問 題 條 件 ) h j ( x ∗ ) = 0 ( 原 問 題 條 件 ) λ i g ( x ∗ ) = 0 ( 互 補 松 弛 定 理 ) \nabla f(x^*) + \sum\limits_{i=1}^{m}\lambda_i \nabla g(x^*) + \sum\limits_{j=1}^{l}\mu_j \nabla h_j(x^*) = 0(對偶條件)\\ \lambda_i \ge 0,\;i = 1,2,...,m(對偶條件)\\ g_i(x^*) \le 0(原問題條件)\\ h_j(x^*) = 0(原問題條件)\\ \lambda_i g(x^*) = 0(互補松弛定理) ∇f(x∗)+i=1∑mλi∇g(x∗)+j=1∑lμj∇hj(x∗)=0(對偶條件)λi≥0,i=1,2,...,m(對偶條件)gi(x∗)≤0(原問題條件)hj(x∗)=0(原問題條件)λig(x∗)=0(互補松弛定理)
-
-
對偶理論:
為什麼要引入對偶問題呢?是因為原問題與對偶問題就像是一個問題兩個角度去看,如利潤最大與成本最低等。有時侯原問題上難以解決,但是在對偶問題上就會變得很簡單。再者,任何一個原問題在變成對偶問題後都會變成一個凸優化的問題,這點我們後面會有介紹。下面我們來引入對偶問題:
首先,我們的原問題(P)是:
m i n f ( x ) s . t . g i ( x ) ≤ 0 , i = 1 , 2 , . . . , m h j ( x ) = 0 , j = 1 , 2 , . . . , l min f(x) \\ s.t.\;\;\;g_i(x) \le 0,\; i=1,2,...,m\\ \;\;\;\;\; h_j(x) = 0,\; j=1,2,...,l minf(x)s.t.gi(x)≤0,i=1,2,...,mhj(x)=0,j=1,2,...,l
引入拉格朗日函數: L ( x , λ , μ ) = f ( x ) + ∑ i = 1 m λ i g i ( x ) + ∑ j = 1 l μ j h j ( x ) L(x,\lambda,\mu) = f(x) + \sum\limits_{i=1}^{m}\lambda_i g_i(x) + \sum\limits_{j=1}^{l}\mu_j h_j(x) L(x,λ,μ)=f(x)+i=1∑mλigi(x)+j=1∑lμjhj(x)
拉格朗日對偶函數:
d ( λ , μ ) = m i n x ∈ X { f ( x ) + ∑ i = 1 m λ i g i ( x ) + ∑ j = 1 l μ j h j ( x ) } , 其 中 X 為 滿 足 條 件 的 x 變 量 ≤ m i n x ∈ S { f ( x ) + ∑ i = 1 m λ i g i ( x ) + ∑ j = 1 l μ j h j ( x ) } , 由 于 g i ( x ) ≤ 0 , h j ( x ) = 0 , λ i ≥ 0 , 其 中 S 為 可 行 域 ≤ m i n x ∈ S { f ( x ) } d(\lambda,\mu) = min_{x\in X}\{ f(x) + \sum\limits_{i=1}^{m}\lambda_i g_i(x) + \sum\limits_{j=1}^{l}\mu_j h_j(x)\} ,其中X為滿足條件的x變量\\ \le min_{x\in S}\{ f(x) + \sum\limits_{i=1}^{m}\lambda_i g_i(x) + \sum\limits_{j=1}^{l}\mu_j h_j(x) \},由于g_i(x) \le 0,h_j(x) = 0,\lambda_i \ge 0 ,其中S為可行域\\ \le min_{x\in S}\{f(x) \} d(λ,μ)=minx∈X{f(x)+i=1∑mλigi(x)+j=1∑lμjhj(x)},其中X為滿足條件的x變量≤minx∈S{f(x)+i=1∑mλigi(x)+j=1∑lμjhj(x)},由于gi(x)≤0,hj(x)=0,λi≥0,其中S為可行域≤minx∈S{f(x)}
是以:拉格朗日對偶函數 d ( λ , μ ) d(\lambda,\mu) d(λ,μ)是原問題最優解的函數值 p ∗ p^* p∗的下界,即每個不同的 λ \lambda λ與 μ \mu μ确定的 d ( λ , μ ) d(\lambda,\mu) d(λ,μ)都是 p ∗ p^* p∗的下界,但是我們希望下界越大越好,因為越大就更能接近真實的 p ∗ p^* p∗。是以:
拉格朗日對偶問題(D)轉化為:
m a x λ , μ d ( λ , μ ) s . t . λ i ≥ 0 , i = 1 , 2 , . . . , m 也 就 是 : m a x λ ≥ 0 , μ m i n x ∈ S L ( x , λ , μ ) max_{\lambda,\mu}d(\lambda,\mu)\\ s.t. \lambda_i \ge 0,i = 1,2,...,m\\ 也就是:\\ max_{\lambda \ge 0,\mu}\;min_{x \in S} L(x,\lambda,\mu) maxλ,μd(λ,μ)s.t.λi≥0,i=1,2,...,m也就是:maxλ≥0,μminx∈SL(x,λ,μ)
我們可以觀察到,對偶問題是關于 λ \lambda λ和 μ \mu μ的線性函數,是以對偶問題是一個凸優化問題,凸優化問題在最優化理論較為簡單。
弱對偶定理:對偶問題(D)的最優解 D ∗ D^* D∗一定小于原問題最優解 P ∗ P^* P∗,這點在剛剛的讨論得到了充分的證明,一定成立。
強對偶定理:對偶問題(D)的最優解 D ∗ D^* D∗在一定的條件下等于原問題最優解 P ∗ P^* P∗,條件非常多樣化且不是唯一的,也就是說這是個開放性的問題,在這裡我給出一個最簡單的條件,即: f ( x ) f(x) f(x)與 g i ( x ) g_i(x) gi(x)為凸函數, h j ( x ) h_j(x) hj(x)為線性函數,X是凸集, x ∗ x^* x∗滿足KKT條件,那麼 D ∗ = P ∗ D^* = P^* D∗=P∗。
在介紹完了相關的優化知識以後,我們開始正式學習支援向量回歸SVR。
線上性回歸的理論中,每個樣本點都要計算平方損失,但是SVR卻是不一樣的。SVR認為:落在 f ( x ) f(x) f(x)的 ϵ \epsilon ϵ鄰域空間中的樣本點不需要計算損失,這些都是預測正确的,其餘的落在 ϵ \epsilon ϵ鄰域空間以外的樣本才需要計算損失,是以:
m i n w , b , ξ i , ξ ^ i 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 N ( ξ i , ξ ^ i ) s . t . f ( x i ) − y i ≤ ϵ + ξ i y i − f ( x i ) ≤ ϵ + ξ ^ i ξ i , ξ ^ i ≤ 0 , i = 1 , 2 , . . . , N min_{w,b,\xi_i,\hat{\xi}_i} \frac{1}{2}||w||^2 +C \sum\limits_{i=1}^{N}(\xi_i,\hat{\xi}_i)\\ s.t.\;\;\; f(x_i) - y_i \le \epsilon + \xi_i\\ \;\;\;\;\;y_i - f(x_i) \le \epsilon +\hat{\xi}_i\\ \;\;\;\;\; \xi_i,\hat{\xi}_i \le 0,i = 1,2,...,N minw,b,ξi,ξ^i21∣∣w∣∣2+Ci=1∑N(ξi,ξ^i)s.t.f(xi)−yi≤ϵ+ξiyi−f(xi)≤ϵ+ξ^iξi,ξ^i≤0,i=1,2,...,N
引入拉格朗日函數:
L ( w , b , α , α ^ , ξ , ξ , μ , μ ^ ) = 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ( ξ i + ξ ^ i ) − ∑ i = 1 N ξ i μ i − ∑ i = 1 N ξ ^ i μ ^ i + ∑ i = 1 N α i ( f ( x i ) − y i − ϵ − ξ i ) + ∑ i = 1 N α ^ i ( y i − f ( x i ) − ϵ − ξ ^ i ) \begin{array}{l} L(w, b, \alpha, \hat{\alpha}, \xi, \xi, \mu, \hat{\mu}) \\ \quad=\frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N}\left(\xi_{i}+\widehat{\xi}_{i}\right)-\sum_{i=1}^{N} \xi_{i} \mu_{i}-\sum_{i=1}^{N} \widehat{\xi}_{i} \widehat{\mu}_{i} \\ \quad+\sum_{i=1}^{N} \alpha_{i}\left(f\left(x_{i}\right)-y_{i}-\epsilon-\xi_{i}\right)+\sum_{i=1}^{N} \widehat{\alpha}_{i}\left(y_{i}-f\left(x_{i}\right)-\epsilon-\widehat{\xi}_{i}\right) \end{array} L(w,b,α,α^,ξ,ξ,μ,μ^)=21∥w∥2+C∑i=1N(ξi+ξ
i)−∑i=1Nξiμi−∑i=1Nξ
iμ
i+∑i=1Nαi(f(xi)−yi−ϵ−ξi)+∑i=1Nα
i(yi−f(xi)−ϵ−ξ
i)
再令 L ( w , b , α , α ^ , ξ , ξ , μ , μ ^ ) L(w, b, \alpha, \hat{\alpha}, \xi, \xi, \mu, \hat{\mu}) L(w,b,α,α^,ξ,ξ,μ,μ^)對 w , b , ξ , ξ ^ w,b,\xi,\hat{\xi} w,b,ξ,ξ^求偏導等于0,得: w = ∑ i = 1 N ( α ^ i − α i ) x i w=\sum_{i=1}^{N}\left(\widehat{\alpha}_{i}-\alpha_{i}\right) x_{i} w=∑i=1N(α
i−αi)xi。
上述過程中需滿足KKT條件,即要求:
{ α i ( f ( x i ) − y i − ϵ − ξ i ) = 0 α i ^ ( y i − f ( x i ) − ϵ − ξ ^ i ) = 0 α i α ^ i = 0 , ξ i ξ ^ i = 0 ( C − α i ) ξ i = 0 , ( C − α ^ i ) ξ ^ i = 0 \left\{\begin{array}{c} \alpha_{i}\left(f\left(x_{i}\right)-y_{i}-\epsilon-\xi_{i}\right)=0 \\ \hat{\alpha_{i}}\left(y_{i}-f\left(x_{i}\right)-\epsilon-\hat{\xi}_{i}\right)=0 \\ \alpha_{i} \widehat{\alpha}_{i}=0, \xi_{i} \hat{\xi}_{i}=0 \\ \left(C-\alpha_{i}\right) \xi_{i}=0,\left(C-\widehat{\alpha}_{i}\right) \hat{\xi}_{i}=0 \end{array}\right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧αi(f(xi)−yi−ϵ−ξi)=0αi^(yi−f(xi)−ϵ−ξ^i)=0αiα
i=0,ξiξ^i=0(C−αi)ξi=0,(C−α
i)ξ^i=0
SVR的解形如: f ( x ) = ∑ i = 1 N ( α ^ i − α i ) x i T x + b f(x)=\sum_{i=1}^{N}\left(\widehat{\alpha}_{i}-\alpha_{i}\right) x_{i}^{T} x+b f(x)=∑i=1N(α
i−αi)xiTx+b
sklearn中使用SVR執行個體:
sklearn.svm.SVR(*, kernel=‘rbf’, degree=3, gamma=‘scale’, coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html?highlight=svr#sklearn.svm.SVR
-
參數:
kernel:核函數,{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}, 預設=’rbf’。(後面會詳細介紹)
degree:多項式核函數的階數。預設 = 3。
C:正則化參數,預設=1.0。(後面會詳細介紹)
epsilon:SVR模型允許的不計算誤差的鄰域大小。預設0.1。
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler # 标準化資料
from sklearn.pipeline import make_pipeline # 使用管道,把預處理和模型形成一個流程
reg_svr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
reg_svr.fit(X, y)
reg_svr.score(X,y)
0.7024525421955277