Skip to content

Instantly share code, notes, and snippets.

@bilzard
Created April 30, 2019 18:00
Show Gist options
  • Save bilzard/1554484055cc2cd06a07aea6e37a585a to your computer and use it in GitHub Desktop.
Save bilzard/1554484055cc2cd06a07aea6e37a585a to your computer and use it in GitHub Desktop.

2クラス分類を多クラス分類に拡張する

二値分類を多クラス分類に拡張するには以下の方法がある:

  • One-vs-.rest (OvR)
  • One-vs.-one (OvO)

One-vs-.rest (OvR)

「そのクラスに所属するか否か」を判定した二値判別機を各クラスごとに学習する.

入力:

  • $L$: 学習機(binary classifier)
  • $X$: サンプルセット
  • $y$: クラスのラベル. $k_i\in{1, ..., K}$はサンプル点$X_i$のラベルを表す

出力:

  • $f_k$ for $k\in{1, ..., K}$

処理:

  • $k\in{1, .., K}$なるすべての$k$に対して:
    • 新しいラベル変数$z_i$を生成する:
      • $y_i=k$の場合, $z_i=y_i$,
      • それ以外の場合, $z_i=0$.
    • サンプル集合$X$, $z$に学習機$L$を適用し、$f_k$を得る

サンプル$x$があるクラスに所属するかどうかは、各classifierの判別結果の最大作用素点(argmax)として以下のように表される:

$$\hat{y}=\underset{k\in{1,...,K}}{\text{argmax}}f_k(x)$$

例: 0,1, 2 の3クラス分類の場合

あるサンプル$x$に対して、それぞれの識別器の判別結果が$f_0=0.1$, $f_1=0.6$, $f_2=0.4$ だったとする. 最も確率が高い確率(0.6)を出力した判別機$f_1$であるから、最終的な識別結果は$f_1$に対応するクラス1と判定する.

注意点

One-vs-.restはよく使われる手法だが、いくつかの問題を抱えたヒューリスティックな手法である:

  • 各 binary classifier 間で、判別結果の信頼性が著しく異なるケースについて考慮していない(信頼性が著しく低い classifier の判別結果と著しく高い classifier の判別結果を同等に扱っている)
  • 学習セットのクラスの分布が均一にだったとしても、クラス判別機の入力として与えられるクラスの分布は不均一になる(例: 「クラスA」のサンプル数よりも「クラスA以外」のサンプル数が遥かに多くなる)

One-vs-.one (OvO)

異なる2クラス同士のすべての組み合わせ($K(K-1)/2$)について二値判別機(binary classifier)を学習する. 予測時はそれぞれの判別機の判別結果を1票ずつ投票し、最も得票数が多かったクラスを判別結果とする.

OvOもOvRと同様に、2つ以上のクラスが同票を獲得する可能性があるという曖昧さを含む.

参考資料

@bilzard
Copy link
Author

bilzard commented Apr 30, 2019

数式を読むには以下の chrome extension をインストールしてください:
https://chrome.google.com/webstore/detail/mathjax-plugin-for-github/ioemnmodlmafdkllaclgeombjnmnbima

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment