xgboostのオーバーフィットに関する議論


20

私のセットアップは次のとおりです。

「適用された予測モデリング」のガイドラインに従っています。したがって、私は相関する特徴をフィルタリングし、次のようになりました:

  • トレーニングセットの4900データポイントとテストセットの1600データポイント。
  • 26個の機能があり、ターゲットは連続変数です。

caretパッケージを使用してモデルをトレーニングするために、5倍の交差検証を適用します。MARSモデルを適用すると、トレーニングセットとテストセットで平均絶対誤差(MAE)が約4になります。

ただし、xgboost(ツリーアルゴリズムまたは線形アルゴリズム)を適用すると、トレーニングセットで0.32(!)、テストセットで2.4のようなものが得られます。

したがって、テストエラーがトレーニングエラーの8倍である場合、次のように言います。トレーニングデータをオーバーフィットしました。それでも、テストでは小さなエラーが発生します。

xgboostで次のパラメーターを使用します。

  • nrounds = 1000そしてeta = 0.01(nroundを増やしてイータを減らすと助けになるかもしれませんが、メモリが不足し、実行時間が長すぎます)
  • max_depth = 16:他の投稿とデフォルトの6を比較すると、これは大きく見えますが、問題はかなり複雑です-この場合、16は大きすぎません。
  • colsample_bytree = 0.7subsample = 0.8およびmin_child_weight = 5:これを行うと、オーバーフィットを減らします。

max_depthを減らすと、トレーニングとテストエラーが近づきますが、それでも大きなギャップがあり、テストエラーは大きくなります(3を少し上回る)。

