機器學習基礎---過擬合問題及正則化技術


到現在為止,我們已經學習了幾種不同的學習算法,包括線性回歸和邏輯回歸,它們能夠有效地解決許多問題,但是當將它們應用到某些特定的機器學習應用時,會遇到過擬合(over-fitting)的問題,可能會導致它們效果很差。

一:過度擬合問題

(一)線性回歸中的過擬合問題

繼續使用線性回歸來預測房價的例子,我們通過建立以住房面積為自變量的函數來預測房價。

1.我們可以用一次函數擬合數據,這樣我們可以獲取擬合數據的這樣一條直線。

但是這不是一個很好的模型,通過數據可以明顯的看出隨着數據房子面積的增大,住房價格逐漸穩定。---越往后越平緩。

所以該算法沒有很好的擬合訓練集。我們把這個問題稱為欠擬合(underfitting)。這個問題的另一個術語叫做高偏差(bias)

這兩種說法大致相似,意思是它只是沒有很好地擬合訓練數據。

它的意思是如果擬合一條直線到訓練數據,就好像算法有一個很強的偏見或者說非常大的偏差,因為該算法認為房子價格與面積僅僅線性相關。
與實際數據規律不符合,先入為主的擬合一條直線,最終導致擬合數據效果很差。

2.使用二階函數更好的擬合訓練集

3.使用高階函數,似乎很好的擬合了訓練集(經過了所有的數據點),但是這是一條扭曲的曲線。事實上我們並不認為這是一個好的模型,這個問題我們稱之為過度擬合(高方差)

(二)過擬合帶來的問題

如果我們擬合一個高階多項式,那么這個函數能很好的擬合訓練集,能擬合幾乎所有的訓練數據。這就面臨可能的函數,太過龐大,變量太多的問題。

同時如果我們沒有足夠的數據,去約束這個變量過多的模型,那么這就是過度擬合。

概括的說:過度擬合的問題,將會在變量過多的時候出現,這時訓練出的假設能很好的擬合訓練集。所以,代價函數實際上可能非常接近於0。

但是你可能會得到這樣的曲線:

它雖然可以很好的擬合訓練集,但是會導致它無法泛化到新的樣本中,無法預測新樣本的價格

泛化:一個假設模型應用到新樣本的能力

新樣本的數據:沒有出現在訓練集的數據

(三)邏輯回歸中的過擬合問題

圖一:不能很好的擬合數據---欠擬合

圖二:很好的擬合了數據

圖三:千方百計的找到一個判定邊界,來擬合訓練數據---過擬合

(四)發現了過擬合問題,應該如何處理?

1.丟棄一些不能幫助我們正確預測的特征(減少特征變量)。可以是手工選擇保留哪些特征,或者使用一些模型選擇的算法來幫忙(例如PCA)---可以有效的減少過擬合的發生,但是也可能丟棄關於問題的一些信息

2.正則化。 保留所有的特征,但是減少量級或者參數θ_j的大小(magnitude)。---因為很可能我們的每一個特征變量都是有一定用的,因此我們不希望舍棄這些特征變量。

二:代價函數---正則化是怎樣運行的?

(一)正則化前提了解

當我們進行正則化的時候,我們還將寫出相應的代價函數。

由前面可以知道,下面兩種擬合方式,第一個可以很好的擬合訓練集,第二個則是過擬合(泛化得不好)

而我們想要保留所有得特征,那應該如何做?

我們不妨在函數中加入懲罰項。使得參數θ_3和θ_4都非常小---看后面1000*  看下

這是我們得優化目標。 我們要最小化其均方誤差代價函數。----優化目標(代價函數)不等於假設函數(但是對其有影響)

我們對上面得函數進行了一些修改,對於θ_3方和θ_4方乘以一個很大的數(比如1000)

假如我們要最小化這個函數,那么要使修改后的函數盡可能的小的方法只有一個:就是θ_3和θ_4盡可能的小(這些參數越小,我們得到的函數就會越平滑,也簡單)    啟上

就好像省略的θ_3和θ_4這兩項一樣,那么這個函數還是相當於二次函數:最后我們擬合數據的函數,實際上還是一個二次函數

