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/

10-12 21:38
查看更多