本文へスキップ
ひもとくAI

評価指標(正解率だけでは足りない)

レッスン 5/6

正解率99%なのに、役に立たないモデル

前のレッスンでは、テストデータで 正解率(予測が当たった割合)を測りました。正解率は分かりやすい指標ですが、それだけを見ていると大きな落とし穴にはまることがあります。

ある病気の検査をするモデルを考えます。1000人のうち、実際に病気の人は10人だけだとします。

ここで、どんな人が来ても「健康」と答えるだけのモデル を作ったとしましょう。このモデルの正解率はいくつになるでしょうか。

  • 健康な990人: 「健康」と答えるので、全員正解
  • 病気の10人: 「健康」と答えるので、全員不正解
正解率=9901000=99%\text{正解率} = \frac{990}{1000} = 99\%

正解率は99%です。数字だけ見ると非常に優秀なモデルに見えますが、病気の人を1人も見つけられていません。検査のためのモデルとしては、まったく役に立たないことになります。

このように、クラスの数に大きな偏りがあるデータ(不均衡データ)では、正解率だけではモデルの良し悪しを判断できません。病気の検査、不正利用の検出、不良品の発見など、実務で「見つけたいもの」はたいてい数が少ないため、この問題は頻繁に起こります。

そこで、「どんな間違い方をしたか」を分けて数える方法が必要になります。

混同行列:当たり方・外れ方を4つに分ける

病気の検査で、「病気(陽性)」を見つけたいクラスとします。予測と実際の組み合わせは、次の4通りに分けられます。

予測: 病気予測: 健康
実際: 病気正しく見つけた(TP)見逃した(FN)
実際: 健康誤って病気とした(FP)正しく健康とした(TN)

それぞれの名前は、英語の頭文字から来ています。

  • TP(True Positive): 病気と予測して、実際に病気だった
  • FN(False Negative): 健康と予測したが、実際は病気だった(見逃し)
  • FP(False Positive): 病気と予測したが、実際は健康だった(誤検知)
  • TN(True Negative): 健康と予測して、実際に健康だった

この4つを表にまとめたものを 混同行列 と呼びます。前のスライドの「全員を健康と答えるモデル」なら、TP = 0、FN = 10、FP = 0、TN = 990 です。見逃し(FN)が10件あることが、一目で分かります。

scikit-learnではconfusion_matrixで計算できます。

from sklearn.metrics import confusion_matrix

y_true = [1, 1, 1, 1, 0, 0, 0, 0]   # 実際(1 = 病気, 0 = 健康)
y_pred = [1, 1, 0, 0, 0, 0, 0, 1]   # 予測

confusion_matrix(y_true, y_pred)
# → [[3, 1],
#    [2, 2]]

scikit-learnの結果も、上の表と同じく 行が実際、列が予測 です。ただし番号の小さいクラス0(健康)が先に並ぶため、行も列も「健康 → 病気」の順になり、[[TN, FP], [FN, TP]] という並びになります。上の表とは並び順が逆なので注意してください。この例では、TN = 3、FP = 1、FN = 2、TP = 2 です。

適合率と再現率

混同行列の数字を使うと、正解率とは違う角度からモデルを評価できます。特によく使われるのが、次の2つです。

再現率(Recall): 本当に病気の人のうち、何割を見つけられたか

再現率=TPTP+FN\text{再現率} = \frac{TP}{TP + FN}

適合率(Precision): 病気と予測した人のうち、何割が本当に病気だったか

適合率=TPTP+FP\text{適合率} = \frac{TP}{TP + FP}

名前は英語を訳したものです。再現率の Recall は「回収する・呼び戻す」という意味で、「本物をどれだけ漏れなく拾い上げられたか」を表します。適合率の Precision は「正確さ」という意味で、「『本物だ』と言ったものが、どれだけ正確だったか」を表します。

最初のスライドの「全員を健康と答えるモデル」は、正解率99%でも再現率は 00+10=0\frac{0}{0 + 10} = 0 です。この数字なら、役に立たないことがすぐに分かります。

別のモデルで、病気の10人のうち8人を見つけ、健康な人のうち20人を誤って病気と判定したとします(TP = 8、FN = 2、FP = 20、TN = 970)。正解率は 8+9701000=97.8%\frac{8 + 970}{1000} = 97.8\% と、さっきのモデルより 下がります。しかし再現率は 810=0.8\frac{8}{10} = 0.8 で、病気の人の8割を見つけられます。検査のモデルとしては、こちらの方がはるかに役に立ちます。

どちらを重視するかは、目的で決まる

  • 再現率を重視: がん検診など、見逃し(FN)の被害が大きい場合。誤検知が増えても、精密検査で確かめればよい
  • 適合率を重視: 迷惑メールフィルタなど、誤検知(FP)の被害が大きい場合。大事なメールが迷惑メールに振り分けられる方が困る

ロジスティック回帰のしきい値を下げると、見逃しは減る(再現率が上がる)代わりに誤検知が増えます(適合率が下がる)。このように、2つの指標は多くの場合「片方を良くすると、もう片方が悪くなる」関係にあります。これを トレードオフ と呼びます。

振り返り

  • 不均衡データでは、正解率だけでは良し悪しが分からない
  • 混同行列で、見逃し(FN)と誤検知(FP)を分けて数える
  • 再現率は「見逃さない力」、適合率は「誤検知しない力」。どちらを重視するかは目的で決める

演習

演習を読み込んでいます…