相互検証のパフォーマンスは、独立したデータセットの実際のパフォーマンスを予測するための正確な指標になりますか?


9

この質問は、相互検証の背後にある理論に関連していると思います。ここに私の経験的発見を示し、そこで交差検証の理論に関連する質問を書きました。

2つのモデルM1とM2があります。同じデータセットを使用してそれらをトレーニングし、同じデータセットを使用して交差検証を実行して、各モデルの最適なパラメーターを見つけます。最終的に、最適パラメーターの下でのM1は、10倍の交差検証スコアの点で、最適パラメーターの下でのM2よりもパフォーマンスが良いことがわかりました。次に、予測子とラベルの両方を含む別の独立したテストデータセットがあり、このテストデータセットがトレーニングデータセットの同じ分布から生成された場合、これらの2つの十分に調整されたモデルをその新しいテストデータセットに適用する前に、主張したり、新しいテストデータセットよりもM1の方がM2よりもパフォーマンスが優れていることを期待できますか?

私はカグルタイタニックの例を演奏していました。2つのxgboostモデルがあり、M1は十分にチューニングされており、M1はトレーニングデータセットに対して10倍の交差検証を実行するという点であまりチューニングされていません。しかし、両方を送信すると、調整が不十分なモデルの方が実際にテストデータセットのスコアが優れていることがわかりました。それはどうでしょうか?そして、それが真実である場合、データを異なるモデルに適合させ、モデルパラメータを調整するときに何を探す必要がありますか?

これが私の具体的な提出結果です:ランダムグリッド検索を行いました

params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50], 
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9], 
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
          estimator=XGBClassifier(**params_fixed, seed=seed),
          param_distributions=params_grid,
          n_iter=5000,   
          cv=10,
          scoring='accuracy',
          random_state=seed
)

変数を変更するたびにn_iter。まず、を設定しますn_iter=10。これにより、これらのハイパーパラメーターの値のセットが得られます。このベクトルをと呼び、cvスコア(精度率)が0.83389の場合、を使用してモデルをトレーニングし、独立したテストで予測を生成しますデータセット、およびKaggleに送信すると、テストデータセット0.79426で真の精度が生成されますα 1α1α1

次に、を設定するとn_iter=100、が得られ、cvスコアは0.83614、つまり最初のスコアよりも高くなりますが、Kaggleに送信すると0.78469となり、最初のスコアよりも低くなります。α2

3番目に、を設定するとn_iter = 1000、が得られ、cvスコアは0.83951、つまり2番目のスコアよりも高くなりますが、Kaggleに送信すると0.77990 が2番目のスコアよりも低くなります。α3

4番目に、を設定するとn_iter = 5000、が得られ、cvスコアは0.84512、つまり3番目のスコアよりも高くなりますが、Kaggleに送信すると0.72249 が3番目のスコアよりも低くなります。α4

これは本当にイライラしています。モデルは交差検証スコアでどんどん良くなっていますが、実際の独立したデータセットで実行すると、そのパフォーマンスはどんどん悪化しています。CVスコアを正確に逆に解釈しましたか?CVスコアが真のテストスコアを推測するには楽観的すぎる可能性があると述べた論文がいくつかあります。しかし、それが真実であっても、私の4つのモデルすべてのCVスコアは、それら自身の真のテストスコアについてすべて楽観的である必要があります。しかし、実際のテストデータセットに適用すると、順序が逆になります。

私が想像できる唯一の理由は、テストデータセットがトレーニングデータセットとは異なる分布を持っていることです。しかし、もしそうだとすれば、太陽の下でこの問題を解決できる方法はないと思います。

回答:


3

まず、実用的な答え:テストセットが、トレーニングと交差検証に使用しているデータセットとは多少異なる分布からのものである可能性を軽視しないでください。あなたはそれが起こるべきではないと思うかもしれませんが、実際にはそれは起こっているようです。

とはいえ、仮説を立てて、テストセットが残りのデータとまったく同じ分布からのものであると仮定しましょう。その場合、クロス検証を使用してハイパーパラメーターを選択している場合、クロス検証により、どちらのモデルの方が良いか迷う可能性があります。

あなたは()を選択ハイパーパラメータ、のいずれかにクロスバリデーションを使用することができたり、同時に両方ではない-あなたのモデルの精度を推定(B)。

クロス検証を使用して最適なハイパーパラメーターを選択しているようです:クロスパラメーターを使用してその選択肢の精度を推定する選択肢ごとに、ハイパーパラメーターのさまざまな選択肢を試し、最適な選択肢を選択します。その場合、結果として得られる精度(最良のパラメーターを使用)がテストセットのパフォーマンスを予測できる保証はありません-(過適合により)過大評価になる可能性があります。M2よりM1の方が過大評価である場合は、見たものが表示される場合があります。

