R中的交叉验证套索回归


10

R函数cv.glm(库:引导)为广义线性模型计算估计的K折交叉验证预测误差,并返回增量。使用此函数进行套索回归(库:glmnet)是否有意义?如果是,如何进行?glmnet库使用交叉验证来获得最佳的车削参数,但是我没有找到任何交叉验证最终glmnet方程的示例。


2
这当然是有道理的,尽管LASSO仅对一个(超)参数进行了优化,但是,如果要获得最佳估计,就可以实现超出样本的性能,则需要外部交叉验证循环。请参阅您是否可以通过使用CV / Bootstrap训练机器学习算法来过度拟合?和引用的论文。
Scortchi-恢复莫妮卡

建议使用glmnet而不是glm esp。如果您正在做简历。如果我记得,glm包的使用会很痛苦。而且,cv.glmnet比cv.glm公开更多的参数。
smci

Answers:


9

关于如何glmnetmtcars 数据集上的套索进行香草普通交叉验证的示例。

  1. 加载数据集。

  2. 准备特征(独立变量)。他们应该是matrix一流的。将df包含分类变量的最简单方法matrix是通过model.matrix。注意,默认情况下glmnet适合截距,因此最好从模型矩阵中删除截距。

  3. 准备响应(因变量)。让我们将高于平均水平的汽车的mpg效率(“ 1”)编码为无效(“ 0”)。将此变量转换为因数。

  4. 通过进行交叉验证cv.glmnet。它将alpha=1glmnet您要求的默认参数中提取:套索回归。

  5. 通过检查交叉验证的输出,您可能对至少2条信息感兴趣:

    • lambda,可最大程度减少交叉验证的错误。glmnet实际上提供了2个lambda:lambda.minlambda.1se。这是您作为实践统计人员使用的判断力。

    • 得到的正则化系数。

请按照上述说明查看R代码:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

最后评论:

  • 请注意,模型的输出没有说明系数的统计意义,仅说明了值。

  • 您所要求的l1罚分器(lasso)因不稳定而臭名昭著,如博文和该stackexchange 问题所证明。更好的方法也可以是交叉验证alpha,这可以让您决定l1和l2惩罚者的适当组合。

  • 进行交叉验证的另一种方法是转向插入符号 train( ... method='glmnet')

  • 最后,最好的办法更多地了解cv.glmnet和它的未来违约的glmnet当然是?glmnetR中的控制台)))


好答案。..还值得多次运行CV并平均误差曲线(请参阅cv.glmnet)以说明采样。
user20650

@SergeyBushmanov非常有用!
theforestecologist

嗨,我知道这是一篇旧文章,但我想问你一个问题。您提到模型的输出没有说明系数的统计显着性,那么如何确定它们的显着性呢?
Jun Jang

@JunJang“系数没有统计意义”是软件包作者的声明,而不是我的声明。我不记得确切地在包装作者的一本书中或包装的插图中给出了这种说法。在这种情况下,您可以说它们不是“有用的”,还是不能通过交叉验证解释目标,而不是说系数不重要。
谢尔盖·布什曼诺夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.