【问题标题】:Difference between glmnet() and cv.glmnet() in R?R中glmnet()和cv.glmnet()之间的区别?
【发布时间】:2015-06-01 09:49:15
【问题描述】:

我正在开展一个项目,该项目将展示一组事件对结果的潜在影响。我正在使用 glmnet() 包,特别是使用泊松功能。这是我的代码:

# de <- data imported from sql connection        
x <- model.matrix(~.,data = de[,2:7])
y <- (de[,1])
reg <- cv.glmnet(x,y, family = "poisson", alpha = 1)
reg1 <- glmnet(x,y, family = "poisson", alpha = 1)

**Co <- coef(?reg or reg1?,s=???)**

summ <- summary(Co)
c <- data.frame(Name= rownames(Co)[summ$i],
       Lambda= summ$x)
c2 <- c[with(c, order(-Lambda)), ]

一开始用SQL从我的数据库中导入大量数据。然后我将其放入矩阵格式,并将响应与预测变量分开。

这就是我感到困惑的地方:我无法弄清楚 glmnet() 函数和 cv.glmnet() 函数之间的确切区别。我意识到 cv.glmnet() 函数是 glmnet() 的 k 倍交叉验证,但实际上这到底意味着什么?它们为 lambda 提供了相同的值,但我想确保我没有遗漏关于两者之间区别的重要信息。

我也不清楚为什么当我指定 alpha=1(应该是默认值)时它运行良好,但如果我忽略它就不行?

提前致谢!

【问题讨论】:

  • 试试看plot(reg)
  • 永远不要依赖 glmnet 的默认 lambda 序列! 臭名昭著的问题。始终提供您自己的序列。然后从fit$lambda.min 获取最佳 lambda 值,并在所有对predict()coef() 等的调用中将其与s=lambda.min 参数一起使用。
  • @smci 为什么不使用 lambda.1se?正是这个被 predict() 使用
  • 能否详细说明为什么不使用预定义的 lambda 以及如何选择更好的序列?
  • @smci 你能证实你关于默认 lambda 序列是垃圾的说法吗?除了我认为 glmnet 的作者知道他们在做什么之外,该序列从一个最大 lambda(其所有系数都保证为零)到一个非常小的一个(通常所有系数都进入模型)(当然取决于在你的矩阵的形状上),这很有意义 IMO。在我的情况下,它运行良好。是否有一些模型没有?

标签: r classification glm cross-validation glmnet


【解决方案1】:

glmnet() 是一个 R 包,可用于拟合回归模型、套索模型等。 Alpha 参数确定适合的模型类型。当 alpha=0 时,适合 Ridge 模型,如果 alpha=1,则适合 lasso 模型。

cv.glmnet() 执行交叉验证,默认为 10 倍,可以使用 nfolds 进行调整。一个 10 倍的 CV 会将您的观察随机分为 10 个不重叠的组/大约相等大小的折叠。第一个折叠将用于验证集,模型适合 9 个折叠。偏差方差优势通常是使用此类模型验证方法的动机。在 lasso 和 ridge 模型的情况下,CV 有助于选择调整参数 lambda 的值。

在您的示例中,您可以执行 plot(reg) OR reg$lambda.min 来查看导致最小 CV 错误的 lambda 值。然后,您可以导出该 lambda 值的测试 MSE。默认情况下,glmnet() 将对自动选择的 lambda 范围执行 Ridge 或 Lasso 回归,这可能不会给出最低的测试 MSE。希望这会有所帮助!

希望这会有所帮助!

【讨论】:

  • 更明确地声明:永远不要依赖 glmnet 的默认 lambda 序列!始终提供您自己的序列。
  • 如果我理解正确,cv.glmnetglmnet 都优化了 lambda。 cv.glmnet 使用交叉验证,而 glmnet 仅依赖于成本函数。对吗?
【解决方案2】:

在 reg$lambda.min 和 reg$lambda.1se 之间; lambda.min 显然会给你最低的 MSE,但是,取决于你对错误的灵活程度,你可能想要选择 reg$lambda.1se,因为这个值会进一步减少预测变量的数量。您也可以选择 reg$lambda.min 和 reg$lambda.1se 的平均值作为您的 lambda 值。

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2018-03-06
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多