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], ...)
  }
}

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

4

2 に答える 2

1

いいえ、これはオーバーフィッティングではありません。

cv.glmnet()ラムダ シーケンスのソリューション パス全体を構築します。ただし、そのパスの最後のエントリを選択することはありません。@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 に答える
1

相互検証された適合尺度を使用して調整パラメーターの「最良の」値を選択すると、その「お買い得。どの統計にも標本分散があります。しかし、オーバーフィッティングについて話すには調整パラメーターを最適化すると、事前に指定された値 (ゼロなど) に維持する場合と比較して、サンプル外のパフォーマンスが低下することを意味しているようです。私の経験では、これは珍しいことです。他の多くの機能選択方法と比較して、最適化は (1 つのパラメーターに対して) 非常に制限されています。いずれにせよ、チューニング パラメーターの選択、ホールドアウト セット、外部交差検証ループ、またはブートストラップを含む手順全体を検証することをお勧めします。モデル選択後の相互検証 (エラーの一般化)を参照してください。

于 2015-01-30T10:36:09.523 に答える