この記事はどんな記事?
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_proba
( predict_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には理論的な欠点があるらしく,あまり推奨されていないようです(公式ドキュメントより).