ランダムフォレスト-過剰適合の処理方法


41

私はコンピューターサイエンスのバックグラウンドを持っていますが、インターネット上の問題を解決してデータサイエンスを学ぼうとしています。

私はこの数週間、この問題に取り組んでいます(約900行と10個の機能)。最初はロジスティック回帰を使用していましたが、ランダムフォレストに切り替えました。トレーニングデータでランダムフォレストモデルを実行すると、aucの値が非常に高くなります(> 99%)。ただし、テストデータで同じモデルを実行すると、結果はそれほど良くありません(精度約77%)。これにより、トレーニングデータを過剰に適合していると信じることになります。

ランダムフォレストでの過剰適合の防止に関するベストプラクティスは何ですか?

開発環境としてrとrstudioを使用しています。randomForestパッケージを使用しており、すべてのパラメーターのデフォルトを受け入れました


4
ブライマンは、RFが過適合ではないと主張しています。stat.berkeley.edu/~breiman/RandomForests/cc_home.htm彼が正しいと仮定すると、おそらくトレーニングとテストセットの間に何らかの矛盾がありますか?
モニカを

RF回避はTEST DATAにオーバーフィットない場合は、あなたがチューニングパラメータを最適化する
生意気な平衡

sampsizeは、見落とされがちなチューニングパラメーターです。stackoverflow.com/questions/34997134/...
ソレンHavelundウェリング

回答:


30

kk{5,10}


1
ありがとうございました。これらのパラメーターを最適化する方法を示すチュートリアルはありますか?
Abhi

あなたは非常に単純である、スタンフォード大学のオンラインコースに登録する必要がありますが、ここではビデオチュートリアルがRでそれを行うためです。class.stanford.edu/courses/HumanitiesScience/StatLearning/...
生意気な平衡

これを正しく理解している場合は、クロス検証を使用して、モデルがすべてのステップで試行する機能の数ではなく、ランダムフォレストモデルに入る機能の数を確認します。正解?
Abhi

4
私はこの答えに反論します。RFの魅力的な機能の2つは、RFをオーバーフィットすることが難しく、デフォルトのパラメーターは通常かなり良いということです。この答えは、RFがデフォルトに敏感であることを暗示しているようです。これはめったにありません。
チャールズ

7
経験的に、ランダムフォレスト、ガイド付きランダムフォレスト、正則化ランダムフォレスト、またはガイド付き正則化ランダムフォレストをオーバーフィットすることはまったく困難ではありません。クロスバリデーションでは定期的に非常に優れたパフォーマンスを発揮しますが、オーバーフィッティングのために新しいデータで使用すると不十分です。モデル化される現象のタイプに関係していると思います。機械的プロセスをモデル化するときはそれほど問題ではありませんが、ビヘイビアモデルのようなものを使用すると、明確に指定された回帰により、より安定した結果が得られます。
ハックR

33

トレーニングデータで99%のAUCをどのように得ていますか?違いがあることに注意してください

predict(model)

そして

predict(model, newdata=train)

トレーニングデータセットの予測を取得するとき。最初のオプションは、ランダムフォレストからout-of-bag予測取得します。これは通常、予測値をトレーニングデータの実績値と比較するときに必要なものです。

2番目は、トレーニングデータを新しいデータセットであるかのように扱い、各ツリーで観測を実行します。通常、RFアルゴリズムは個々のツリーを剪定せず、代わりに過密を制御するためにツリーのアンサンブルに依存するため、予測と実際の結果との間に人為的に密接な相関が生じます。そのため、トレーニングデータの予測を取得する場合は、これを行わないでください。


3
predict(model、data = train)を使用していました。私は今、predict(model)に切り替えました、そして私のaucは87%に落ちました。これは良いことですか、悪いことですか?
Abhi

2
ありがとうございました!これも私にとっての問題であることがわかりました。私は上のフォローアップの質問を掲示し、ここでRFモデルのための「トレーニングエラー」として使用するものを指標:stats.stackexchange.com/questions/162353/...
バークU.

よかった。ありがとう!!私もこの間違いをしていた!@Abhiにとっては、前のAUCが無意味に高かったので良いことです。これはより現実的です。相互検証を試して、その上でAUCを測定すると、おそらく同様の値が表示されます。
好奇心が強い

7

決定木には、過剰適合を処理する2つの方法があります。(a)木を完全に成長させない(b)剪定する

同じことが木の森にも当てはまります-あまり育てず、剪定しないでください。

randomForestあまり使用していませんが、私の知る限り、フォレストの調整に使用できるいくつかのパラメーターがあります。

  • nodesize -ターミナルノードの最小サイズ
  • maxnodes -ターミナルノードの最大数
  • mtry -各ツリーの構築に使用される変数の数(@ user777に感謝)

1
そしてmtry、アルゴリズムが各ツリーを構築するために描画する変数の数。デフォルトでは、合計の特徴の数の平方根。
モニカ

代わりにmaxnodesと低いsampsizeのままにします。どちらも、しかし、下木の相関関係をsampsize、あまり深さと、より堅牢な森とmaxnodesとsampsize所与の木をdecresing、そして森はおそらく交差検定予測誤差を小さくするために収束する、参照stackoverflow.com/questions/34997134/...
ソレンHavelundをウェリング

2

K分割交差検証などの交差検証方法を使用することもできます。


機能を正規化/スケーリングする必要がありますか?
チャールズ

4
@チャールズ私の謝罪。実際、ランダムフォレストを使用する際に機能をスケーリングする必要はありません。参照:stackoverflow.com/questions/8961586/...
FRE

相互検証が役立つと思います。これは、分割サンプル検証を使用した比較的小さなデータセットであり、エラーの不安定な推定値を生成する可能性があります(確かに、これはここでは問題ではないようです)
チャールズ14

1

gridsearchを使用してパラメーターを調整できます

from sklearn.ensemble import RandomForestClassifier

from sklearn.grid_search import GridSearchCV

random_classifier = RandomForestClassifier()

parameters = { 'max_features':np.arange(5,10),'n_estimators':[500],'min_samples_leaf': [10,50,100,200,500]}

random_grid = GridSearchCV(random_classifier, parameters, cv = 5)

試みられたエディタは、モジュールGridSearchCVが呼び出されていることを示唆しています。model_selectionしたがって、コードの2行目はである必要がありますfrom sklearn.model_selection import GridSearchCV
gung-モニカの復職

0

[ 5、15 ]の範囲でmax_depthパラメーターを調整してみてください。ただし、これよりも大きくしないと、オーバーフィッティングの可能性が高くなります。

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