想要理解什麼是正則化,首先咱們先來了解上圖的方程式。當訓練的特徵和數據不多時,每每會形成欠擬合的狀況,對應的是左邊的座標;而咱們想要達到的目的每每是中間的座標,適當的特徵和數據用來訓練;但每每現實生活中影響結果的因素是不少的,也就是說會有不少個特徵值,因此訓練模型的時候每每會形成過擬合的狀況,如右邊的座標所示。python
以圖中的公式爲例,每每咱們獲得的模型是:git
爲了可以獲得中間座標的圖形,確定是但願θ3和θ4越小越好,由於這兩項越小就越接近於0,就能夠獲得中間的圖形了。github
對應的損失函數也加上這個懲罰項(爲了懲罰θ):假設λ=1000微信
爲了求得最小值,使θ值趨近於0,這就達到了咱們的目的,獲得中間座標的方程。機器學習
把以上公式通用化得:函數
至關於在原始損失函數中加上了一個懲罰項(λ項)學習
這就是防止過擬合的一個方法,一般叫作L2正則化,也叫做嶺迴歸。測試
咱們能夠簡化L2正則化的方程:3d
J0表示原始的損失函數,我們假設正則化項爲:code
咱們不妨回憶一下圓形的方程:
其中(a,b)爲圓心座標,r爲半徑。那麼通過座標原點的單位元能夠寫成:
正和L2正則化項同樣,同時,機器學習的任務就是要經過一些方法(好比梯度降低)求出損失函數的最小值。
此時咱們的任務變成在L約束下求出J0取最小值的解。
求解J0的過程能夠畫出等值線。同時L2正則化的函數L也能夠在w1w2的二維平面上畫出來。以下圖:
L表示爲圖中的黑色圓形,隨着梯度降低法的不斷逼近,與圓第一次產生交點,而這個交點很難出如今座標軸上。
這就說明了L2正則化不容易獲得稀疏矩陣,同時爲了求出損失函數的最小值,使得w1和w2無限接近於0,達到防止過擬合的問題。
只要數據線性相關,用LinearRegression擬合的不是很好,須要正則化,能夠考慮使用嶺迴歸(L2), 如何輸入特徵的維度很高,並且是稀疏線性關係的話, 嶺迴歸就不太合適,考慮使用Lasso迴歸。
L1正則化與L2正則化的區別在於懲罰項的不一樣:
L1正則化表現的是θ的絕對值,變化爲上面提到的w1和w2能夠表示爲:
求解J0的過程能夠畫出等值線。同時L1正則化的函數也能夠在w1w2的二維平面上畫出來。以下圖:
懲罰項表示爲圖中的黑色棱形,隨着梯度降低法的不斷逼近,與棱形第一次產生交點,而這個交點很容易出如今座標軸上。這就說明了L1正則化容易獲得稀疏矩陣。
L1正則化(Lasso迴歸)可使得一些特徵的係數變小,甚至還使一些絕對值較小的係數直接變爲0,從而加強模型的泛化能力 。對於高緯的特徵數據,尤爲是線性關係是稀疏的,就採用L1正則化(Lasso迴歸),或者是要在一堆特徵裏面找出主要的特徵,那麼L1正則化(Lasso迴歸)更是首選了。
ElasticNet綜合了L1正則化項和L2正則化項,如下是它的公式:
ElasticNet在咱們發現用Lasso迴歸太過(太多特徵被稀疏爲0),而嶺迴歸也正則化的不夠(迴歸係數衰減太慢)的時候,能夠考慮使用ElasticNet迴歸來綜合,獲得比較好的結果。
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)
.
.
.
歡迎添加微信交流!請備註「機器學習」。