機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

筆者介紹

曾擔任零售企業項目負責人,負責企業數據化轉型,數據化管理;曾服務中國移動,負責客服部門產品推薦模型組組長;現於某金融投資公司大數據中心,負責風控數據建設,風控建模工作。在除工作外,也喜歡在DC、DF、天池、Kaggle參加一些比賽。機器學習方面,有一定經驗,願與各位分享我的所見所聞所想,與各位共同進步。

正則化是什麼?

上文提及線性迴歸,提到了線性迴歸會有多重共線性的問題,同時模型免不了面臨過擬合的問題

多重共線性:看上一篇文章,機器學習系列-線性迴歸

過擬合:數據過度學習數據集,不能進行很好的泛化(不能很好的使用在其他的數據上);過擬合可以有兩種情況:

1.樣本分佈有偏,或樣本太少。

假設有1000套房子,按房子所處位置可以分為奢華地段,普通地段,貧困地段;

那不同地段可以有不同的房價水平,按照上文,房價=係數*面積

那不同的地段係數會有略微不同,但是整體還在一個水平,當我們構建的數據樣本分佈有偏,偏向於奢華地段的房子(比如800套奢華,100套普通,100套貧困)那模型結果就偏向奢華,但是實際情況房子分佈水平可能是3:3:4的情況,那這個模型就過擬合了奢華地段的房子,所以模型整體效果會因為過擬合而偏低。

此時,擴大樣本容量,是為了更多的接近總體分佈。

2.模型太複雜。

由於樣本模型太複雜,對於樣本的擬合能力太強,我們希望模型學習通用的統計結果,但是複雜模型更容易把特殊的情況也學習了,比如,在某一個地區的貧民地段因為拆遷,房價很高,這是一個異常值,而模型卻把這個地區的情況學習了,導致貧民地段房價預測偏高,擬合結果出現較大差異。

此時,通過正則化,是為了降低模型複雜性。

所以,解決過擬合,兩個方向,一個是加樣本,另一個是減少模型複雜性,另外還有其他一些方法(交叉驗證等)。一般情況下,加樣本是很難的,現實情況下,數據往往不夠用。所以這個時候我們更需要正則化。

注:做模型時,要注意樣本和總體關係,考慮樣本是否能代表總體(分類變量看用卡方分佈檢驗,連續變量用t檢驗

嶺迴歸&Lasso迴歸和正則有什麼關係?

常用的正則表達式有L1,L2:

L1正則表達式:

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

L1正則表達式

L2正則表達式:

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

L2正則表達式

Lk正則表達式:

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

Lk正則表達式

機器學習把L1和L2叫正則化,統計學領域叫懲罰項,數學領域叫範數。

實際上,嶺迴歸和Lasso迴歸就是在線性迴歸模型的基礎上加上不同的正則因子,以降低模型複雜度來優化模型。

Lasso迴歸使用的是L1,嶺迴歸使用的是L2

Lasso迴歸

Lasso迴歸是在線性迴歸的公式上直接加上L1正則懲罰性:

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

Lasso迴歸

嶺迴歸

嶺迴歸是在線性迴歸的公式上直接加上L2正則懲罰性:

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

嶺迴歸

正則化項怎麼進行調節?

從Lasso迴歸和嶺迴歸我們可以看到,實際上就是線性迴歸加一個懲罰因子,所以最終的模型不僅僅要考慮 y_true-y_prediction 最小,還要考慮懲罰項

正則項其實就是線性變量的係數組合

如果,係數過大,那麼變量的小變動,會導致,整個預測結果有較大變化

假如,y=bx,b=10000,當x從1001變為1003,y增加了20000

如果,係數過小,那麼變量的小變動,會導致,整個預測結果沒有什麼變化

假如,y=bx,b=1,當x從1001變為1003,y增加了2

我們希望係數不宜過大,也不宜太小,我們可以通過λ進行調節懲罰項大小,同時也注意避免λ過大造成的欠擬合

  • λ值為0:損失函數將與原來損失函數一樣(即最小二乘估計形式),說明對參數權重
    β沒有任何懲罰。
  • λ為無窮大:在懲罰係數λ無窮大的情況下,為保證整個結構風險函數最小化,只能通過最小化所有權重係數β達到目的了,即通過λ的懲罰降低了參數的權重值,而在降低參數權重值的同時我們就實現了降低模型複雜度的效果。

嶺迴歸&Lasso迴歸的區別

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

Lasso&嶺迴歸

此處瞭解一下,不必深究有偏和無偏的概念

1. 線性迴歸求解為無偏估計,解為最小二乘解(紅點)

2.嶺迴歸&Lasso迴歸為有偏估計,解為圓和正則項交點(黃點)

從圖形上看,嶺迴歸解沿著正則項,正則項也為圓形,隨著正則懲罰因子的變大,係數只會無限接近0而不會等於0,Lasso則可以沿著菱形到達0,所以L1也可以用來做變量選擇,用來將弱變量剔除。

L1對於異常數據的容忍度高於L2,L1是照顧大部分的樣本,L2是照顧所有的樣本

怎麼理解這句話呢?當有異常時,L2的波動變化較大,會放大異常值的大小,會使得模型更加不穩定。

當有異常值的時候,我們希望加大懲罰來抵消干擾。

當有異常時,

y_true-y_prediction 的值會變大,此時需要加入更多的正則懲罰,而L2是係數的平方,加入的誤差項是指數型增長的,此時可能放入更多也可能更少誤差。(相對於L1)

隨著我們對λ的調整,加入的正則項不穩定。當加入的誤差越大,則會模型會做出更大的調整以應對該異常,從而犧牲到其他正常樣本而L1是線性增長,相對來說會更穩定,所以從下圖上看,紅線L1總體穩定性會相對於藍色L2更加穩定。

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)

藍色:嶺迴歸,紅色:Lasso迴歸 y:誤差,x:正則大小

嶺迴歸&Lasso迴歸對於多重共線性的影響?

上文提及,嶺迴歸和Lasso迴歸能夠降低多重共線性的影響。共線性得影響是不能消除,只能降低

當對各個變量加入正則懲罰項時,會漸弱變量間的關係。

另一方面,通過增加樣本間,變量間的差異,使得求解時多重共線性的非滿秩矩陣變為滿秩矩陣,從而可以更好的求解。

係數解:

θ = (XTX+λI)−1XTY

變為 :

θ = (XTX+Lk I)−1XTY

Lk為正則因子,I為單位矩陣

下章再介紹如何使用python的sklearn使用Lasso迴歸和嶺迴歸

本次分享到此為止,後續將繼續分享,如對您有幫助,請關注並轉發支持謝謝。

機器學習系列-嶺迴歸&Lasso迴歸(Python.RidgeCV&Lasso)


分享到:


相關文章: