web-dev-qa-db-ja.com

RandomForestClassifierのpredict_proba()関数を安全かつ正しい方法で使用する

Scikit-learnを使用して、データセットに機械学習アルゴリズムを適用しています。時々、ラベル/クラスの確率をラベル/クラス自体で表明する必要があります。電子メールのラベルとしてSpam/Not Spamを使用する代わりに、たとえば、特定の電子メールがSpamである確率0.78のみが必要です。

そのために、以下のようにRandomForestClassifierでpredict_proba()を使用しています。

clf = RandomForestClassifier(n_estimators=10, max_depth=None,
    min_samples_split=1, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())

classifier = clf.fit(X,y)
predictions = classifier.predict_proba(Xtest)
print(predictions)

そして、私はそれらの結果を得ました:

 [ 0.4  0.6]
 [ 0.1  0.9]
 [ 0.2  0.8]
 [ 0.7  0.3]
 [ 0.3  0.7]
 [ 0.3  0.7]
 [ 0.7  0.3]
 [ 0.4  0.6]

2番目の列がクラスの場合:スパム。ただし、結果には2つの主要な問題がありますが、これらについては自信がありません。最初の問題は、データのサイズに影響されることなく、結果がラベルの確率を表すということです。 2番目の問題は、0.701の確率が0.708と非常に異なる場合には、結果には1桁しか表示されないということです。たとえば、次の5桁を取得する方法はありますか?

これら2つの問題とその質問をお読みいただきありがとうございます。

19
Clinical
  1. 結果に複数の数字が表示されますが、データセットが原因ではないのですか? (たとえば、非常に小さなデータセットを使用すると、単純な決定木になり、「単純な」確率になります)。それ以外の場合は、1桁を表示するのはディスプレイだけかもしれませんが、_predictions[0,0]_を印刷してみてください。

  2. 「確率は私のデータのサイズに影響されない」という意味を理解していない。あまりにも多くのスパムなど、予測したくないという懸念がある場合、通常行われるのは、proba(label==1) > tの場合に1を予測するようなしきい値tを使用することです。このように、しきい値を使用して、たとえばスパムのグローバルな確率を制限するために、予測のバランスを取ることができます。また、モデルをグローバルに分析する場合、通常、受信者動作特性(ROC)曲線の曲線下面積(AUC)を計算します(ウィキペディアの記事 here を参照)。基本的に、ROC曲線は、しきい値tに応じた予測の説明です。

それが役に立てば幸い!

5
Sebastien

RandomForestClassifierDecisionTreeClassifierのコレクションです。トレーニングセットがどれほど大きくても、意思決定ツリーは単に決定を返します。 1つのクラスには確率1があり、他のクラスには確率0があります。

RandomForestは、結果の中で単に投票します。 predict_proba()は、各クラスの投票数(フォレスト内の各ツリーが独自の決定を行い、1つのクラスを選択する)をフォレスト内のツリー数で割った値を返します。したがって、精度は正確に1/n_estimators。さらに「精度」が必要ですか?さらに見積もりを追加します。 5桁目のバリエーションを確認するには、10**5 = 100,000推定量、これは過剰です。通常、100を超える推定器は必要ありません。

13
Andreus