cv.glmnet是否通过使用完整的lambda序列来过度拟合数据?

时间:2014-02-17 09:49:39

标签: r statistics cross-validation glmnet

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欺骗了这个!

2 个答案:

答案 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')

的文档