【问题标题】:cross validated predictions using glmnet使用 glmnet 交叉验证的预测
【发布时间】:2017-12-03 07:12:38
【问题描述】:

有谁知道 glmnet 是否产生交叉验证的预测,即基于模型构建之外的折叠的预测(人们通常认为是交叉验证的)而不是交叉验证的预测是来自相同的预测基于通过交叉验证建立的最优 lambda 模型?

【问题讨论】:

  • 我喜欢这篇文章中关于“外部交叉验证循环”的建议及其链接“无论如何,在保留集,或使用外部交叉验证循环,或通过自举。请参阅模型选择后的交叉验证(错误泛化)。 stackoverflow.com/questions/21825652/…
  • 但是如何在 R 中做到这一点?我希望每个观察都有一个交叉验证的预测 - 即所讨论的观察在其预测中没有使用 - 在 cv.glmnet 中是自动的(是“预测”产生的) - 还是我需要“手动”生成一个外部 CV 循环,即一个 for 循环 - 或者可以使用插入符号(使用 train 或其他函数)吗?

标签: cross-validation glmnet


【解决方案1】:

predict.cv.glmnet 只是将适合所有数据的“glmnet”传递给predict.glmnet,正如您所怀疑的那样。

但是,keep 参数会根据遗漏的数据集返回对训练数据(拟合值)的预测。每条记录分配到的折叠记录为元素foldid。

> library(glmnet)
> # keep prevalidated array
> cvf1 <- cv.glmnet(x = as.matrix(mtcars[, c("disp", "hp", "mpg")]), 
+     y = mtcars$am, family = "binomial", keep = TRUE)
> dim(mtcars)
# [1] 32 11
> length(cvf1$lambda)
# [1] 84
> # leave-n out fitted predictions
> # 84 columns, 2 columns padded with NAs
> dim(cvf1$fit.preval)
# [1] 32 86
> # performance of cross-validated model predictions
> round(mtcars$am - cvf1$fit.preval[, cvf1$lambda == cvf1$lambda.min])
#  [1]  1  1  0  0  0  0  0  0 -1  0  0  0  0  0  0
# [16]  0  0  0  0  0 -1  0  0  0  0  0  0  0  1  0
# [31]  0  0
> cvf1$foldid
#  [1]  1  6  6  1  1  8  9  6  2  5  9  4  4  2  2
# [16] 10  5  2  3  4 10  3  1  3 10  9  7  8  7  8
# [31]  7  5

【讨论】:

  • 所以如果我将 keep=TRUE 添加到 cv.glmnet 那么 cvf1$fit.preval 将包括每个项目的实际 CVed 预测值 - 相同的 CVed 预测值有助于最小化CVed 预测以找到最佳 lambda - 太棒了!
  • 一件小事仍然让我感到困惑 - 考虑了 84 个候选 lambda(来自 length(cvf1$lambda) ) - 但矩阵 c​​vf1$fit.preval 对 32 中的 32 辆汽车中的每辆都有预测每列中包含 lamdbas 预测的行 - 但有 86 列(不是 84 列) - 在这种情况下,我可以看到第 86 列是空的,但对于 84 个 lambda,仍有 85 列数据 - 你给出的性能线使它看看虽然最佳 lambda(第 56 号)的预测在第 56 列中,但这是否意味着 84 个 lambda 的值在前 84 列中?第 85 列是什么?
猜你喜欢
  • 2018-03-20
  • 2018-07-04
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2023-03-03
  • 2019-10-04
相关资源
最近更新 更多