分類・検出の精度評価について
適合率と再現率を使いこなそう!

2016/10/15 機械学習 名古屋 第7回勉強会
後藤 俊介 ( @antimon2 )

自己紹介

  • 名前:後藤 俊介
  • 所属:有限会社 来栖川電算
  • 言語:Python, Julia, Ruby, Scala(勉強中), …
  • twitter: @antimon2
  • Facebook: antimon2
  • GitHub: antimon2

前回(分類精度の評価について)のあらすじ

シチュエーション

  • キノコが10個ある。
  • いくつかは安全なキノコで、いくつかは毒キノコ。
  • できるだけ安全なキノコだけを選びたい。
  • かつ、できる限りたくさんのキノコを選びたい。

例えば。

正解××××××
選択×××××

表にしてみた。

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14

正解率 (Accuracy)

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm Accuracy} = \frac{3 + 4}{3 + 2 + 1 + 4} = 0.7 $$

適合率 (Precision)

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm Precision} = \frac{3}{3 + 2} = 0.6 $$

再現率 (Recall)

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm Recall} = \frac{3}{3 + 1} = 0.75 $$

F-値 (F1-Score)

$$ \begin{eqnarray} {\rm F}_1 &=& \frac{2}{\frac{1}{\rm Precision} + \frac{1}{\rm Recall}}\\ &=& \frac{2 \times {\rm Precision} \times {\rm Recall}}{{\rm Precision} + {\rm Recall}}\\ &=& 0.66666\dots \end{eqnarray} $$

混同行列 (Confusion Matrix)

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14

True Positive

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm TP} = 3 $$
  • 正しく選ばれた事象の数(=安全なキノコを選んだ個数)

False Positive

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm FP} = 2 $$
  • 間違って選ばれた事象の数(=毒キノコを選んだ個数)

False Negative

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm FN} = 1 $$
  • 間違って選ばれなかった事象の数(=選ばなかったうちの安全なキノコの個数)

True Negative

 安全なキノコ毒キノコ
選んだキノコ32
選ばなかったキノコ14
$$ {\rm TN} = 4 $$
  • 正しく選ばれなかった事象の数(=選ばなかったうちの毒キノコの個数)

混同行列 (Confusion Matrix) 改

 +-
(+)TPFP
(-)FNTN

評価指標の再定義

$$ {\rm Accuracy} = \frac{{\rm TP} + {\rm TN}}{{\rm TP} + {\rm FP} + {\rm FN} + {\rm TN}} $$$$ {\rm Precision} = \frac{\rm TP}{{\rm TP} + {\rm FP}} $$$$ {\rm Recall} = \frac{\rm TP}{{\rm TP} + {\rm FN}} $$$$ {\rm F}_1 = \frac{2{\rm TP}}{2{\rm TP} + {\rm FP} + {\rm FN}} $$

シチュエーションその2

  • 金メダル・銀メダル・銅メダル が合計 30個 ある。デザインは同じ。
  • 誰かがいたずらで全部真っ赤なペンキを塗ってしまった。
  • どれが金メダルか・銀メダルか・銅メダルか、仕分けしたい。

分類結果(=混同行列)

 金メダル銀メダル銅メダル
たぶん金メダル703
たぶん銀メダル181
たぶん銅メダル019

TP, FP, FN, TN

 +-
(+)TPFP
(-)FNTN

まず「金メダル」に注目してみる。

 金メダル銀メダル銅メダル
たぶん金メダル703
たぶん銀メダル181
たぶん銅メダル019

「金メダルじゃない」をまとめる。

 金メダル金メダルじゃない
たぶん金メダル73
たぶん金メダルじゃない119

「金メダルかどうか」で TP〜TN が計算できる。

$$ \begin{eqnarray} {\rm TP}_G &=& 7\\ {\rm FP}_G &=& 3\\ {\rm FN}_G &=& 1\\ {\rm TN}_G &=& 19 \end{eqnarray} $$

他のメダルでも同様に。

 TPFPFNTN
金メダル73119
銀メダル82119
銅メダル91416

正解率(全正解率)

 金メダル銀メダル銅メダル
たぶん金メダル703
たぶん銀メダル181
たぶん銅メダル019
$$ \begin{eqnarray} {\rm Accuracy} &=& \frac{\sum_i {\rm TP}_i}{{\rm TP}_G + {\rm FP}_G + {\rm FN}_G + {\rm TN}_G}\\ &=& 0.8 \end{eqnarray} $$
  • 全メダルのうちの、正解だったメダルの割合。
  • (混同行列上は)2値分類のときと同じ考え方。最もシンプルな指標。

平均正解率

 TPFPFNTN
金メダル73119
銀メダル82119
銅メダル91416
$$ \begin{eqnarray} {\rm AvgAccuracy} &=& \frac{\sum_i \frac{{\rm TP}_i + {\rm TN}_i}{{\rm TP}_i + {\rm FP}_i + {\rm FN}_i + {\rm TN}_i}}{l}\\ &=& 0.866666\dots \end{eqnarray} $$
  • 各メダルごとに正解率を出して、その平均(相加平均)を取る。
  • 「どのクラス(この場合メダル)もそれなりによく正解しているか」が分かる指標。

平均適合率(マクロ適合率)

 TPFPFNTN
金メダル73119
銀メダル82119
銅メダル91416
$$ \begin{eqnarray} {\rm Precision_M} &=& \frac{\sum_i \frac{{\rm TP}_i}{{\rm TP}_i + {\rm FP}_i}}{l}\\ &=& 0.8 \end{eqnarray} $$
  • 各メダルごとに適合率を出して、その平均(相加平均)を取る。
  • 「どのクラス(この場合メダル)もそれなりによく『見る目』があるか」が分かる指標。

