二項分類を行うために、 scikit-learn のsklearn.svm.svcを使用しています。私はその predict_proba() 関数を使用して確率推定値を取得しています。predict_proba() が内部的に確率を計算する方法を教えてもらえますか?
2 に答える
Scikit-learn は内部で LibSVM を使用し、これは、LibSVM の作成者によるこのノートで詳しく説明されているように、Platt スケーリングを使用して SVM を調整し、クラス予測に加えて確率を生成します。
Platt スケーリングでは、最初に通常どおり SVM をトレーニングし、次にパラメーター ベクトルAとBを次のように最適化する必要があります。
P(y|X) = 1 / (1 + exp(A * f(X) + B))
ここf(X)
で、超平面からのサンプルの符号付き距離です (scikit-learn のdecision_function
方法)。この定義のロジスティック シグモイドは、ロジスティック回帰とニューラル ネットワークが決定関数を確率推定値に変換するために使用するのと同じ関数です。
注意:B
パラメータ、「切片」または「バイアス」、またはそれを呼びたいものは何でも、このモデルからの確率推定に基づく予測が、SVM 決定関数から得られるものと矛盾する可能性がありますf
。たとえばf(X) = 10
、 の予測X
が正であるとします。しかし、もしB = -9.9
そしてA = 1
、そしてP(y|X) = .475
。私はこれらの数字を何もないところから引き出していますが、これが実際に発生する可能性があることに気付いたでしょう.
事実上、Platt スケーリングは、交差エントロピー損失関数の下で SVM の出力の上に確率モデルをトレーニングします。このモデルがオーバーフィットするのを防ぐために、内部の 5 分割交差検証を使用します。つまり、SVM のトレーニングprobability=True
は、一般的な非確率的 SVM よりもはるかにコストがかかる可能性があります。