-
Glmnet主要用于拟合广义线性模型。筛选可以使loss达到最小的正则化参数lambda。该算法非常快,并且可以使用稀疏矩阵作为输入。主要有线性模型用于回归,logistic回归进行分类以及cox模型进行生存分析。可以从拟合模型中做出各种预测。它也可以拟合多响应线性回归。
公式
其中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回归模型
网友评论