最近、プロジェクトに取り組んでいて、相互検証エラー率が非常に低いのに、テストセットのエラー率が非常に高いことがわかりました。これは、私のモデルが過剰適合していることを示している可能性があります。テストセットがオーバーフィットしているのに、クロス検証がオーバーフィットしないのはなぜですか?
より具体的には、100個の変数(n >> p)を持つ約200万の観測値があります。データセットをランダムに80/20トレインとテストに分割しました。次に、トレーニングセットで5分割交差検証を使用してモデル(XGboostなど)を近似し、推定エラー率はかなり低くなっています。次に、同じパラメーター設定を使用し、トレーニングセット全体を使用してモデルに適合させました。驚いたことに、テストセットを使用してモデルのパフォーマンスを評価したところ、エラーレートはCVエラーレートよりも大幅に高くなっています。どうして?
編集:
(エラー率について)
エラー率は、実際に多項loglossです。1.320044(+/- 0.002126)のCVエラー率と1.437881のテストエラー率を達成しました。これら2つの数字を見つめると、彼らは近くに見えるかもしれませんが、実際にはそうではありません。これを正当化する方法はわかりませんが、このプロジェクトのパフォーマンスのスケール(1.55から1.30まで)では、それらが異なると確信しています。
5分割交差検証の方法は次のようなものです。
- 列車セットを5セットに分割します。
- 4セットのモデルを繰り返し適合させ、残りのセットでパフォーマンスをテストします。
- 5つの反復すべてのパフォーマンスを平均化します。
つまり、私のパラメーター設定でモデルがオーバーフィットする場合は、この相互検証手順で確認する必要があります。しかし、テストセットを使用するまでは表示されません。地球上のどのような状況下でこれが起こる可能性がありますか?
ありがとう!
追加:
CVエラーレートがテストセットエラーレートと異なる理由は、
あなたが持っているデータがあなたが予測しようとしているデータを代表していないなら、クロス検証は外部データに対してうまく機能しません! - ここに
しかし、ランダムに8/2で200万サンプルのデータセットを分割しました。トレインセットとテストセットの変数の分布は同じであるはずです。
編集:
(データ漏洩について)
クロスバリデーションされた@darXiderから1つの興味深い賞をいただきました。彼は言う、
場合によっては、機能エンジニアリングの際に、トレーニングセットとテストセットの間のデータリークを回避するように注意する必要があります。たとえば、元の手つかずのデータでPCAを実行し、PC1とPC2を「新しい」機能として使用し、データセットをトレーニングとテストに分割すると、トレーニングセットからテストセットに情報がリークします。それはあなたのスコアを押し上げます。機能エンジニアリングの後で、CVスコアとテストスコアが一致しなくなったとのことですが、これは、トレーニングセットとテストセットの間で何らかの情報漏えいを示唆する可能性があります。
正確には「データ漏えい」とは何なのか、なぜ分割前の機能エンジニアリングがまだ「データ漏えい」を引き起こす可能性があるのでしょうか?