web-dev-qa-db-ja.com

Support Vector Machineのpredict()関数で予測されたクラスの確率を知るにはどうすればよいですか?

Support Vector MachineのScikit-Learnのpredict()関数によって予測されたクラスに属するサンプルの確率をどのように知ることができますか?

>>>print clf.predict([fv])
[5]

機能はありますか?

24
postgres

Clf.predict_proba([fv])を使用して、クラスごとの予測確率のリストを取得します。ただし、この関数はすべての分類子で使用できるわけではありません。

コメントに関して、次のことを考慮してください。

>> prob = [ 0.01357713, 0.00662571, 0.00782155, 0.3841413, 0.07487401, 0.09861277, 0.00644468, 0.40790285]
>> sum(prob)
1.0

確率の合計は1.0なので、パーセンテージを得るには100を掛けます。

13

ドキュメントのこのセクション を読んでください。いくつかの微妙な点があります。 Scikit-learn predict_probaが間違った答えを与える も参照してください。

基本的に、前に提案したような大量のデータpredict_probaでマルチクラスの問題が発生した場合、うまく機能します。それ以外の場合、decision_functionから確率スコアを生成しない順序付けで間に合わせる必要があります。

Predict_probaを使用して辞書またはクラスと確率のリストを取得するための素敵なモチーフを次に示します。

model = svm.SVC(probability=True)
model.fit(X, Y)
results = model.predict_proba(test_data)[0]

# gets a dictionary of {'class_name': probability}
prob_per_class_dictionary = dict(Zip(model.classes_, results))

# gets a list of ['most_probable_class', 'second_most_probable_class', ..., 'least_class']
results_ordered_by_probability = map(lambda x: x[0], sorted(Zip(model.classes_, results), key=lambda x: x[1], reverse=True))
28
Alex

_probability=True_を設定して確率推定を計算するSVCクラスを作成する場合:

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

次に、通常どおりfitを呼び出し、次にpredict_proba([fv])を呼び出します。

10
ogrisel

より明確な回答を得るために、svmのscikit-learnからの情報を再度投稿します。

言うまでもなく、Plattスケーリングに関係する相互検証は、大規模なデータセットの場合、費用のかかる操作です。さらに、スコアの「argmax」は確率のargmaxではない可能性があるという意味で、確率の推定値はスコアと一致しない場合があります。 (たとえば、バイナリ分類では、predict_probaに従って確率が1/2未満のクラスに属するものとして、predictによってサンプルにラベルを付けることができます。)Plattの方法には理論上の問題があることも知られています。信頼スコアが必要であるが、これらは確率である必要はない場合、probability = Falseを設定し、predict_probaの代わりにdecision_functionを使用することをお勧めします。

Random Forest、AdaBoost、Gradient Boostingなどの他の分類器の場合、scikit-learnで予測関数を使用してもかまいません。

1
beahacker