3

cv.glmnet 已被大多数研究论文和公司使用。在构建类似cv.glmnetfor的类似函数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在这方面作弊!

4

2 回答 2

1

您是正确的,使用交叉验证的拟合度量来选择调整参数的“最佳”值会在该度量中引入乐观偏差,当被视为具有该模型的样本外性能的估计时最超值。任何统计数据都有抽样方差。但是说到过拟合似乎暗示与将其保持在预先指定的值(例如零)相比,对调整参数的优化会导致样本外性能下降。根据我的经验,这很不寻常——与许多其他特征选择方法相比,优化非常受限制(在单个参数上)。在任何情况下,验证整个过程都是一个好主意,包括调整参数的选择、在保留集上、使用外部交叉验证循环或通过引导。请参阅模型选择后的交叉验证(错误泛化)

于 2015-01-30T10:36:09.523 回答
1

不,这不是过拟合。

cv.glmnet()确实为 lambda 序列构建了整个解决方案路径。但是您永远不会选择该路径中的最后一个条目。正如@Fabians 所说,您通常会选择lambda==lambda.1se(or lambda.min) :

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

于 2017-02-10T14:10:28.620 回答