ランダムフォレストは過剰適合ですか?


19

私はscikit-learnを使用してランダムフォレストで実験しており、トレーニングセットでは素晴らしい結果を得ていますが、テストセットでは比較的悪い結果が得られています...

ここに私が解決しようとしている問題(ポーカーに触発された)があります:プレーヤーAのホールカード、プレーヤーBのホールカード、およびフロップ(3枚のカード)がある場合、どのプレーヤーが最高のハンドを持っていますか?数学的には、これは14個の入力(7枚のカード-それぞれに1つのランクと1つのスーツ)と1つの出力(0または1)です。

これまでの私の結果の一部を以下に示します。

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

使用される関連コードは次のとおりです。

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

使用するツリーの数に関係なく、トレーニングセットのパフォーマンスは、比較的大きなトレーニングセットと適度に少ない機能数にもかかわらず、テストセットよりもはるかに優れているようです...


2
ここでは、ランダムフォレストの「ダイヤル」が10個ほど見られません。相互検証?ベイジアン事前分布?リサンプリングの性質?各ツリーのトレーニングセット?各ツリーのサブセットの何パーセント?...列挙できるものは他にもたくさんありますが、私のポイントは、考慮すべき他の入力があることです。
EngrStudent-モニカの復活2013年

1
ポーカーを知らない人のために問題を説明できますか。ポーカースコアの簡単な計算はありますか?RFの使用に根本的な問題があるかどうかを理解するのは簡単です...ポーカーは知りませんが、RFはおそらく間違ったアプローチであると思われます。一方、入力のサブセットのみを使用して適切な分類器を構築する方法はないように思われます。すべての入力が必要です。
seanv507

回答:


45

これは、RFモデルを使用するときの一般的なルーキーエラーです(以前の加害者として手を挙げます)。トレーニングセットを使用して構築するフォレストは、多くの場合、全体として考慮すると、トレーニングデータにほぼ完全に一致します(見つけているように)。ただし、アルゴリズムはフォレストを構築するときに、アウトオブバッグ(OOB)予測エラーを記憶します。これは、一般化エラーの最良の推測です。

(実行中に)トレーニングデータを予測メソッドに送り返すと、正しいOOBエラーではなく、このほぼ完全な予測(非常に楽観的)が得られます。これをしないでください。代わりに、トレーニングされたForestオブジェクトは、その中にOOBエラーを記憶しているはずです。私はscikit-learnの実装に慣れていませんが、ここのドキュメントを見るoob_score=Trueと、fitメソッドを呼び出すときに指定する必要があるように見え、一般化エラーは次のように保存されます。oob_score_返されたオブジェクト。Rパッケージ "randomForest"では、返されたオブジェクトで引数なしでpredictメソッドを呼び出すと、トレーニングセットのOOB予測が返されます。これにより、他の手段を使用してエラーを定義できます。トレーニングセットを予測メソッドに送り返すと、すべてのツリーが使用されるため、異なる結果が得られます。scikit-learn実装がこれを行うかどうかはわかりません。

精度をテストするために、トレーニングデータを予測メソッドに送り返すのは誤りです。それは非常によくある間違いですので、心配しないでください。


1
ありがとう!しかし、まだ懸念があります:40万のトレーニング例と50本のツリーで89.6%の正解率が得られましたが、同じ量のデータと2倍のツリーで89.7%の正解率が得られました...これはRFが良くないことを示唆していますこの方法?私は過去にMLPニューラルネットワークを使用し、テストセットで〜98.5%の精度に達しました
...-Uwat

5
それは可能ですが、ほとんど十分なツリーを使用していないようです。通常、数千が必要です。ツリーの数はRFアルゴリズムで調整するパラメーターではないため、多くの方が常に優れていますが、「経験的」に「十分な」値を取得すると、ツリーが増えてもOOBエラーは改善されません。小さな単純なデータセットであっても、500本未満のツリーではほとんど十分ではありません。
ボグダノビスト

1
木の数については、「多ければ多いほど良い」という小さな警告がいくつかありますが、パフォーマンスが低下する前に数十億本の木が必要だということは理解しています。私の経験では、OBB(ntrees)カーブがプラトーに達するとリターンが減少しますが、CPUリソースと忍耐力を備えたツリーはより良いものを生成するのに耐えます。
ボグダノビスト

12

答えはmax_featuresパラメーター:int、stringまたはNone、オプション(default =” auto”)パラメーターだと思います。基本的にこの問題についてはNoneに設定し、各ツリーがすべての入力で構築されるようにします。明らかに、ごく一部のカードを使用して適切な分類子を構築できないためです(デフォルトの「auto」はsqrt(nfeatures)を選択しています)各ツリーの入力)


1
それでした!50本のツリーと600kのトレーニング例で95%の精度。
Uwat

2
この時点では、ランダムフォレストをほとんど使用していないことに注意してください。しかし、他の答えが述べているように、この問題に対する理想的な分類器ではありません。
リチャードラスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.