ハイパーパラメーターの選択と精度の推定の両方が必要な場合は、精度を推定するために別の保留された検証セットを用意するか、ネストされた相互検証を使用することをお勧めします。https://stats.stackexchange.com/q/65128/2921およびhttp://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.htmlを参照してください


モデル選択にプレーンなCVよりもネストされたCVが必要な理由を説明する(確率論の面からの)他のより理論的な参照を知っていますか?私が遭遇した問題につながる根本的なメカニズムを理解したい
KevinKim

1
入れ子の交差検証の使用もお勧めします。3倍の外部CVと10倍の内部CVを実行している場合、3つの異なるデータセットで内部CV中にトレーニングする3つのモデルをテストできます。これにより、さまざまなデータセットに遭遇したときに、モデル構築プロセスが最終的にどのように実行されるかをよりよく理解できます。
darXider 2017年

@darXider入れ子になったCVの一部を読みました。これは、2つのクラスのモデル、たとえばRFとGBTを比較するために使用されているようです。そのため、内部CVでは、「最高」(最低のCVエラー)ハイパーパラメーターがRFとGBTはそれぞれ、外部CVで、内部CVによって選択されたハイパーパラメーターを使用して、RFとGBTの一般化誤差を計算します。私の場合、モデルの1つのクラス、GBTしかありません。ハイパーパラメータ調整を実行したいと思います。ネストされたcvはどのようにそれを行うのに役立ちますか?
KevinKim 2017年

@KevinKim AFAIK、ネストされたCVの目標は、モデル構築プロセスがどのように一般化されるかを理解することであり、モデルの異なるクラスを比較することではありません。最終的な目標は、トレーニング済みモデル(RFまたはXGB)を将来の/目に見えないデータで使用することなので、ネストされたCVを使用すると、そのパフォーマンスをよりよく理解できる場合があります。もちろん、3x10のネストされたCVでハイパーパラメータ調整も行います。最終的には、たとえば、互いに同等の3つのXGBモデルが得られます(3つのうちの1つを選択する必要はありませんが、さまざまな方法を使用して組み合わせることができます)。
darXider 2017年

1

その新しいテストデータセットよりもM1の方がM2よりもパフォーマンスが優れていると主張できますか、それとも期待すべきですか?

はい、そうすべきです。もちろん、

  1. テストデータは、トレーニングおよび検証データと同じ生成プロセスから取得されます。
  2. 各セットに十分なデータがあり、統計的な変動が起こりにくい。

モデルは交差検証スコアでどんどん良くなっていますが、実際の独立したデータセットで実行すると、そのパフォーマンスはどんどん悪化しています。

2つの理由が考えられます。

  1. 実際、テストデータセットは同じ方法で生成されません。したがって、アクセス権のないKaggleテストセットに依存しないことをお勧めします。持っているデータを使用してください。

  2. 適合度が高すぎます。つまり、交差検定を正しく実行していません。パラメータのトレーニングがトレーニングデータで行われることと、トレーニングに使用なかったデータで検証が行われることを確認してください。トレーニング損失と検証損失のヒストグラムを比較します。トレーニングの損失は、検証の損失よりも常に小さくなければなりません。テストデータの損失についても同じようにして、一貫した画像を取得します。

最後に、テストセットのパフォーマンスは検証セットのパフォーマンスよりも低くなることが予想されます。これは、モデルが検証セットに基づいて選択されるためです。そのため、そのデータセットに偏っています。


私の投稿にはコードがありますが、CV手順を誤用したとは思われません(私のコードに何か問題がありましたか?)。そして実際、トレーニングエラーは検証エラーよりもはるかに少なく、安定している(stdが小さい)ことがわかりました。真のテストエラーが検証エラーよりも大きくなることを理解していますが、これはすべてのモデルで発生することを期待しています(ハイパーパラメーターの値が異なるXBGTを意味します)。私が見たところ、一部のモデルは他のモデルよりも発生が少なく、この「逆現象」を引き起こしているようです。私はチューニングhyperparaに探していますどのような方向を知らないので
KevinKim

多くの人がを3つの部分に分割し、トレーニング、検証、テストを行うことを提案し、検証セットでhyperPを調整した後、テストセットにモデルを適用して、このモデルが実際のテストでどのように機能するかを確認しました(検証ステップにもある程度の偏りがあるため)。次に、テストの後、hyperPの調整を停止します。調整を行う場合と同様に、(検証セットのように)バイアスがかかり始めます。わかった。しかし、テストセット後もモデルのパフォーマンスにまだ満足できない場合は、どうすればよいですか?D
KevinKim 2017年

