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], ...)
}
}
それで何が起こるか。データを完全なデータに適合させた後、完全なデータからのラムダを使用して相互検証が行われます。これがデータの過適合ではない可能性があることを誰かに教えてもらえますか? 相互検証では、モデルがデータの除外された部分に関する情報を持たないようにしたいと考えています。しかしcv.glmnet
、これでカンニング!