1. 程式人生 > >python機器學習——正則化

python機器學習——正則化

我們在訓練的時候經常會遇到這兩種情況:

1、模型在訓練集上誤差很大。

2、模型在訓練集上誤差很小,表現不錯,但是在測試集上的誤差很大

我們先來分析一下這兩個問題:

對於第一個問題,明顯就是沒有訓練好,也就是模型沒有很好擬合數據的能力,並沒有學會如何擬合,可能是因為在訓練時我們選擇了較少的特徵,或者是我們選擇的模型太簡單了,不能稍微複雜的擬合數據,我們可以通過嘗試選取更多的特徵、增加一些多項式特徵或者直接選用非線性的較複雜的模型來訓練。

對於第二個問題,可以說是第一個問題的另外一個極端,就是模型對訓練集擬合的太好了,以至於把訓練集資料中的那些無關緊要的特徵或者噪音也學習到了,導致的結果就是當我們使用測試集來評估模型的泛化能力時,模型表現的很差。打個不恰當比方就是你平時把作業都背下來了,但是其實你並沒有學會如何正確解題,所以遇到考試就考的很差。解決方法就是增加訓練集的資料量或者減少特徵數量來嘗試解決。

第一個問題我們叫做欠擬合(underfitting),第二個問題我們叫做過擬合(overfitting)

這兩個問題還存在一種解決方法,就是我接下來要說的正則化。

我們之前說模型學習的過程也就是調整權重引數的過程,通過訓練集中的資料來將模型的權重引數調整到一個使得損失函式最小的值。

對於一個分佈較複雜的樣本,如果訓練得到的權重引數維度太少或者引數過小,也就是特徵項很少,一些重要的特徵沒有起到作用,那麼這條擬合曲線就會變得很簡單,我們看上圖的欠擬合影象,裡面的擬合曲線是一條直線,這就是權重引數維度太少的結果。而如果權重引數維度過多或者引數過大,導致擬合曲線過於複雜,如上圖的過擬合影象,擬合曲線可以完美的將兩類不同的樣本點區分開,但是我們也可以看出這條曲線很複雜,權重引數的項數一定很多。

現在進入正題,對於正則化,我們常見的形式是L2正則:
\[ \frac \lambda 2\lVert w \lVert^2 = \frac \lambda 2 \sum_{j=1}^m{w_j^2} \]
這裡的
\[ \lambda \]
就是正則化係數。

我們將正則項直接新增到損失函式後即可使用,比如對於邏輯迴歸模型,帶有L2正則項的損失函式為:
\[ J(w)=\sum_{i=1}^n\left[-y^{(i)}log(\phi(z^{(i)}))-(1-y^{(i)})log(1-\phi(z^{(i)}))\right] + \frac \lambda 2\lVert w \lVert^2 \]
我們通過控制正則化係數來控制權重引數的大小。一般正則化用於解決模型過擬合的問題,我們的訓練目標是為了使損失函式最小,但是如果權重引數過大會導致過擬合,模型泛化能力下降,那麼為了解決這個問題,將正則項加到損失函式後面,組成一個新的損失函式,為了最小化這個新的損失函式,我們在訓練過程中不僅要使得誤差小,還要保證正則項不能太大,於是如果我們選擇一個較大的正則化係數,那麼為了保證正則項不能太大,就會使得權重引數變小,這也就是我們的最終目的:在保證誤差不大的情況下,使得權重引數也不能太大,緩解了過擬合問題。正則化係數越大,正則化越強,權重引數越小。

所以對於欠擬合的模型,我們也可以嘗試減小正則化係數來增大權重引數,而對於過擬合模型,我們嘗試增大正則化係數來減小權重引數