那么,這就是一種很好的假設模型。

在該例子中,可以看到,加入了懲罰項,增大兩個參數所帶來的效果。

總的來說:這就是正則化背后的思想。

(二)正則化理解

比如:我們有很多特征變量(這里101個),我們並不知道誰的相關性比較小,那么我們應該決定縮小哪一個特征變量呢?

正則化處理:直接修改代價函數,在后面添加一個新的項(額外的正則化項)---來縮小每一個參數,從θ_1到θ_100(約定),實際上假設θ_0也沒有影響

 

其中入是正則化參數---控制兩個不同目標之間的取舍(平衡關系):

第一個目標:與目標函數的第一項有關,該目標是想要更好的擬合數據,訓練集

第二個目標:與目標函數第二項(正則化項)有關,該目標就是要保持參數盡量的小

從而簡化模型,避免過擬合的情況。 

如果正則化參數入設置過大:結果會導致對正則化項中的參數θ_j的懲罰程度太大。導致這些參數都會接近於0

這樣的話,就相當於把假設函數的全部項都忽略掉了。導致假設模型最后只剩下一個θ_0。

導致使用一條直線去擬合訓練集,導致欠擬合。

所以為了讓正則化起到好的效果,我們應該去選擇一個更加合適的正則化參數入。

三:線性回歸中的正則化 

對於線性回歸的求解,我們之前推導了兩種學習算法: 

一種基於梯度下降

一種基於正規方程

這里,我們將繼續學習這兩個算法,並把它們推廣到正則化線性回歸中去。

這是我們之前學到的,正則化線性回歸的代價函數。

(一)梯度下降法

如果我們要使用梯度下降法令這個代價函數最小化,因為我們未對θ_0進行正則化,所以梯度下降算法將分兩種情形:

對上面兩種情況進行合並簡化:

其中α一般很小,而m比較大。所以會導致1-α入/m接近1:比如可以想成0.99

只是把θ_j變小的速度降低了。其他的沒有太大區別。

其優點:可以看出,正則化線性回歸的梯度下降算法的變化在於,每次都在原有算法更新規則的基礎上令值減少了一個額外的值。

(二)正規方程

含推導過程:https://www.cnblogs.com/ssyfj/p/12791935.html---就是將代價函數的偏導求0,即可。

其中X是一個m*(n+1)維矩陣,y會是一個m維向量。

其中m是訓練樣本數量,n是特征變量數。n+1是因為我加的這個額外的特征變量x0。

上面的正規方程,還是沒有正則化項的。

正則化處理:

正則化處理:不可逆問題

 

其實就是,C=AB,r(C)<=min(A,B)<=m,由於m<n,這里的C是XT*X,為(n+1)*(n+1)的矩陣,秩最大為m所以不可逆

其中當入>0時,后面的矩陣的秩=n,與前面的XTX相加,可以解決一些不可逆問題。

四:邏輯回歸中的正則化

針對邏輯回歸問題,已經學習過兩種優化算法:

1.我們首先學習了使用梯度下降法來優化代價函數J(θ)

2.接下來學習了更高級的優化算法,這些高級優化算法需要自己設計代價函數J(θ)

使用正則化改進這兩種算法 。

(一)正則化解決邏輯回歸過擬合問題

可以很好的區分正樣本和負樣本。

代碼實現:

import numpy as np
def costReg(theta, X, y, learningRate):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
    second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
    reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:theta.shape[1]],2))
    return np.sum(first - second) / (len(X)) + reg

(二)正則化改進梯度下降法

與線性回歸不同之處就在於假設函數的不同。

(三)在高級算法中使用正則化

對於高級算法,我們想要自己定義一個costFunction函數:---使用fminuc函數調用函數costFunction或者其他高級優化函數

這個函數以參數向量θ為輸入 。

返回:實現正則化代價函數:

返回:梯度求取:

總之:對於θ_j(j>0)來說,其梯度偏導為:

注意:

(一)雖然正則化的邏輯回歸中的梯度下降和正則化的線性回歸中的表達式看起來一樣,但由於兩者的h_θ(x)不同所以還是有很大差別。

(二)θ_0不參與其中的任何一個正則化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM