glmnet

  • Glmnet主要用于拟合广义线性模型。筛选可以使loss达到最小的正则化参数lambda。该算法非???,并且可以使用稀疏矩阵作为输入。主要有线性模型用于回归,logistic回归进行分类以及cox模型进行生存分析??梢源幽夂夏P椭凶龀龈髦衷げ?。它也可以拟合多响应线性回归。


    公式

其中l(y,η)是观测i的负对数似然,样本不同的分布具有不同的形式,对于高斯分布可以写为 1/2(y?η)^2,后一项是elastic-net正则化项,beta是需要学习的参数,alpha指定使用Lasso回归(alpha = 1)还是岭回归(alpha = 0)。当我们具有较多的特征时,我们希望进行特征的筛选,Lasso回归会使特征稀疏化,保留部分特征用于构建模型,如果我们不希望舍去任何一个特征,那么便可以使用岭回归。

对于每种模型Glmnet都提供了glmnet用于拟合模型, cv.glmnet使用k折交叉验证拟合模型, predict对数据进行预测(分类/回归),coef用于提取指定lambda时特征的系数。

线性模型

线性回归Glmnet主要包含两类模型。包括gaussian (the Gaussian family)和mgaussian (the multiresponse Gaussian family)。

Gaussian Family

适用于因变量y只有一维的时候

library(glmnet)
data(QuickStartExample)

#首先使用glmnet拟合线性模型,使用alpha = 0.2和20个lambda进行搜索,并给予
#后50个样本更高的权重
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对应的值。

#我们也可以绘图展示根据lambda变化情况每一个特征的系数变化
plot(fit, xvar = "lambda", label = TRUE)

#也可以对%dev绘图
plot(fit, xvar = "dev", label = TRUE)

如果我们在构建模型的过程中想要使用交叉验证,则可以使用cv.glmnet函数,type.measure表示模型的损失函数,默认为均方误差,nfolds指定k的大小,默认是20折交叉验证

cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20)

#这时对模型绘图展示的是不同的结果
plot(cvfit)
  • x轴代表经过log以后的lambda值,y轴代表模型的误差,cv.glmnet会自动选择使误差最小的lambda(左侧的虚线),最小的lambda值保存在cvfit$lambda.min

  • 同时我们也可以使用coef提取每一个特征在指定lambda下的系数,一旦模型训练完成,我们也可以使用predict对新数据进行预测

#提取lambda = 0.5时20个输入特征的系数,· 代表经过L1正则化后这些特征已经被消掉了。
coef.apprx = coef(fit, s = 0.5)

#输出新数据的预测值,type参数允许选择预测的类型并提供预测值
predict(fit, newx = x[1:5,], type = "response", s = 0.05)

Multiresponse Gaussian Family

当我们需要预测多个值时,简单的高斯模型已经不能满足了,这时候我们需要使用family = "mgaussian"拟合模型,即所谓的“多任务学习”问题。

#导入示例数据,包括100例样本,20个特征以及4个输出值
data(MultiGaussianExample)

#参数几乎与普通高斯模型相同,例如alpha、weights、nlambda、standard
mfit = glmnet(x, y, family = "mgaussian")

同样我们可以plot模型的系数

#这里的设置type.coef=“2norm”。在此设置下,每个变量绘制一条曲线,等同于L2
#正则化。默认设置为type.coef=“coef”,为每一个因变量绘制一张系数图
plot(mfit, xvar = "lambda", label = TRUE, type.coef = "2norm")

其余操作与上边没有差别,使用cv.glmnet进行交叉验证,使用predict进行预测以及coef提取系数,不要忘了family = "mgaussian"

Logistic Regression

对于连续变量我们可以拟合GLM并对新样本进行预测,但当输出值为离散变量表示样本的分类情况时,我们就需要使用一种激活函数将输出值限定在0-1之间,用以代表模型输出该样本属于某一类别的概率

Binomial Models

当y仅包含两种分类时可以使用二分类模型,

data(BinomialExample)

#使用family = "binomial"拟合二分类模型
fit = glmnet(x, y, family = "binomial")

对于logistic回归,cv.glmnet具有与高斯模型相似的参数和用法。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时预测新样本的类别,type = "class"指定输出值为类别
predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01))

plot(cvfit)

Multinomial Models

对于多分类问题,其用法类似于二分类logistic回归。

导入数据,包括1,2,3三个类别
data(MultinomialExample)

#拟合模型,其中多项式回归的一个特殊选项是type.multinomal,如果
#type.multinomal=“grouped”,则允许使用分组套索回归。这将确保变量的多项式
#系数都在一起,就像多变量高斯模型一样。
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)

#预测模型
predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class")

请注意,虽然type.multinomal不是cv.glmnet中的参数,但实际上,可以传递给glmnet的任何参数在cv.glmnet的参数列表中都是有效的。我们还使用并行计算来加速计算。在预测过程中,我们只需要在predict中指定type = "class"。

Cox回归

在Glmnet中还可以使用Cox风险比例模型,常用于研究预测变量与生存时间的关系。在通常的生存分析框架中,我们有生存时间以及生存状态(0=alive,1=dead)。

#导入数据
data(CoxExample)

#拟合模型,指定family = "cox"
fit = glmnet(x, y, family = "cox")

plot(fit)
#交叉验证构建模型
cvfit = cv.glmnet(x, y, family = "cox")

plot(cvfit)

总结一下:

  • 当我们构建回归模型时,y为连续变量,指定family = "gaussian/mgaussian"构建广义线性模型,在使用交叉验证cv.glmnet时损失函数选用type.measure = "mse"使用均方误差,使用predict预测新样本时指定type = "response"输出预测值。

  • 当我们构建分类模型时,y为离散变量代表分类数据,指定family = "binomial/multinomial"以及type.multinomial = "grouped"构建逻辑回归模型,在使用交叉验证cv.glmnet时损失函数选用type.measure = "class/auc"使用错配误差或auc(二分类),使用predict预测新样本时指定type = "class"输出预测的类。

  • 当我们构建Cox回归模型时,y为离散变量代表分类数据,指定family = "cox"构建Cox回归模型

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容