使用glmnet进行交叉验证预测

3

请问glmnet是否会产生交叉验证预测,即基于模型构建中被留出的折叠来进行预测(通常所说的交叉验证),而不是基于通过交叉验证确定的最佳lambda的同一模型的交叉验证预测?


我喜欢这篇文章中提到的“外部交叉验证循环”的建议,以及它的链接。“无论如何,最好在保留集上进行验证整个过程(包括调整参数的选择),或者使用外部交叉验证循环或通过自助法。请参见模型选择后的交叉验证(误差泛化)。” https://dev59.com/3Hzaa4cB1Zd3GeqPRpT0 - user3156942
但是这个在R中怎么做呢?我想要每个观测都有交叉验证预测 - 即所讨论的观测不会在其预测中使用 - 在cv.glmnet中是否自动完成(就像“预测”产生的那样)- 还是需要手动生成外部CV循环,即for循环 - 或者可以使用caret(使用train或其他函数)吗? - user3156942
1个回答

2

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

如果我在cv.glmnet中添加keep=TRUE,那么cvf1$fit.preval将包括每个项目的实际CVed预测值,这些预测值与最小化CVed预测以找到最佳lambda的过程有相同的贡献 - 太棒了! - user3156942
还有一件小事让我困惑 - 有84个候选lambda(根据length(cvf1$lambda)计算)- 但是矩阵cvf1$fit.preval中有32行,每行对应32辆汽车的预测结果,每列对应一个lambda的预测结果 - 但是有86列(不是84)- 我可以看到在这种情况下第86列是空的,但仍然有85列数据对应着84个lambda - 你给出的性能线表明最佳lambda(第56个)的预测结果在第56列,这是否意味着前84列是对应84个lambda的值?第85列是什么? - user3156942

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接