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