LoginSignup
27
21

More than 5 years have passed since last update.

sklearnにおけるSVMのpredict_probaとdecision_functionについて

Last updated at Posted at 2018-11-25

この記事はどんな記事?

2値分類を解くための学習器としてSVMを使う方法が一般に考えられます.
このときに(一般的な)SVMは基本的には 分類のみ を行います.しかし,たとえばモデルの精度をROC-AUCなどで評価したいときはなんらかの形でスコアを計算しなければなりません.
sklearnではSVMを用いてスコアを計算する方法を以下の2種類提供しています.

  • decision_function
  • predict_proba(predict_log_proba)

この記事ではこの2つの方法の違いを説明します.
結論だけいえば基本的に decision_function を使用して,0~1にスケールされたスコアが欲しい場合のみ predict_proba を使用するのがいいかと思われます.

decision_function

はじめに decision_function について説明します.
これは特にオプションを指定することなく使用可能なメソッドで,引数で与えられたベクトル X の分離超平面からの符号付き距離を返します.
しかしSVMではヒンジ損失を用いて学習しているため,超平面から遠ければ遠いほど確信度があがるというのは個人的にすこし疑問に思うところもあります.

predict_proba

つぎに predict_probapredict_log_proba )についてです.
そもそも predict_proba メソッドを用いるときには,コンストラクタの指定で probability=True を指定する必要があることに注意してください.
これはPlatt Scalingと呼ばれる手法で decision_function で得られる符号付き距離 $f_x$ に対して,

Pr(y=1|x) \sim \frac{1}{1+exp(Af_x + B)}

といったように確率のようなスコアに落とし込みます.
定数の $A,B$ の決定は $y_+, y_-$ という変数変換をした上で $F$ を最大化します.

y_+ = \frac{N_+ + 1}{N_+ + 2} \\
y_- = \frac{1}{N_-+2} \\
F = \sum y_ilogp_i + (1-y_i) log (1 - p_i)

sklearnのデフォルトでは5fold cross-validationで $A,B$ を決定するようです.当然これはコストのかかる計算で計算時間を要します.極端に小さいデータに対してはあまり意味がないとも書かれています.
さらにこのPlatt Scalingには理論的な欠点があるらしく,あまり推奨されていないようです(公式ドキュメントより).

参考文献

27
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
21