多元線性回歸模型的特征壓縮:嶺回歸和Lasso回歸

多元線性回歸模型中捺癞,如果所有特征一起上夷蚊,容易造成過擬合使測試數(shù)據(jù)誤差方差過大;因此減少不必要的特征髓介,簡化模型是減小方差的一個(gè)重要步驟箱歧。除了直接對特征篩選豹绪,來也可以進(jìn)行特征壓縮蝉衣,減少某些不重要的特征系數(shù)钓辆,系數(shù)壓縮趨近于0就可以認(rèn)為舍棄該特征。

嶺回歸(Ridge Regression)和Lasso回歸是在普通最小二乘線性回歸的基礎(chǔ)上加上正則項(xiàng)以對參數(shù)進(jìn)行壓縮懲罰。

首先乘粒,對于普通的最小二乘線性回歸旦棉,它的代價(jià)函數(shù)是:

線性回歸RSS

通過擬合系數(shù)β來使RSS最小剂娄。方法很簡單幼苛,求偏導(dǎo)利用線性代數(shù)解方程組即可鄙煤。

根據(jù)線性代數(shù)的理論可知凉馆,只要樣本量合適锥腻,它就存在唯一解奇唤,也就是該模型的最優(yōu)解。

這么做盡管使RSS達(dá)到了最小懈贺,它還是把所有的特征看作同樣重要的程度來求解堡妒,并沒有做任何特征選擇的诵,因此存在過擬合的可能。

嶺回歸在OLS回歸模型的RSS上加上了懲罰項(xiàng)(l2范數(shù)),這樣代價(jià)函數(shù)就成為:

嶺回歸的代價(jià)函數(shù)

λ是一個(gè)非負(fù)的調(diào)節(jié)參數(shù),可以看到:當(dāng)λ=0時(shí)瞻讽,此時(shí)它與RSS一致,沒有起到任何懲罰作用哼勇;當(dāng)λ -> ∞時(shí)楣嘁,它的懲罰項(xiàng)也就是無窮大逐虚,而為了使代價(jià)函數(shù)最小买雾,只能壓縮系數(shù)β趨近于0晃危。

但是因?yàn)棣瞬豢赡転闊o窮大鳍鸵,二次項(xiàng)求偏導(dǎo)時(shí)總會保留變量本身,所以事實(shí)上它也不可能真正地將某個(gè)特征壓縮為0。盡管系數(shù)較小可以有效減小方差丧枪,但依然留著一大長串特征會使模型不便于解釋恋博。這是嶺回歸的缺點(diǎn)。

lasso回歸的正項(xiàng)則就把二次項(xiàng)改成了一次絕對值(l1范數(shù)),具體為:

lasso回歸的代價(jià)函數(shù)

一次項(xiàng)求導(dǎo)可以抹去變量本身,因此lasso回歸的系數(shù)可以為0。這樣可以起來真正的特征篩選效果。

無論對于嶺回歸還是lasso回歸督怜,本質(zhì)都是通過調(diào)節(jié)λ來實(shí)現(xiàn)模型誤差vs方差的平衡調(diào)整屉凯。

訓(xùn)練構(gòu)建嶺回歸模型

> library(ISLR)
> Hitters = na.omit(Hitters)
> x = model.matrix(Salary~., Hitters)[,-1] # 構(gòu)建回歸設(shè)計(jì)矩陣
> y = Hitters$Salary
> 
> library(glmnet)
> grid = 10^seq(10,-2,length = 100) # 生成100個(gè)λ值
> ridge.mod = glmnet(x,y,alpha = 0,lambda = grid) # alpha為0表示嶺回歸模型灌旧,為1表示lasso回歸模型
> 
> dim(coef(ridge.mod)) # 20*100的系數(shù)矩陣稼稿。20是19個(gè)特征+截距項(xiàng)硬猫,100是λ值
[1]  20 100
> 
> # 顯然可見l2范數(shù)越大衬横,系數(shù)就越小
> ridge.mod$lambda[50]
[1] 11497.57
> coef(ridge.mod)[,50]
  (Intercept)         AtBat          Hits         HmRun          Runs 
