glmnet

  • 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回歸模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市并级,隨后出現(xiàn)的幾起案子拂檩,更是在濱河造成了極大的恐慌,老刑警劉巖嘲碧,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻励,死亡現(xiàn)場離奇詭異,居然都是意外死亡愈涩,警方通過查閱死者的電腦和手機望抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來履婉,“玉大人煤篙,你說我怎么就攤上這事』偻龋” “怎么了辑奈?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長已烤。 經(jīng)常有香客問我鸠窗,道長,這世上最難降的妖魔是什么胯究? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任稍计,我火速辦了婚禮,結(jié)果婚禮上裕循,老公的妹妹穿的比我還像新娘臣嚣。我一直安慰自己,他們只是感情好剥哑,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布硅则。 她就那樣靜靜地躺著,像睡著了一般星持。 火紅的嫁衣襯著肌膚如雪抢埋。 梳的紋絲不亂的頭發(fā)上弹灭,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天督暂,我揣著相機與錄音,去河邊找鬼穷吮。 笑死逻翁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捡鱼。 我是一名探鬼主播八回,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缠诅?” 一聲冷哼從身側(cè)響起溶浴,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎管引,沒想到半個月后士败,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡褥伴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年谅将,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片重慢。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饥臂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出似踱,到底是詐尸還是另有隱情隅熙,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布核芽,位于F島的核電站猛们,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狞洋。R本人自食惡果不足惜弯淘,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吉懊。 院中可真熱鬧庐橙,春花似錦、人聲如沸借嗽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恶导。三九已至浆竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惨寿,已是汗流浹背邦泄。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裂垦,地道東北人顺囊。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像蕉拢,于是被迫代替她去往敵國和親特碳。 傳聞我的和親對象是個殘疾皇子诚亚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

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