線形ブースターを使用すると、最適なパラメーターでほぼ同じトレインとテストエラーが得られます。

  • lambda = 90 および `alpha = 0:交差検定により検出され、ラムダはオーバーフィットを防ぐはずです。
  • colsample_bytree = 0.8subsample = 0.8およびmin_child_weight = 5:これを行うと、オーバーフィットを減らします。

私の感覚では、xgboostはまだオーバーフィットしますが、トレーニングエラーとリアルタイムテスト(xgboostモデルとそれらのアンサンブルを実際に4日間使用しました)で確認できる限り、問題ありません(エラーはテストエラーよりも大きくなりますが、機能やその他の変数の予測については実生活により多くの不確実性があります。

あなたはどう思いますか:(可能な場合)実生活のパフォーマンスが優れている場合、オーバーフィットを受け入れることができますか?私の設定ではxgboostはオーバーフィットする傾向がありますか?

回答:


34

テスト誤差が小さくても、オーバーフィットがひどくて、オーバーフィットするモデルを選択すべきではありませんか?いいえ。しかし、それを選択する正当な理由があるはずです。

この動作はXGBoostに限定されません。これは、すべての機械学習手法で共通のスレッドです。アンダーフィットとオーバーフィットの適切なトレードオフを見つける。正式な定義は、バイアス分散トレードオフ(Wikipedia)です。

バイアスと分散のトレードオフ

以下は、モデルの選択を正当化するために、バイアス分散のトレードオフを単純化したものです。

  • モデルは、データ内の情報を完全に使用できない場合、バイアスが高いと言います。最も頻繁なケース、応答の平均、またはいくつかの強力な機能などの一般情報に依存しすぎています。バイアスは、変数が正規分布している、またはモデルが線形であると仮定しているため、誤った仮定から生じる可能性があります。

  • モデルは、データからの情報を使いすぎている場合、分散が大きいと言います。これは、提示されたトレーニングセットでのみ役立つ情報に依存しているため、十分に一般化されていません。通常、トレーニングセットを変更するとモデルは大きく変化するため、「高分散」の名前になります。

これらの定義は、アンダーフィットとオーバーフィットの定義に非常に似ています。ただし、これらの定義は単純化されすぎて反対にならないことがよくあります。

  • トレーニングとテストの両方のエラーが高い場合、モデルは不十分です。これは、モデルが単純すぎることを意味します。
  • テストエラーがトレーニングエラーより大きい場合、モデルは過剰適合です。これは、モデルが複雑すぎることを意味します。

これらの単純化は、モデルの適切な複雑さを選択するのに役立つため、もちろん役立ちます。しかし、彼らは重要な点を見落としています。(ほとんど)すべてのモデルにはバイアスと分散の両方の要素があるという事実です。アンダーフィット/オーバーフィットの説明は、偏りが多すぎる/分散が多すぎることを示していますが、(ほとんど)常に両方を持ってます。

バイアスと分散のトレードオフに関する詳細情報が必要な場合は、Googleを介して多くの有用な視覚化と優れたリソースを利用できます。すべての機械学習の教科書には、バイアスと分散のトレードオフに関するセクションがあります。

  • 統計学習と統計学習の要素の紹介(こちらから入手可能)
  • パターン認識と機械学習、クリストファービショップ。
  • 機械学習:確率論的視点、ケビンマーフィー。

また、私を理解するのに役立った素晴らしいブログ投稿は、スコット・フォートマン・ローの「バイアスと分散のトレードオフ理解」です。

問題への応用

したがって、2つのモデルがあります。

電車MAEテストMAE火星4.04.0低分散、高バイアスXGBoost0.32.4より高い分散、より低いバイアス

そして、あなたは1つを選ぶ必要があります。そのためには、より良いモデルを定義する必要があります。決定に含める必要があるパラメーターは、モデルの複雑さとパフォーマンスです。

  • パフォーマンスの1つの「ユニット」と交換できる複雑さの「ユニット」はいくつありますか?
    • 分散が大きいほど複雑さが増します。トレーニングしたデータセットとは少し異なるデータセットでモデルを適切に一般化する場合は、複雑さを軽減することを目指してください。
    • 簡単に理解できるモデルが必要な場合は、モデルの複雑さを軽減することにより、パフォーマンスを犠牲にしてそれを行うことができます。
    • トレーニングセットと同じ生成プロセスに由来することがわかっているデータセットで最高のパフォーマンスを目指している場合は、複雑さを操作してテストエラーを最適化し、これをメトリックとして使用できます。これは、トレーニングセットがより大きなセットからランダムにサンプリングされ、モデルがこのセットに適用される場合に発生します。これは、ほとんどのKaggleコンテストの例です。

ここでの目標は、「過剰適合しない」モデルを見つけることではありません。最適なバイアス分散トレードオフを持つモデルを見つけることです。この場合、XGBoostモデルによって達成されるバイアスの減少は、分散の増加を正当化するのに十分であると主張します。

あなたにできること

ただし、ハイパーパラメーターを調整することで、おそらくより良い結果を得ることができます。

  • ラウンド数を増やして学習率を下げることは可能性です。勾配ブースティングについて「奇妙な」ことは、トレーニングエラーがゼロに達したポイントを超えてそれを実行すると、テストエラーが改善されるように見えることです(ここで説明するように、Deeper Better Only Only Shallow Is Good?)他のパラメータを設定したら、データセットでモデルをもう少し長く訓練してみてください。

  • 1/214。これは専門用語かもしれませんが、フィーチャの相互作用の程度が3である場合(おおよそ:4つのフィーチャの組み合わせは、3つのフィーチャ+ 4番目のフィーチャの組み合わせよりも強力ではありません)、3より大きいサイズのツリーを成長させることは有害です。深さ3の2つのツリーは、深さ4の1つのツリーよりも一般化力があります。これはかなり複雑な概念であり、ここでは説明しませんが、最初にこの資料のコレクションを確認できます。また、深い木は高い分散につながることに注意してください!

  • バギングと呼ばれるサブサンプリングを使用すると、分散を減らすことができます。個々のツリーの分散が大きい場合、バギングはツリーを平均化し、平均の分散は個々のツリーよりも小さくなります。ツリーの深さを調整した後でも大きな変動が発生する場合は、サブサンプリングを増やしてください(つまり、使用するデータの割合を減らしてください)。特徴空間のサブサンプリングもこの目標を達成します。


1
「ありがとう」と言ってコメントするべきではありませんが、この長くて興味深い答えのために、「ありがとう」と言いたいと思います。私はあなたが書いたもののいくつかについてある程度知識がありましたが、これは本当にうまくまとめられました。あなたの参考文献をいくつか見て、新しいツリーを成長させて、コメントで戻ってくるかもしれません。今のところ:ありがとう!すごい!
リック

相互作用ページstat.columbia.edu/~jakulin/Intへのリンク は本当に素晴らしいです!
リック

私はあなたのアドバイスを聞き、木の深さを3に制限しましたが、約1200になりました。結果は素晴らしい感じです。残りのストーリーはこちら:stats.stackexchange.com/questions/205858/…–
リック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.