407.356050200   0.036957182   0.138180344   0.524629976   0.230701523 
          RBI         Walks         Years        CAtBat         CHits 
  0.239841459   0.289618741   1.107702929   0.003131815   0.011653637 
       CHmRun         CRuns          CRBI        CWalks       LeagueN 
  0.087545670   0.023379882   0.024138320   0.025015421   0.085028114 
    DivisionW       PutOuts       Assists        Errors    NewLeagueN 
 -6.215440973   0.016482577   0.002612988  -0.020502690   0.301433531 
> ridge.mod$lambda[60]
[1] 705.4802
> coef(ridge.mod)[,60]
 (Intercept)        AtBat         Hits        HmRun         Runs 
 54.32519950   0.11211115   0.65622409   1.17980910   0.93769713 
         RBI        Walks        Years       CAtBat        CHits 
  0.84718546   1.31987948   2.59640425   0.01083413   0.04674557 
      CHmRun        CRuns         CRBI       CWalks      LeagueN 
  0.33777318   0.09355528   0.09780402   0.07189612  13.68370191 
   DivisionW      PutOuts      Assists       Errors   NewLeagueN 
-54.65877750   0.11852289   0.01606037  -0.70358655   8.61181213 
> 
> # 輸入一個(gè)新的λ,比如50,來預(yù)測系數(shù)
> predict(ridge.mod,s=50,type="coefficients")[1:20,]
  (Intercept)         AtBat          Hits         HmRun          Runs 
 4.876610e+01 -3.580999e-01  1.969359e+00 -1.278248e+00  1.145892e+00 
          RBI         Walks         Years        CAtBat         CHits 
 8.038292e-01  2.716186e+00 -6.218319e+00  5.447837e-03  1.064895e-01 
       CHmRun         CRuns          CRBI        CWalks       LeagueN 
 6.244860e-01  2.214985e-01  2.186914e-01 -1.500245e-01  4.592589e+01 
    DivisionW       PutOuts       Assists        Errors    NewLeagueN 
-1.182011e+02  2.502322e-01  1.215665e-01 -3.278600e+00 -9.496680e+00 
> 
> # 劃分訓(xùn)練集和測試集
> set.seed(1)
> train = sample(1:nrow(x),nrow(x)/2)
> test = (-train)
> y.test = y[test]
> 
> # 訓(xùn)練模型,并計(jì)算λ=4時(shí)的MSE
> ridge.mod = glmnet(x[train,],y[train],alpha = 0,lambda = grid,thresh = 1e-12)
> ridge.pred = predict(ridge.mod,s=4,newx = x[test,])
> mean((ridge.pred - y.test)^2)
[1] 101036.8
> 
> # 增大λ為10的10^10艾疟,此時(shí)可視為各個(gè)特征都被壓縮趨近為0,基本只剩截距項(xiàng)起作用
> ridge.pred = predict(ridge.mod,s=1e10,newx = x[test,])
> mean((ridge.pred - y.test)^2) # MSE更大
[1] 193253.1
> 
> # 計(jì)算當(dāng)λ=0也就是不加懲罰的最小二乘回歸
> ridge.pred = predict(ridge.mod,s=0,newx = x[test,])
> mean((ridge.pred - y.test)^2) # MSE減小
[1] 114723.6
> 
> ## 以上結(jié)果說明锅劝,如果λ選得不合適饥瓷,結(jié)果不一定就比最小二乘回歸模型更優(yōu)线定。至于怎么選擇λ,就用交叉驗(yàn)證法艺普。
> 
> set.seed(1)
> cv.out = cv.glmnet(x[train,],y[train],alpha=0)
> plot(cv.out)
> bestlam = cv.out$lambda.min
> bestlam # MSE最小的λ約為212
[1] 211.7416
> 
> ridge.pred = predict(ridge.mod,s=bestlam,newx = x[test,])
> mean((ridge.pred - y.test)^2) # MSE減小
[1] 96015.51
> 
> # 基于整個(gè)數(shù)據(jù)集構(gòu)建嶺回歸模型
> out = glmnet(x,y,alpha = 0)
> predict(out,type = "coefficients",s=bestlam)[1:20,]
 (Intercept)        AtBat         Hits        HmRun         Runs 
  9.88487157   0.03143991   1.00882875   0.13927624   1.11320781 
         RBI        Walks        Years       CAtBat        CHits 
  0.87318990   1.80410229   0.13074381   0.01113978   0.06489843 
      CHmRun        CRuns         CRBI       CWalks      LeagueN 
  0.45158546   0.12900049   0.13737712   0.02908572  27.18227535 
   DivisionW      PutOuts      Assists       Errors   NewLeagueN 
