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つの問題とその質問をお読みいただきありがとうございます。
結果に複数の数字が表示されますが、データセットが原因ではないのですか? (たとえば、非常に小さなデータセットを使用すると、単純な決定木になり、「単純な」確率になります)。それ以外の場合は、1桁を表示するのはディスプレイだけかもしれませんが、_predictions[0,0]
_を印刷してみてください。
「確率は私のデータのサイズに影響されない」という意味を理解していない。あまりにも多くのスパムなど、予測したくないという懸念がある場合、通常行われるのは、proba(label==1) > t
の場合に1を予測するようなしきい値t
を使用することです。このように、しきい値を使用して、たとえばスパムのグローバルな確率を制限するために、予測のバランスを取ることができます。また、モデルをグローバルに分析する場合、通常、受信者動作特性(ROC)曲線の曲線下面積(AUC)を計算します(ウィキペディアの記事 here を参照)。基本的に、ROC曲線は、しきい値t
に応じた予測の説明です。
それが役に立てば幸い!
RandomForestClassifier
はDecisionTreeClassifier
のコレクションです。トレーニングセットがどれほど大きくても、意思決定ツリーは単に決定を返します。 1つのクラスには確率1があり、他のクラスには確率0があります。
RandomForestは、結果の中で単に投票します。 predict_proba()
は、各クラスの投票数(フォレスト内の各ツリーが独自の決定を行い、1つのクラスを選択する)をフォレスト内のツリー数で割った値を返します。したがって、精度は正確に1/n_estimators
。さらに「精度」が必要ですか?さらに見積もりを追加します。 5桁目のバリエーションを確認するには、10**5 = 100,000
推定量、これは過剰です。通常、100を超える推定器は必要ありません。