ISLR系列:(4.2)模型選擇 Ridge Regression & the Lasso


Linear Model Selection and Regularization

此博文是 An Introduction to Statistical Learning with Applications in R 的系列讀書筆記,作為本人的一份學習總結,也希望和朋友們進行交流學習。

該書是The Elements of Statistical Learning 的R語言簡明版,包含了對算法的簡明介紹以及其R實現,最讓我感興趣的是算法的R語言實現

  【轉載時請注明來源】:http://www.cnblogs.com/runner-ljt/

   Ljt   勿忘初心  無畏未來

   作為一個初學者,水平有限,歡迎交流指正。


       當自變量的維度較高時,一方面可能使得樣本量偏少(p>n),另一方面自變量之間很可能會出現多重共線性現象。多重共線性會導致最小二乘的

回歸系數不穩定,方差較大(這是因為系數矩陣與其轉置矩陣的乘積矩陣不可逆)。收縮法/正則化(shrinkage/regularization)主要是建立包含全體

變量的模型的同時加上對估計系數的限制,即使系數的估計向0收縮。

       嶺回歸從矩陣求解的角度看就是修復病態矩陣X'X,多重共線性導致|X'X|趨於0,那么就給X'X加上一個正常數矩陣 kI (k>0),則X'X+kI接近奇異

的程度就會比X'X接近奇異的程度小得多,從而使回歸系數的估計稍有偏差,但是估計的穩定性卻可能明顯提高;從最小二乘的角度看就是加上一個對

回歸系數的二范數懲罰項的有偏最小二乘。

                                                                                       

                                                       

 

         嶺回歸的一個缺點是在建模時對於引入的全體自變量,罰約束項可以收縮這些變量的待估系數接近0,但並非恰好是0(除非lambda為無窮大),這

對於模型精度影響不大,但給模型的解釋造成了困難。(嶺回歸雖然減少了模型的復雜度,並沒有真正解決變量選擇的問題)    

         Lasso回歸是引入回歸系數的一范數懲罰項的有偏最小二乘回歸,Lasso回歸能夠使得一些變量的系數為零,從而可以實現變量變量選擇的問題。

                                                       

 

       Lasso回歸雖然和嶺回歸的差別在於一個是二范數的約束另一個是一范數的約束,一范數約束能夠使得一些變量的回歸系數變為0,但是由於其不

連續,求解上便比二范數的要困難的多,Lasso全稱為The Least Absolute Shrinkage and Selection Operator,中文翻譯為 ‘套索’ ,是目前很多大

牛研究的熱門領域。

 

      下圖可以解釋Lasso回歸可以使得一些變量的回歸系數為0,而嶺回歸只能使回歸系數趨於0的原因。

 

                                                      

 

 

 


 Ridge Regression and the Lasso

   glmnet(x, y, family=c("gaussian","binomial","poisson","multinomial"),alpha = 1,nlambda = 100,lambda=NULL)

         X:自變量矩陣

         Y:因變量

         family=c("gaussian","binomial","poisson","multinomial") :

              當Y為數值型時,family為 "gaussian" 或 "binomial"

              當Y為兩水平的因子類型時,family為 "binomial"

              當Y為多水平的因子類型時,family為 "multinomial"

         alpha:  0<α<1 : (1-α)/2||β||_2^2+α||β||_1.  ;   alpha=0為嶺回歸,alpha=1為 Lasso回歸

         nlambda : lambda的個數,默認為100個

         lambda:懲罰系數 λ ,可以人工提供,默認為系統提供

    cv.glmnet(x, y, lambda, nfolds):Does k-fold cross-validation for glmnet

    predict(object, newx, s = NULL, type=c("link","response","coefficients","nonzero","class"))

         object :glmnet類

         newx :用於預測的新的X矩陣,該參數不能用於type="coefficients"的情況

         s :用於預測的 lambda

         type:link,response 返回結果為因變量的預測結果;coefficients 返回結果為模型系數,此時不需要參數newx

 

 

> library(ISLR)
> library(glmnet)
> Hitters<-na.omit(Hitters)
> 
> #運用交叉驗證的方法選擇最優的嶺回歸
> set.seed(1) 
> x<-model.matrix(Salary~.,Hitters)[,-1]
> y<-Hitters$Salary
> 
> #交叉驗證的嶺回歸
> cv.out<-cv.glmnet(x,y,alpha=0)
> plot(cv.out)
> 
> names(cv.out)
 [1] "lambda"     "cvm"        "cvsd"       "cvup"       "cvlo"       "nzero"      "name"       "glmnet.fit" "lambda.min" "lambda.1se"
> 
> bestlam<-cv.out$lambda.min
> bestlam
[1] 238.0769
> 
> predict(cv.out,type='coefficients',s=bestlam)
20 x 1 sparse Matrix of class "dgCMatrix"
                       1
(Intercept)  10.35569016
AtBat         0.04633830
Hits          0.96376522
HmRun         0.27163149
Runs          1.10118079
RBI           0.87606196
Walks         1.75331031
Years         0.50454900
CAtBat        0.01124891
CHits         0.06274116
CHmRun        0.43896753
CRuns         0.12471202
CRBI          0.13253839
CWalks        0.03672947
LeagueN      25.75710229
DivisionW   -88.36043520
PutOuts       0.18483877
Assists       0.03847012
Errors       -1.68470904
NewLeagueN    7.91725602
> 
> #交叉驗證的Lasso回歸
> cv.outlas<-cv.glmnet(x,y,alpha=1)
> plot(cv.outlas)
> bestlam<-cv.outlas$lambda.min
> bestlam
[1] 2.935124
> predict(cv.outlas,type='coefficients',s=bestlam)
20 x 1 sparse Matrix of class "dgCMatrix"
                       1
(Intercept)  117.5258439
AtBat         -1.4742901
Hits           5.4994256
HmRun          .        
Runs           .        
RBI            .        
Walks          4.5991651
Years         -9.1918308
CAtBat         .        
CHits          .        
CHmRun         0.4806743
CRuns          0.6354799
CRBI           0.3956153
CWalks        -0.4993240
LeagueN       31.6238174
DivisionW   -119.2516409
PutOuts        0.2704287
Assists        0.1594997
Errors        -1.9426357
NewLeagueN     .        
>  

               

   

        

 

 


免責聲明!

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



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