-91.63411299   0.19149252   0.04254536  -1.81244470   7.21208390 
> 
> ## 可見嶺回歸模型還是19個(gè)特征舌界,沒有舍棄任何特征猾普!

cv.out的圖如下:

cv.out

當(dāng)log(λ)為5.+時(shí)(log(bestlam)=5.3)仆葡,MSE最小南窗。

訓(xùn)練構(gòu)建lasso回歸模型

> lasso.mod = glmnet(x[train,],y[train],alpha = 1,lambda = grid)
> plot(lasso.mod) # 可見有些特征的系數(shù)確實(shí)可以為0
> 
> set.seed(1)
> cv.out = cv.glmnet(x[train,],y[train],alpha =1)
> plot(cv.out)
> bestlam = cv.out$lambda.min
> bestlam # MSE最小的λ約為16
[1] 16.78016
> lasso.pred = predict(lasso.mod,s=bestlam,newx = x[test,])
> mean((lasso.pred-y.test)^2)
[1] 100743.4
> 
> ## 可見lasso回歸模型與嶺回歸模型MSE差不多,甚至嶺回歸模型的MSE更小一些氧映。
> 
> out = glmnet(x,y,alpha = 1,lambda = grid)
> lasso.coef = predict(out,type="coefficients",s=bestlam)[1:20,]
> lasso.coef
 (Intercept)        AtBat         Hits        HmRun         Runs 
  18.5394844    0.0000000    1.8735390    0.0000000    0.0000000 
         RBI        Walks        Years       CAtBat        CHits 
   0.0000000    2.2178444    0.0000000    0.0000000    0.0000000 
      CHmRun        CRuns         CRBI       CWalks      LeagueN 
   0.0000000    0.2071252    0.4130132    0.0000000    3.2666677 
   DivisionW      PutOuts      Assists       Errors   NewLeagueN 
-103.4845458    0.2204284    0.0000000    0.0000000    0.0000000 
> 
> ## 可見lasso回歸模型中哈打,有12個(gè)特征系數(shù)被壓縮至0料仗。相對于嶺回歸模型立轧,這里的lasso回歸模型以犧牲一部分的準(zhǔn)確度為代價(jià)比伏,換取更簡潔的模型,增加模型的可解釋性摩窃。這是lasso回歸的優(yōu)勢。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鼓鲁,隨后出現(xiàn)的幾起案子蕴轨,更是在濱河造成了極大的恐慌,老刑警劉巖骇吭,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橙弱,死亡現(xiàn)場離奇詭異,居然都是意外死亡燥狰,警方通過查閱死者的電腦和手機(jī)棘脐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龙致,“玉大人蛀缝,你說我怎么就攤上這事【坏保” “怎么了内斯?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長像啼。 經(jīng)常有香客問我俘闯,道長,這世上最難降的妖魔是什么忽冻? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任真朗,我火速辦了婚禮,結(jié)果婚禮上僧诚,老公的妹妹穿的比我還像新娘遮婶。我一直安慰自己,他們只是感情好湖笨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布旗扑。 她就那樣靜靜地躺著,像睡著了一般慈省。 火紅的嫁衣襯著肌膚如雪臀防。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天边败,我揣著相機(jī)與錄音袱衷,去河邊找鬼。 笑死笑窜,一個(gè)胖子當(dāng)著我的面吹牛致燥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播排截,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫌蚤,長吁一口氣:“原來是場噩夢啊……” “哼辐益!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搬葬,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤荷腊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后急凰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體女仰,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年抡锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疾忍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡床三,死狀恐怖一罩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撇簿,我是刑警寧澤聂渊,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站四瘫,受9級特大地震影響汉嗽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜找蜜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一饼暑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洗做,春花似錦弓叛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畦徘,卻和暖如春毕籽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旧烧。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工影钉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留画髓,地道東北人掘剪。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像奈虾,于是被迫代替她去往敵國和親夺谁。 傳聞我的和親對象是個(gè)殘疾皇子廉赔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容