-
Glmnet主要用于擬合廣義線性模型嗡贺。篩選可以使loss達到最小的正則化參數(shù)lambda业舍。該算法非扯独梗快,并且可以使用稀疏矩陣作為輸入舷暮。主要有線性模型用于回歸态罪,logistic回歸進行分類以及cox模型進行生存分析∠旅妫可以從擬合模型中做出各種預(yù)測复颈。它也可以擬合多響應(yīng)線性回歸。
公式
其中l(y,η)
是觀測i的負對數(shù)似然沥割,樣本不同的分布具有不同的形式耗啦,對于高斯分布可以寫為 1/2(y?η)^2,后一項是elastic-net正則化項机杜,beta是需要學(xué)習(xí)的參數(shù)帜讲,alpha指定使用Lasso回歸(alpha = 1)還是嶺回歸(alpha = 0)。當(dāng)我們具有較多的特征時椒拗,我們希望進行特征的篩選似将,Lasso回歸會使特征稀疏化,保留部分特征用于構(gòu)建模型蚀苛,如果我們不希望舍去任何一個特征在验,那么便可以使用嶺回歸。
對于每種模型Glmnet都提供了glmnet
用于擬合模型, cv.glmnet
使用k折交叉驗證擬合模型, predict
對數(shù)據(jù)進行預(yù)測(分類/回歸)堵未,coef
用于提取指定lambda時特征的系數(shù)腋舌。
線性模型
線性回歸Glmnet主要包含兩類模型。包括gaussian (the Gaussian family)和mgaussian (the multiresponse Gaussian family)渗蟹。
Gaussian Family
適用于因變量y只有一維的時候
library(glmnet)
data(QuickStartExample)
#首先使用glmnet擬合線性模型侦厚,使用alpha = 0.2和20個lambda進行搜索,并給予
#后50個樣本更高的權(quán)重
fit = glmnet(x, y, alpha = 0.2, weights = c(rep(1,50),rep(2,50)), nlambda = 20)
print(fit)
##
## Call: glmnet(x = x, y = y, weights = c(rep(1, 50), rep(2, 50)), alpha = 0.2, nlambda = 20)
##
## Df %Dev Lambda
## 1 0 0.0000 7.9390
## 2 4 0.1789 4.8890
## 3 7 0.4445 3.0110
## 4 7 0.6567 1.8540
## 5 8 0.7850 1.1420
## 6 9 0.8539 0.7033
## 7 10 0.8867 0.4331
## 8 11 0.9025 0.2667
## 9 14 0.9101 0.1643
## 10 17 0.9138 0.1012
## 11 17 0.9154 0.0623
## 12 17 0.9160 0.0384
## 13 19 0.9163 0.0236
## 14 20 0.9164 0.0146
## 15 20 0.9164 0.0090
## 16 20 0.9165 0.0055
## 17 20 0.9165 0.0034
其中%Dev表示模型的可解釋偏差拙徽,值越大表明該模型包括了越多樣本的信息刨沦,Lambda則表示20個Lambda對應(yīng)的值。
#我們也可以繪圖展示根據(jù)lambda變化情況每一個特征的系數(shù)變化
plot(fit, xvar = "lambda", label = TRUE)
#也可以對%dev繪圖
plot(fit, xvar = "dev", label = TRUE)
如果我們在構(gòu)建模型的過程中想要使用交叉驗證膘怕,則可以使用cv.glmnet
函數(shù)想诅,type.measure
表示模型的損失函數(shù),默認為均方誤差,nfolds
指定k的大小来破,默認是20折交叉驗證
cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20)
#這時對模型繪圖展示的是不同的結(jié)果
plot(cvfit)
x軸代表經(jīng)過log以后的lambda值篮灼,y軸代表模型的誤差,
cv.glmnet
會自動選擇使誤差最小的lambda(左側(cè)的虛線)徘禁,最小的lambda值保存在cvfit$lambda.min
中同時我們也可以使用
coef
提取每一個特征在指定lambda下的系數(shù)诅诱,一旦模型訓(xùn)練完成,我們也可以使用predict
對新數(shù)據(jù)進行預(yù)測
#提取lambda = 0.5時20個輸入特征的系數(shù)送朱,· 代表經(jīng)過L1正則化后這些特征已經(jīng)被消掉了娘荡。
coef.apprx = coef(fit, s = 0.5)
#輸出新數(shù)據(jù)的預(yù)測值,type參數(shù)允許選擇預(yù)測的類型并提供預(yù)測值
predict(fit, newx = x[1:5,], type = "response", s = 0.05)
Multiresponse Gaussian Family
當(dāng)我們需要預(yù)測多個值時驶沼,簡單的高斯模型已經(jīng)不能滿足了炮沐,這時候我們需要使用family = "mgaussian"
擬合模型,即所謂的“多任務(wù)學(xué)習(xí)”問題回怜。
#導(dǎo)入示例數(shù)據(jù)大年,包括100例樣本,20個特征以及4個輸出值
data(MultiGaussianExample)
#參數(shù)幾乎與普通高斯模型相同玉雾,例如alpha翔试、weights、nlambda复旬、standard
mfit = glmnet(x, y, family = "mgaussian")
同樣我們可以plot模型的系數(shù)
#這里的設(shè)置type.coef=“2norm”垦缅。在此設(shè)置下,每個變量繪制一條曲線赢底,等同于L2
#正則化失都。默認設(shè)置為type.coef=“coef”柏蘑,為每一個因變量繪制一張系數(shù)圖
plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm")
其余操作與上邊沒有差別幸冻,使用cv.glmnet
進行交叉驗證,使用predict
進行預(yù)測以及coef
提取系數(shù)咳焚,不要忘了family = "mgaussian"
Logistic Regression
對于連續(xù)變量我們可以擬合GLM并對新樣本進行預(yù)測洽损,但當(dāng)輸出值為離散變量表示樣本的分類情況時,我們就需要使用一種激活函數(shù)將輸出值限定在0-1之間革半,用以代表模型輸出該樣本屬于某一類別的概率
Binomial Models
當(dāng)y僅包含兩種分類時可以使用二分類模型碑定,
data(BinomialExample)
#使用family = "binomial"擬合二分類模型
fit = glmnet(x, y, family = "binomial")
對于logistic回歸,cv.glmnet具有與高斯模型相似的參數(shù)和用法又官。nfold延刘、weights、lambda六敬、parallel都可以使用碘赖。在type.measure
中有一些差異:“deviance”代表實際偏差, “mae”代表平均絕對誤差,“class”代表錯配誤差普泡,“auc”(僅適用于二分類邏輯回歸)并給出ROC曲線下的面積播掷。
#交叉驗證
cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "class")
#指定lambda在0.05和0.01時預(yù)測新樣本的類別,type = "class"指定輸出值為類別
predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01))
plot(cvfit)
Multinomial Models
對于多分類問題撼班,其用法類似于二分類logistic回歸歧匈。
導(dǎo)入數(shù)據(jù),包括1砰嘁,2件炉,3三個類別
data(MultinomialExample)
#擬合模型,其中多項式回歸的一個特殊選項是type.multinomal般码,如果
#type.multinomal=“grouped”妻率,則允許使用分組套索回歸。這將確保變量的多項式
#系數(shù)都在一起板祝,就像多變量高斯模型一樣宫静。
fit = glmnet(x, y, family = "multinomial", type.multinomial = "grouped")
#交叉驗證
cvfit=cv.glmnet(x, y, family="multinomial", type.multinomial = "grouped", parallel = TRUE)
#繪圖展示
plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm")
plot(cvfit)
#預(yù)測模型
predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class")
請注意,雖然type.multinomal
不是cv.glmnet
中的參數(shù)券时,但實際上孤里,可以傳遞給glmnet
的任何參數(shù)在cv.glmnet
的參數(shù)列表中都是有效的。我們還使用并行計算來加速計算橘洞。在預(yù)測過程中捌袜,我們只需要在predict
中指定type = "class"
。
Cox回歸
在Glmnet中還可以使用Cox風(fēng)險比例模型炸枣,常用于研究預(yù)測變量與生存時間的關(guān)系虏等。在通常的生存分析框架中,我們有生存時間以及生存狀態(tài)(0=alive适肠,1=dead)霍衫。
#導(dǎo)入數(shù)據(jù)
data(CoxExample)
#擬合模型,指定family = "cox"
fit = glmnet(x, y, family = "cox")
plot(fit)
#交叉驗證構(gòu)建模型
cvfit = cv.glmnet(x, y, family = "cox")
plot(cvfit)
總結(jié)一下:
當(dāng)我們構(gòu)建回歸模型時侯养,y為連續(xù)變量敦跌,指定
family = "gaussian/mgaussian"
構(gòu)建廣義線性模型,在使用交叉驗證cv.glmnet
時損失函數(shù)選用type.measure = "mse"
使用均方誤差逛揩,使用predict
預(yù)測新樣本時指定type = "response"
輸出預(yù)測值柠傍。當(dāng)我們構(gòu)建分類模型時,y為離散變量代表分類數(shù)據(jù)辩稽,指定
family = "binomial/multinomial"
以及type.multinomial = "grouped"
構(gòu)建邏輯回歸模型惧笛,在使用交叉驗證cv.glmnet
時損失函數(shù)選用type.measure = "class/auc"
使用錯配誤差或auc(二分類),使用predict
預(yù)測新樣本時指定type = "class"
輸出預(yù)測的類逞泄。當(dāng)我們構(gòu)建Cox回歸模型時患整,y為離散變量代表分類數(shù)據(jù)静檬,指定
family = "cox"
構(gòu)建Cox回歸模型