今晚在練習kaggle時遇到了彈性網絡回歸,花了些時間簡單查了一些資料,,算是稍微理解了些。
要想理解ElasticNet回歸,,正則化是必須要首先知道的,,其次是嶺回歸和Lasso回歸,知道了這些,,彈性網回歸自然也就明白了,。
首先來看正則化:
假設我們都知道利用最小二乘法來做線性回歸,最小二乘法回歸成功的條件是(我得承認以下的所有圖都是我盜的):
即上面這個函數(損失函數,,目前也是目標函數)達到最小值,,可得到最優(yōu)的擬合參數(即θ )。
但是存在這樣一種情況,,如果我們用來擬合的自變量過多(或者說特征變量過多),,而且特征變量之前存在很高的相關關系,比如下面這種情況:
以上兩個函數都可以很好的擬合數據,,但右邊的函數顯然有過擬合的嫌疑,,為了避免這種情況,有兩種方法:1,、舍掉x^3和x^4這兩個變量(這就是所謂的特征選擇,,舍棄無用的特征變量??梢匀斯みx擇,,也可以利用算法來做。但有些時候我們可能并不希望舍棄數據,,一方面特征選擇有一定的不確定性,,另一方面這個過程是比較繁瑣的,這種時候我們可以采用第二種方法來解決這一問題,。),;2、減小θ3和θ4的值(即正則化,保留所有特征變量,,但減少變量參數的值),。
要減小θ3和θ4的值,我們可以在損失函數的后面加上(1000*θ3^2+1000*θ4^2) , :
如此一來在最小化目標函數時,,因為θ3和θ4前面乘了1000這樣大的數字,,導致θ3和θ4的值會非常的小,目標達成,。
上面我們有選擇的讓θ3和θ4的值變小,,實際情況中,我們很難判斷哪些特征變量需要正則化,,所以一般情況下,,我們是對所有的參數都正則化處理:
即目標函數設為J(θ),其中:
是正則項,,lambda為正則參數,。需要注意的是,j是從1開始的,,這意味著函數的常數項(θ0)并沒有被正則化,。所以lambda不能設的太大,否則會導致除了常數項外,,所有的參數值都很小,,因變量近似等于常數項,出現欠擬合現象,。
OK,, 正則化介紹到此為止,來看看嶺回歸和Lasso回歸:
嶺回歸的目標函數就是上面介紹的J(θ):
如果矩陣化的話,,也寫成:
即最小化loss函數+penalty函數,,其中β就是θ(懶得編寫公式,直接盜的圖)
Lasso回歸和嶺回歸的區(qū)別在于懲罰項的不同:
Lasso回歸的懲罰項用的是絕對值(也稱為L1正則化),,而不是嶺回歸中的平方(L2正則化),。
再來看看ElasticNet回歸,目標函數為:
也就是嶺回歸和Lasso回歸的組合,。
Python實現ElasticNet回歸,,有sklearn.linear_model.ElasticNetCV和sklearn.linear_model.ElasticNet兩個函數可供選擇,前者可以通過迭代選擇最佳的lambda1和lambda2(當然你可以指定一組值),,后者需要你指定lambda1和lambda2的值,。
因為目標函數的形式是:
所以lambda1和lambda2的指定是通過l1_ratio和alpha來完成
附上代碼:
參考網頁:
|
|