平均再現率(マクロ再現率)

 TPFPFNTN
金メダル73119
銀メダル82119
銅メダル91416
$$ \begin{eqnarray} {\rm Recall_M} &=& \frac{\sum_i \frac{{\rm TP}_i}{{\rm TP}_i + {\rm FN}_i}}{l}\\ &=& 0.818732\dots \end{eqnarray} $$
  • 各メダルごとに再現率を出して、その平均(相加平均)を取る。
  • 「どのクラス(この場合メダル)もそれなりによく『取りこぼしがない』か」が分かる指標。

平均F-値(マクロF-値)

$$ \begin{eqnarray} {\rm F_{1M}} &=& \frac{2 \times {\rm Precision_M} \times {\rm Recall_M}}{{\rm Precision_M} + {\rm Recall_M}}\\ &=& 0.809257\dots \end{eqnarray} $$
  • 平均適合率 と 平均再現率 とで計算する F-値。

シチュエーションその3

  • サバンナに迷い込んだ。ライオンが隠れている。
  • ライオンはいっぱいいるが、全部で何頭いるかは分からない。
  • ライオンを見つけ出したい(見つけたライオンを避けて通り過ぎたい)。

検出結果(≒混同行列)

 ライオンライオンじゃない
たぶんライオン73
(未検出)9-

TP, FP, FN , TN

 ライオンライオンじゃない
たぶんライオン73
(未検出)9-
$$ \begin{eqnarray} {\rm TP} &=& 7\\ {\rm FP} &=& 3\\ {\rm FN} &=& 9 \end{eqnarray} $$

適合率、再現率、F-値

$$ \begin{eqnarray} {\rm Precision} &=& \frac{\rm TP}{{\rm TP} + {\rm FP}} &=& 0.7\\ {\rm Recall} &=& \frac{\rm TP}{{\rm TP} + {\rm FN}} &=& 0.4375\\ {\rm F}_1 &=& \frac{2{\rm TP}}{2{\rm TP} + {\rm FP} + {\rm FN}} &=& 0.538461\dots\\ \end{eqnarray} $$

Point

  • TN が算出できないので、正解率(Accuracy)は計算できない。
  • でも(TNが計算に関係しない)適合率・再現率・F-値 は計算できる(これらだけで十分!)

ここで、先ほどまでと少し違う観点のお話をします。

※私たちはまだライオンがウヨウヨいるサバンナにいます。

  • Q. あなたがしたいことは、どちらに近いですか?
    • A1. できる限り安全にここを抜け出したい。
    • A2. 多少のケガは覚悟でとにかくここを抜け出したい。

A1. できる限り安全にここを抜け出したい。

(=「ここにはライオンいない」という箇所を見付けて確実に少しずつ歩いて行けば良さげ?)

= 「大丈夫だと思ったところにライオンがいた!」という状況には遭いたくない。

= 「ライオンを見つけ出す」という作業に対して 漏れ(=検出漏れ)を少なくしたい。

  • 銃を持っていて、銃弾が十分にあれば、とにかく あらゆる方向に撃ちまくれば良い
    • 外れ弾(ライオン以外を撃ってしまう)は多くなるかもしれない。
    • 撃ち漏らし (ライオンを撃ち損なう)はきっと少なくなる!

  • 外れ弾(=FP)が多くなる = 適合率 が下がる。
  • 撃ち漏らし (=FN)が少なくなる = 再現率 が上がる!

「できる限り安全に!」⇔「再現率を上げろ!」

A2. 多少のケガは覚悟で、とにかくここを抜け出したい。

(=「とにかく方向決めてまっすぐ突っ切る」ことでこの場を抜け出せば良さげ?)

= 「気がついたら目の前にライオンがいた!」という状況だけには遭いたくない。

= 「ライオンを見つけ出す」という 見極め だけはしっかりしたい。

  • 銃を持っているなら、例えば進む方向を決めて、その方向にいるライオンだけを確実に撃てば良い
    • 撃ち漏らし (ライオンを撃ち損なう)は多くなるかもしれない。
    • 外れ弾(ライオン以外を撃ってしまう)はきっと少なくなる!

  • 撃ち漏らし (=FN)が多くなる = 再現率 が下がる。
  • 外れ弾(=FP)が少なくなる = 適合率 が上がる!

「多少の危険は覚悟で!」⇔「適合率を上げろ!」

まとめ

まとめ1: エンジニアの皆さんへ

  • 「精度を上げよう」と考えたとき、適合率再現率(および F-値)を気にするようにしましょう。
    (場合によってはそもそも 正解率 を算出できない)
  • 「適合率を上げるにはどうすれば良いか」「再現率を上げるにはどうすれば良いか」のノウハウ・実績を積みましょう。

まとめ2: クライアントの皆さんへ

  • 自分が欲している「精度」が、適合率 なのか 再現率 なのかを把握しましょう。
    (さきほどの「ライオンのサバンナ」のメタファーを思い出しましょう)
  • そしてそれを エンジニアに明確に伝える ようにしましょう(重要)。

まとめ3

  • 適合率再現率 を、エンジニア・クライアント の共通概念にしましょう。

おしまい

ご清聴ありがとうございました。

おまけ

シチュエーションその4

というか、シチュエーションその3+α

  • サバンナの湿地帯に迷い込んだ。ライオンとワニが隠れている。
  • ライオンもワニもいっぱいいるが、全部で何頭/何匹いるかは分からない。
  • ライオンもワニも見つけ出したい(見つけたライオンやワニを避けて通り過ぎたい)。

もうお分かりですね?

おしまい