RandomForestClassifier OOBスコアリングメソッド


14

scikit-learnでのランダムフォレストの実装は、スコアリング方法として平均精度を使用して、out-of-bagサンプルで一般化エラーを推定しますか?これはドキュメントには記載されていませんが、score()メソッドは平均精度を報告します。

非常に不均衡なデータセットがあり、グリッド検索のスコアリングメトリックとしてROCのAUCを使用しています。OOBサンプルでも同じスコアリング方法を使用するように分類子に指示する方法はありますか?


oob_scoreのパラメータRandomForestClassifierのクラスは、あなたがやりたいことはありませんか?
ピエール

知る限り、oob_score精度を報告してください。ただし、ソースコードをもう一度確認する必要があります。
darXider

グリッド検索でどのパラメーターを推定していますか?
JahKnows

^申し訳ありませんが、今は本当に覚えていません!1.5年前にこの質問をしました。
darXider

回答:


14

一般に、分類子のパフォーマンスは精度を使用して比較されます。これは、正しく分類されたインスタンスの数をインスタンスの総数で割った尺度です。ただし、学習データから、アンサンブル学習またはバギング手法を使用している場合、分類器から予想されるエラーのより良い近似を取得できます。

アウトオブバッグエラー

バツ

sklearnにoobを実装するには、Random Forestsオブジェクトを作成するときに指定する必要があります。

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

その後、モデルを訓練することができます

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

スコア:0.979921928817

予想どおり、トレーニングセットを評価するときのモデルの精度は非常に高いです。ただし、これは無意味です。データを過剰に適合させる可能性があり、モデルがゴミになるからです。ただし、out-of-bagスコアは次のように使用できます。

print(forest.oob_score_)

0.86453272101

これは、それらが省略されたツリーのみを使用してトレーニングセット内のインスタンスを評価する際の精度です。次に、テストセットのスコアを次のように計算します。

print('Score: ', forest.score(X_test, y_test))

スコア:0.86517733935

oobで測定された精度は、テストセットで得られた精度と非常に似ていることがわかります。したがって、oobの精度は、単なるスコアではなく、モデルのパフォーマンスを評価するためのより優れたメトリックであるという理論に従っています。これは、バギングモデルの結果であり、他のタイプの分類器では実行できません。

異なるメトリックを使用したoobの計算

はい、できます!ただし、コードの構造は正確に依存します。どのようにoobとAUCをcross_val_score関数と一緒に含めることができるかわかりません。ただし、クロス検証フォールドを手動で実行している場合は、次の操作を実行できます。sklearnのランダムフォレストアルゴリズムは、oobの決定関数を次のように提供します。

print(forest.oob_decision_function_)

クラスは、次を使用して取得できます。

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

次に、以下を使用してAUCを計算できます

metrics.roc_auc_score(y_train, pred_train)

0.86217157846471204


3
ありがとう!ランダムフォレストでOOBプロセスがどのように機能するかを知っています。具体的には、正確でRandomForestClassifierない OOBスコアを返すことができるかどうかを尋ねていました。答えの2番目の部分は、この問題に対処する方法に関する非常に良いヒントを提供します。ただし、ROC曲線のAUCを計算するためにクラスラベルを使用すべきではないことを強調する必要があります。むしろ、クラス確率を直接使用する必要があります。したがって、正しい定義はになりますpred_train = forest.oob_decision_function_[:, 1]
darXider

@darXider forest.oob_decision_function_.shape [0] == X_train.shape [0]なので、この日陰ではありませんが、==サンプル数より少ないはずのOOBサンプルの数になるはずですX_trainで?また、個人的にはログロスの計算に興味がありましたが、これを行いたい他の人にとっては、代わりにpred_trainを= forest.oob_decision_function_にすべきだと思います。
サンダーヴァンデンホーテ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.