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 . >