web-dev-qa-db-ja.com

LinearSVCの決定関数を確率に変換する(Scikit learn python)

バイナリ分類問題にはscikit learnの線形SVM(LinearSVC)を使用します。 LinearSVCは予測ラベルと決定スコアを提供できることを理解していますが、確率推定(ラベルの信頼度)が必要でした。 (線形カーネルでのsklearn.svm.SVCと比較して)速度のためにLinearSVCを使用し続けたいと思います

import sklearn.svm as suppmach
# Fit model:
svmmodel=suppmach.LinearSVC(penalty='l1',C=1)
predicted_test= svmmodel.predict(x_test)
predicted_test_scores= svmmodel.decision_function(x_test) 

確率推定を単に[1 /(1 + exp(-x))]として取得するのに意味があるかどうかを確認します。ここで、xは決定スコアです。

あるいは、これを効率的に行うために使用できる分類子に関する他のオプションはありますか?

ありがとう。

28
chet

Sklearn.svm。*ファミリーのAPIを見てみました。以下のすべてのモデル、たとえば

  • sklearn.svm.SVC
  • sklearn.svm.NuSVC
  • sklearn.svm.SVR
  • sklearn.svm.NuSVR

共通の interface があり、

_probability: boolean, optional (default=False) 
_

モデルのパラメーター。このパラメーターがTrueに設定されている場合、libsvmは Platt Scaling の考え方に基づいて、SVMの出力の上に確率変換モデルをトレーニングします。変換の形式は、指摘したロジスティック関数に似ていますが、2つの特定の定数ABが後処理ステップで学習されます。詳細については、こちらもご覧ください stackoverflow post.

enter image description here

私は実際、この後処理がLinearSVCで利用できない理由を知りません。それ以外の場合は、predict_proba(X)を呼び出して確率推定値を取得します。

もちろん、単純なロジスティック変換を適用するだけでは、 Platt Scaling のようなキャリブレーションされたアプローチと同様に機能しません。プラットスケーリングのアンダーラインアルゴリズムを理解できる場合は、おそらく独自のスクリプトを作成するか、scikit-learn svmファミリに貢献できます。 :)また、_predict_proba_をサポートする上記の4つのSVMバリエーションを自由に使用できます。

11
greeness

scikit-learnは、この問題を解決するために使用できる CalibratedClassifierCV を提供します。これにより、LinearSVCまたはdecision_functionメソッドを実装するその他の分類器に確率出力を追加できます。

 svm = LinearSVC()
 clf = CalibratedClassifierCV(svm) 
 clf.fit(X_train, y_train)
 y_proba = clf.predict_proba(X_test)

ユーザーガイドには、その上にニース セクション があります。デフォルトでは、CalibratedClassifierCV + LinearSVCはPlattスケーリングを取得しますが、他のオプション(等張回帰法)も提供し、SVM分類器に限定されません。

81
Mikhail Korobov

速度が必要な場合は、replaceでSVMをsklearn.linear_model.LogisticRegression。これは、LinearSVCとまったく同じトレーニングアルゴリズムを使用しますが、ヒンジ損失ではなくログ損失を使用します。

[1 /(1 + exp(-x))]を使用すると、正式な意味(0〜1の数字)で確率が生成されますが、正当な確率モデルには準拠しません。

15
Fred Foo

本当に必要なのが実際の確率ではなく信頼性の尺度である場合は、LinearSVC.decision_function()メソッドを使用できます。 ドキュメント を参照してください。

1
Syncrossus