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], ...)
}
}
那么会发生什么。将数据与完整数据拟合后,使用完整数据中的 lambda 进行交叉验证。有人能告诉我这怎么可能不是数据过度拟合吗?我们在交叉验证中希望模型没有关于遗漏部分数据的信息。但是
cv.glmnet
在这方面作弊! 最佳答案
您是正确的,使用交叉验证的拟合度量来选择调整参数的“最佳”值会在该度量中引入乐观偏差,当被视为模型外样本性能的估计时,“最超值。任何统计量都有抽样方差。但是谈论过拟合似乎意味着与将其保持在预先指定的值(比如零)相比,对调整参数的优化会导致样本外性能的下降。根据我的经验,这很不寻常——与许多其他特征选择方法相比,优化非常受限(在单个参数上)。在任何情况下,验证整个过程都是一个好主意,包括调整参数的选择,在保留集上,或使用外部交叉验证循环,或通过引导。见 Cross Validation (error generalization) after model selection 。
关于r - cv.glmnet 是否使用完整的 lambda 序列过度拟合数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21825652/