2013-02-27 60 views
31

私はsklearn.svm.svcscikit-learnから使用して、バイナリ分類を行います。確率予測を得るために、そのpredict_proba()関数を使用しています。 predict_proba()が内部的に確率を計算する方法を教えてもらえますか?sklearn.svm.svcのpredict_proba()関数はどのように内部的に動作しますか?

+1

これはSOです - プログラミングについてですが、コードを怖がらないでください。 – danodonovan

答えて

60

Scikit-learnはLibSVMを内部的に使用し、this note by the LibSVM authorsに記載されているようにPlatt scalingを使用して、クラス予測に加えて確率を生成するようにSVMを調整します。

プラットスケーリングは、まずパラメータ・ベクトルをBようf(X)が超平面(scikit学習者からのサンプルの符号付き距離である

P(y|X) = 1/(1 + exp(A * f(X) + B)) 

それを最適化する、いつものようにSVMを訓練する必要decision_function方法)。この定義のlogistic sigmoidは、ロジスティック回帰とニューラルネットが決定関数を確率推定に変えるのに使用するのと同じ機能です。

Bパラメータ、「インターセプト」または「バイアス」など、あなたがそれを呼びたいと思うものは、このモデルからの確率推定に基づく予測がSVM決定関数から得られるものと矛盾することがありますf。例えば。 f(X) = 10とすると、Xの予測は肯定的です。 B = -9.9A = 1の場合は、P(y|X) = .475です。私は薄い空気からこれらの数字を引き出していますが、これは実際に起こりうることに気付いています。

効果的に、Plattスケーリングは、クロスエントロピー損失関数の下でSVMの出力の上に確率モデルを訓練する。このモデルがオーバーフィットするのを防ぐために、内部の5倍のクロスバリデーションを使用しています。つまり、probability=TrueのトレーニングSVMは、バニラの確率的でないSVMよりもかなり高価です。

+1

偉大な答え@larsmans。私は確率が分類の決定のための信頼尺度として解釈できるかどうか疑問に思っていますか?例えば。サンプルの正と負のクラスの確率が非常に近いことを意味します。 –

+1

ありがとう@larsmans。私は実際にはもっと劇的なケースを見ました - 予測は1ですが、確率は0.45です。私はベイズ最適カットオフが正確に0.5であると思った。このような劇的なケースは、LibSVMの数値的な不安定性によっても説明できると思いますか? –

+1

@MosesXu:これは調べる価値がありますが、私はLibSVMコードATMを掘り下げる時間がありません。一見すると一貫していないように見えますが、実際にはその確率を使用するのではなく、SVMの超平面であると私は思っています。 –

0

は、実際に私はAとBの値は、モデルファイル(probAとprobB)で見つけることができるここで

'double fApB = decision_value*A+B; 
if (fApB >= 0) 
    return Math.exp(-fApB)/(1.0+Math.exp(-fApB)); 
else 
    return 1.0/(1+Math.exp(fApB)) ;' 

彼らは確率に判定値を変換するには、このコードを使用することをわずかに異なる答えを見つけました。 確率を決定値に変換してヒンジ損失に変換する方法を提供します。

ln(0)= -200を使用します。

関連する問題