実際には、「ビッグデータ」の世界に住んでいるにもかかわらず、機能の数も増えていると思います。次元の呪いがあるので、行が非常に多い場合でも、フィーチャ空間の各部分について、十分なデータポイントがまだない可能性があります。次に、統計的な変動が常に存在します。次に、このtune hyperP手順がまだ正しいか、実際のテストデータセットで良好なパフォーマンスのモデルを取得するのに役立つかどうかを質問しています。CVがこのタスクの実行に役立たない場合、正しい手順は何ですか?
KevinKim 2017年

検証手順でのトレーニングの損失が相互に匹敵する、つまり一貫していることを確認します。そうでない場合は、別のモデル/機能の選択を試してください。この権利が得られるまで続行しないでください。次に、検証の損失に対して同じことを行います。これらが比較できない場合は、別のモデル/機能の選択/検証方法を試してください。完了したら、テストセットに進みます。損失で満足できない場合は、手順全体を拒否して、別の方法を試してください。テストセットを使用して最適化を開始すると、テストセットに偏ってしまうため、ライブパフォーマンスに依存することはできません。
Ytsen de Boer 2017

0

可能です。パラメータがより適切に調整されているため、モデルがM1トレーニングデータセットの分散をDモデルよりもよく学習している単純なシナリオを考えてみてくださいM2。これはM1、よりDもパフォーマンスが良いことを意味しますM2

我々はテストセットでそれらをテストするときしかしT、可能性がありM2、より良いとして行いM1、オーバーフィットするかもしれないD間はM2ありませんでした。したがってM1Tよりもパフォーマンスが低下しM2ます。

これは、検証セットではなく同じデータセットに対して交差検証を実行したことが原因である可能性があります。同じセットでトレーニングと検証を行うと、それが過剰に適合している可能性があるという事実を見落とす可能性があります。したがって、さまざまなデータセットでトレーニング、検証、テストを行うことをお勧めします。したがって、流れは

  1. 同じトレーニングセットで異なるモデルをトレーニングする
  2. 検証セットで検証済み
  3. 検証セットで最もパフォーマンスの高いモデルの基本パフォーマンスを選択する
  4. それを使用して、テストセットをスコアリングします。

ただし、データセットのクロス検証ではD、過剰適合の問題がすでに考慮されています。クロス検証をまったく行わない場合、つまり、モデルをデータセットに適合させ、Dその最適化問題を解決して最適なパラメーターを取得するだけで、このモデルのトレインエラーが最も少なくなる可能性が高くなります。オーバーフィッティング。この場合、このoptimizedモデルは独立したテストデータセットでパフォーマンスが低下する傾向があることに同意します。しかし、この問題はデータセットの相互検証によって対処されたと思いますDよね。
KevinKim 2017年

1
具体的には、で10倍のCVを実行する場合D、最初にランダムDに約10の等しいサイズのピースにチョップし、次に各反復でM1とM2の両方をの同じ9/10にフィットDさせ、次に同じ1 /を適用しますの10 Dを取得するにはtest error、このプロセスを10回繰り返します。毎回、トレーニングセットとテストセットは前の反復と異なります。次に、10回の反復の後、M1とM2のテストエラーを平均化し、M1のテストエラーが少ないことを確認します
。M1

はい、「M1はM2より優れている」と結論付けるのに十分です。ただし、モデル選択手順が検証パフォーマンスに基づいて M1を選択することになる場合、最適なモデル(この場合はM1)の選択は検証セットに偏っています。したがって、テストセットの最終チェックが必要であり、ライブデータでのパフォーマンスを示す指標を取得します。
Ytsen de Boer 2017

@YtsendeBoer私はついにあなたが言ったことについて自分自身を確信しました。同意する。しかし、別の独立したテストセットでM1がM2よりも悪いことがわかった場合(検証セットではM1がM2より優れていることを思い出してください)、この場合、最終モデルとしてM1またはM2を選択して、未来?M1を選択すると、M1に対するテスト結果が明確になります。しかし、M2を選択した場合、M2もこの特定のテストデータセットに適合しすぎていませんか?つまり、特定の検証セットにM1がオーバーフィットするのと同じ方法ですか?
KevinKim 2017

はい、そのため、テストセットでモデル選択を行うべきではありません。検証セットを使用して、モデル選択手順でM1を選択しました。次に、テストセットでM1を実行し、結果が十分かどうかを判断します。別のテストセットでパフォーマンスが向上したとしても、この時点ではM2を忘れてください。ただし、結果に疑問がある場合は、「その他の独立したテストセット」を残りのデータに追加し(データが多いほど良い)、手順を再度開始して、それを続ける必要があります。
イッセンデボーア2017

0

相互検証(v-fold相互検証)の背後にある理論は、多くの論文で取り上げられています。2003年から2007年にかけて発行された一連の論文にその証拠があります。参照してください:-oracleセレクター。2006-スーパーラーナー2007-予測におけるスーパーラーナー2010-統合クロス検証2003

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.