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

1.L2正則化(嶺迴歸)

1.1問題

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

1.2公式

以圖中的公式爲例,每每咱們獲得的模型是:\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4,爲了可以獲得中間座標的圖形,確定是但願\theta_3\theta_4越小越好,由於這兩項越小就越接近於0,就能夠獲得中間的圖形了。git

對應的損失函數也加上這個懲罰項(爲了懲罰\theta):假設\lambda=1000github

  • min(\frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2+1000\theta_3^2+1000\theta_4^2])

爲了求得最小值,使\theta值趨近於0,這就達到了咱們的目的,獲得中間座標的方程。機器學習

把以上公式通用化得:函數

  • min(\frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2+\lambda\sum_{j=1}^{n}\theta_j^2])

至關於在原始損失函數中加上了一個懲罰項(\lambda項)學習

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

1.3對應圖形

咱們能夠簡化L2正則化的方程:spa

  • J=J_0+\lambda\sum_{w}w^2

J_0表示原始的損失函數,我們假設正則化項爲:L=\lambda(w_1^2+w_2^2)code

咱們不妨回憶一下圓形的方程:(x-a)^2+(y-b)^2=r^2cdn

其中(a,b)爲圓心座標,r爲半徑。那麼通過座標原點的單位元能夠寫成:x^2+y^2=1

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

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

求解J_o的過程能夠畫出等值線。同時L2正則化的函數L也能夠在w_1 w_2的二維平面上畫出來。以下圖:

UTOOLS1546953455440.png

L表示爲圖中的黑色圓形,隨着梯度降低法的不斷逼近,與圓第一次產生交點,而這個交點很難出如今座標軸上。

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

1.4使用場景

只要數據線性相關,用LinearRegression擬合的不是很好,須要正則化,能夠考慮使用嶺迴歸(L2), 如何輸入特徵的維度很高,並且是稀疏線性關係的話, 嶺迴歸就不太合適,考慮使用Lasso迴歸。

1.5代碼實現

GitHub代碼--L2正則化

2.L1正則化(lasso迴歸)

2.1公式

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

  • min(\frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2+\lambda\sum_{j=1}^{n}|\theta|])

L1正則化表現的是\theta的絕對值,變化爲上面提到的w1和w2能夠表示爲:

  • J=J_0+\lambda(|w_1|+|w_2|)

2.2對應圖形

求解J_o的過程能夠畫出等值線。同時L1正則化的函數也能夠在w_1 w_2的二維平面上畫出來。以下圖:

UTOOLS1546955675245.png

懲罰項表示爲圖中的黑色棱形,隨着梯度降低法的不斷逼近,與棱形第一次產生交點,而這個交點很容易出如今座標軸上。這就說明了L1正則化容易獲得稀疏矩陣。

2.3使用場景

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

2.4代碼實現

GitHub代碼--L1正則化

3.ElasticNet迴歸

3.1公式

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

  • min(\frac{1}{2m}[\sum_{i=1}^{m}(h_\theta(x^i)-y^i)^2+\lambda\sum_{j=1}^{n}\theta_j^2]+\lambda\sum_{j=1}^{n}|\theta|)

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)
複製代碼
相關文章
相關標籤/搜索