1. 程式人生 > >通俗易懂--嶺迴歸(L2)、lasso迴歸(L1)、ElasticNet講解(演算法+案例)

通俗易懂--嶺迴歸(L2)、lasso迴歸(L1)、ElasticNet講解(演算法+案例)

1.L2正則化(嶺迴歸)

1.1問題

想要理解什麼是正則化,首先我們先來了解上圖的方程式。當訓練的特徵和資料很少時,往往會造成欠擬合的情況,對應的是左邊的座標;而我們想要達到的目的往往是中間的座標,適當的特徵和資料用來訓練;但往往現實生活中影響結果的因素是很多的,也就是說會有很多個特徵值,所以訓練模型的時候往往會造成過擬合的情況,如右邊的座標所示。

1.2公式

以圖中的公式為例,往往我們得到的模型是:

UTOOLS1546959038274.png

為了能夠得到中間座標的圖形,肯定是希望θ3和θ4越小越好,因為這兩項越小就越接近於0,就可以得到中間的圖形了。

對應的損失函式也加上這個懲罰項(為了懲罰θ):假設λ=1000

UTOOLS1546959169901.png

為了求得最小值,使θ值趨近於0

,這就達到了我們的目的,得到中間座標的方程。

把以上公式通用化得:

UTOOLS1546959221738.png

相當於在原始損失函式中加上了一個懲罰項(λ項)

這就是防止過擬合的一個方法,通常叫做L2正則化,也叫作嶺迴歸。

1.3對應圖形

我們可以簡化L2正則化的方程:

UTOOLS1546959273104.png

J0表示原始的損失函式,咱們假設正則化項為:

UTOOLS1546959466689.png

我們不妨回憶一下圓形的方程:

UTOOLS1546959496318.png

其中(a,b)為圓心座標,r為半徑。那麼經過座標原點的單位元可以寫成:

UTOOLS1546959601400.png

正和L2正則化項一樣,同時,機器學習的任務就是要通過一些方法(比如梯度下降)求出損失函式的最小值。

此時我們的任務變成在L約束下求出J0取最小值的解。

求解J0的過程可以畫出等值線。同時L2正則化的函式L也可以在w1w2的二維平面上畫出來。如下圖:

UTOOLS1546953455440.png

L表示為圖中的黑色圓形,隨著梯度下降法的不斷逼近,與圓第一次產生交點,而這個交點很難出現在座標軸上。

這就說明了L2正則化不容易得到稀疏矩陣,同時為了求出損失函式的最小值,使得w1和w2無限接近於0,達到防止過擬合的問題。

1.4使用場景

只要資料線性相關,用LinearRegression擬合的不是很好,需要正則化,可以考慮使用嶺迴歸(L2), 如何輸入特徵的維度很高,而且是稀疏線性關係的話, 嶺迴歸就不太合適,考慮使用Lasso迴歸。

1.5程式碼實現

GitHub程式碼--L2正則化

2.L1正則化(lasso迴歸)

2.1公式

L1正則化與L2正則化的區別在於懲罰項的不同:

UTOOLS1546959770276.png

L1正則化表現的是θ的絕對值,變化為上面提到的w1和w2可以表示為:

UTOOLS1546959815505.png

2.2對應圖形

求解J0的過程可以畫出等值線。同時L1正則化的函式也可以在w1w2的二維平面上畫出來。如下圖:

UTOOLS1546955675245.png

懲罰項表示為圖中的黑色稜形,隨著梯度下降法的不斷逼近,與稜形第一次產生交點,而這個交點很容易出現在座標軸上。這就說明了L1正則化容易得到稀疏矩陣。

2.3使用場景

L1正則化(Lasso迴歸)可以使得一些特徵的係數變小,甚至還使一些絕對值較小的係數直接變為0,從而增強模型的泛化能力 。對於高緯的特徵資料,尤其是線性關係是稀疏的,就採用L1正則化(Lasso迴歸),或者是要在一堆特徵裡面找出主要的特徵,那麼L1正則化(Lasso迴歸)更是首選了。

2.4程式碼實現

GitHub程式碼--L1正則化

3.ElasticNet迴歸

3.1公式

ElasticNet綜合了L1正則化項和L2正則化項,以下是它的公式:

UTOOLS1546959876945.png

3.2使用場景

ElasticNet在我們發現用Lasso迴歸太過(太多特徵被稀疏為0),而嶺迴歸也正則化的不夠(迴歸係數衰減太慢)的時候,可以考慮使用ElasticNet迴歸來綜合,得到比較好的結果。

3.3程式碼實現

from sklearn import linear_model  
#得到擬合模型,其中x_train,y_train為訓練集  
ENSTest = linear_model.ElasticNetCV(alphas=[0.0001, 0.0005, 0.001, 0.01, 0.1, 1, 10], l1_ratio=[.01, .1, .5, .9, .99],  max_iter=5000).fit(x_train, y_train)  
#利用模型預測,x_test為測試集特徵變數  
y_prediction = ENSTest.predict(x_test)

.

.

.

image.png

歡迎新增微信交流!請備註“機器學習”。