正解率99%なのに、役に立たないモデル
前のレッスンでは、テストデータで 正解率(予測が当たった割合)を測りました。正解率は分かりやすい指標ですが、それだけを見ていると大きな落とし穴にはまることがあります。
ある病気の検査をするモデルを考えます。1000人のうち、実際に病気の人は10人だけだとします。
ここで、どんな人が来ても「健康」と答えるだけのモデル を作ったとしましょう。このモデルの正解率はいくつになるでしょうか。
- 健康な990人: 「健康」と答えるので、全員正解
- 病気の10人: 「健康」と答えるので、全員不正解
正解率=1000990=99%
正解率は99%です。数字だけ見ると非常に優秀なモデルに見えますが、病気の人を1人も見つけられていません。検査のためのモデルとしては、まったく役に立たないことになります。
このように、クラスの数に大きな偏りがあるデータ(不均衡データ)では、正解率だけではモデルの良し悪しを判断できません。病気の検査、不正利用の検出、不良品の発見など、実務で「見つけたいもの」はたいてい数が少ないため、この問題は頻繁に起こります。
そこで、「どんな間違い方をしたか」を分けて数える方法が必要になります。
混同行列:当たり方・外れ方を4つに分ける
病気の検査で、「病気(陽性)」を見つけたいクラスとします。予測と実際の組み合わせは、次の4通りに分けられます。
それぞれの名前は、英語の頭文字から来ています。
- 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): 本当に病気の人のうち、何割を見つけられたか
再現率=TP+FNTP
適合率(Precision): 病気と予測した人のうち、何割が本当に病気だったか
適合率=TP+FPTP
名前は英語を訳したものです。再現率の Recall は「回収する・呼び戻す」という意味で、「本物をどれだけ漏れなく拾い上げられたか」を表します。適合率の Precision は「正確さ」という意味で、「『本物だ』と言ったものが、どれだけ正確だったか」を表します。
最初のスライドの「全員を健康と答えるモデル」は、正解率99%でも再現率は 0+100=0 です。この数字なら、役に立たないことがすぐに分かります。
別のモデルで、病気の10人のうち8人を見つけ、健康な人のうち20人を誤って病気と判定したとします(TP = 8、FN = 2、FP = 20、TN = 970)。正解率は 10008+970=97.8% と、さっきのモデルより 下がります。しかし再現率は 108=0.8 で、病気の人の8割を見つけられます。検査のモデルとしては、こちらの方がはるかに役に立ちます。
どちらを重視するかは、目的で決まる
- 再現率を重視: がん検診など、見逃し(FN)の被害が大きい場合。誤検知が増えても、精密検査で確かめればよい
- 適合率を重視: 迷惑メールフィルタなど、誤検知(FP)の被害が大きい場合。大事なメールが迷惑メールに振り分けられる方が困る
ロジスティック回帰のしきい値を下げると、見逃しは減る(再現率が上がる)代わりに誤検知が増えます(適合率が下がる)。このように、2つの指標は多くの場合「片方を良くすると、もう片方が悪くなる」関係にあります。これを トレードオフ と呼びます。
振り返り
- 不均衡データでは、正解率だけでは良し悪しが分からない
- 混同行列で、見逃し(FN)と誤検知(FP)を分けて数える
- 再現率は「見逃さない力」、適合率は「誤検知しない力」。どちらを重視するかは目的で決める