R中的交叉验证套索回归

机器算法验证 r 回归 交叉验证 套索 网络
2022-03-03 22:49:05

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

1个回答

glmnet关于如何在mtcars 数据集上对 lasso 进行香草普通交叉验证的示例。

  1. 加载数据集。

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

  3. 准备响应(因变量)。让我们将高于平均水平的汽车编码mpg为高效('1'),其余为低效('0')。将此变量转换为因子。

  4. 通过 运行交叉验证cv.glmnet它将alpha=1从默认glmnet参数中拾取,这就是您所要求的:套索回归。

  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 惩罚器(套索)因不稳定而臭名昭著,正如这篇博文和这个 stackexchange问题所证明的那样。更好的方法也可以是交叉验证alpha,这将让您决定适当混合 l1 和 l2 惩罚项。

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

  • 最后,了解更多信息cv.glmnet及其默认值的最佳方式glmnet当然是?glmnet在 R 的控制台中)))