cv.glmnet
已被大多数研究论文和公司使用。虽然为cv.glmnet
构建了类似glmnet.cr
的类似功能(类似的包实现了连续比序数回归的套索),但我在cv.glmnet
中遇到了这个问题。
`cv.glmnet` first fits the model:
glmnet.object = glmnet(x, y, weights = weights, offset = offset,
lambda = lambda, ...)
使用完整数据创建glmnet
对象后,下一步如下:
提取完整模型中的lambda
lambda = glmnet.object$lambda
现在他们确保折叠次数超过3
if (nfolds < 3)
stop("nfolds must be bigger than 3; nfolds=10 recommended")
创建列表以存储交叉验证结果
outlist = as.list(seq(nfolds))
根据交叉验证理论,运行for loop
以适合不同的数据部分
for (i in seq(nfolds)) {
which = foldid == i
if (is.matrix(y))
y_sub = y[!which, ]
else y_sub = y[!which]
if (is.offset)
offset_sub = as.matrix(offset)[!which, ]
else offset_sub = NULL
#using the lambdas for the complete data
outlist[[i]] = glmnet(x[!which, , drop = FALSE],
y_sub, lambda = lambda, offset = offset_sub,
weights = weights[!which], ...)
}
}
那会发生什么。在将数据拟合到完整数据之后,使用来自完整数据的lambdas完成交叉验证。有人能告诉我这可能不是数据过度拟合吗?我们在交叉验证中希望模型没有关于数据遗漏部分的信息。但是cv.glmnet
欺骗了这个!
答案 0 :(得分:1)
您可以使用交叉验证的适合度量来选择最佳&#34;最佳&#34;当被视为对模型的样本外性能的估计时,调整参数的值将该乐观偏差引入该度量中,其中&#34;最佳&#34;值。任何统计都有抽样差异。但是,谈论过度拟合似乎意味着优化调整参数会导致样本外性能下降,而不是将其保持在预先指定的值(比如零)。根据我的经验,这是不寻常的 - 与许多其他特征选择方法相比,优化非常受限(在单个参数上)。无论如何,验证整个过程是个好主意,包括调整参数的选择,保持集,外部交叉验证循环,或引导。请参阅Cross Validation (error generalization) after model selection。
答案 1 :(得分:1)
不,这不会过度拟合。
cv.glmnet()
确实构建了lambda序列的整个解决方案路径。但是你永远不会选择该路径中的最后一个条目。您通常会选择lambda==lambda.1se
(或lambda.min
),因为@Fabians说:
lambda==lambda.min : is the lambda-value where cvm is minimized
lambda==lambda.1se : is the lambda-value where (cvm-cvsd)=cvlow is minimized. This is your optimal lambda
请参阅cv.glmnet()
和coef(..., s='lambda.1se')