私は sklearn.svm.svc from scikit-learn を使用してバイナリ分類をしています。 predict_proba()関数を使用して、確率の推定値を取得しています。 predict_proba()が内部的に確率を計算する方法を教えてもらえますか?
Scikit-learnは内部でLibSVMを使用し、これは Plattスケーリング を使用します。詳細は LibSVM作成者によるこのノート で説明し、SVMを調整してクラスに加えて確率を生成します予測。
プラットスケーリングでは、最初に通常どおりSVMをトレーニングし、次にパラメーターベクトル[〜#〜] a [〜#〜]および[〜#〜] b [〜#〜]など
_P(y|X) = 1 / (1 + exp(A * f(X) + B))
_
ここで、f(X)
は、超平面からのサンプルの符号付き距離です(scikit-learnの_decision_function
_メソッド)。この定義では logistic sigmoid を認識できます。これは、ロジスティック回帰とニューラルネットが決定関数を確率推定に変換するために使用する関数と同じです。
注意:B
パラメーター、「切片」、「バイアス」、またはあなたがそれを呼ぶのが好きなものは、このモデルからの確率推定に基づく予測を、SVM決定から得られるものと矛盾させることができます。関数f
。例えば。 f(X) = 10
とすると、X
の予測は正であると仮定します。ただし、_B = -9.9
_および_A = 1
_の場合、P(y|X) = .475
です。私はこれらの数値を薄い空気から引き出していますが、実際にこれが発生する可能性があることに気づきました。
事実上、Plattスケーリングは、クロスエントロピー損失関数の下でSVMの出力の上に確率モデルを訓練します。このモデルの過剰適合を防ぐために、内部の5重交差検証を使用します。つまり、_probability=True
_を使用したSVMのトレーニングは、バニラの非確率的SVMよりもかなり高価になる可能性があります。
実際、私は彼らがこのコードを使用して決定値を確率に変換するというわずかに異なる答えを見つけました
'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)) ;'
ここで、AとBの値はモデルファイル(probAとprobB)にあります。確率を決定値に、したがってヒンジ損失に変換する方法を提供します。
Ln(0)= -200を使用します。