機械学習を勉強し始めると、最初に出てくる評価指標はたいてい 「精度 (Accuracy)」 です。
$$\text{Accuracy} = \frac{\text{正しく当てた数}}{\text{全体のデータ数}}$$
意味も分かりやすいし、「とりあえず精度が高ければ良さそう」と思いがちです。
ただ、実務でモデルを作り始めると、こんなことが起きます。
「モデルの精度は 98%。グラフもきれい。
なのに現場の人から『いや、それだと困るんだよね…』と言われる」
よくあるのが、こんなパターンです。
- 不正利用は全体の 1% しかない
- モデルが「全部、正常です」と予測して 精度 99% を叩き出す
- 数字だけ見れば「すごいモデル」だが、不正を1件も見つけていない
このギャップの根本は、「精度」という1つの指標だけでモデルを評価してしまっていることにあります。
この記事では、このモヤモヤを解消するために、実務でよく出てくる評価指標を解説します。
ゆるく(数式は最低限)
用語と意味は丁寧に
どんなミスをしてほしくないかという視点で
扱う指標は以下の通りです。
- Accuracy (正解率)
- Precision (適合率)
- Recall (再現率)
- F1-score
- ROC / AUC
共通の「お題」:クレジットカードの不正検知
話を分かりやすくするため、最後まで同じシナリオを使います。
- タスク: クレジットカードの不正利用を検知する
-
データ: 1000 件の取引ログ
- 正常取引: 980 件
- 不正取引: 20 件(全体の2%)
ここに対して、わざと極端な2つのモデルを登場させます。
モデルA:ぜんぶ「正常」と予測するやつ
すべての取引に対して「正常です」とだけ言うモデル。不正は1件も当てません。
- Accuracy: $980 \div 1000 = 0.98$ (98%)
- 数字だけ見れば超高性能に見えます。
モデルB:不正はかなり当てるけど、誤検知も多いやつ
-
不正20件のうち、18件を「不正」と当てる
-
正常980件のうち、100件を誤って「不正」と判定する
-
Accuracy: $(18 + 880) \div 1000 = 0.898$ (約90%)
Accuracyだけを見ると、モデルA(98%)の方がモデルB(90%)より優秀に見えます。
でも「不正を見つけたい」という目的からすると、不正をスルーするモデルAは役に立ちません。
このズレを整理するために、まずは4つの用語を押さえましょう。
混同行列と4つの用語
機械学習の2クラス分類では、よくこの表(混同行列)が出てきます。
| 実際のクラス | |||
|---|---|---|---|
| 陽性 (不正) | 陰性 (正常) | ||
| 予測クラス (モデルの出力) |
陽性 | TP (真陽性) |
FP (偽陽性) |
| 陰性 | FN (偽陰性) |
TN (真陰性) |
|
今回のシナリオでは 「陽性=不正」「陰性=正常」 とします。
1. 真陽性 (TP: True Positive)
「実際に陽性で、モデルも陽性と予測した」
- 今回の例:「本当に不正な取引を、不正と正しく検知できた」
- イメージ:スパムメールをちゃんと「スパム」と判定できた。ナイス正解。
2. 偽陽性 (FP: False Positive)
「実際は陰性なのに、モデルが陽性と予測してしまった」
- 今回の例:「本当は正常な取引なのに、不正と誤判定した」
- イメージ:普通のメールなのに、スパムフォルダに入ってしまった。「オオカミ少年」的な誤報・空振りです。
3. 偽陰性 (FN: False Negative)
「実際は陽性なのに、モデルが陰性と予測してしまった」
- 今回の例:「本当は不正なのに、正常として見逃してしまった」
- イメージ:"がん"があるのに、検査で「異常なし」と出てしまった。見逃しのケースで、タスクによっては一番致命的になります。
4. 真陰性 (TN: True Negative)
「実際に陰性で、モデルも陰性と予測した」
- 今回の例:「本当に正常な取引を、正常と判定できた」
- イメージ:平和な日常。何も起きないのが正しいパターン。
各指標の解説と「性格」
Accuracy (正解率):とりあえずみんなが見る「平均点くん」
$$\text{Accuracy} = \frac{TP + TN}{TP + FP + FN + TN}$$
- モデルA: 98%
- モデルB: 90%
これは、クラスごとの人数差が激しいとき(不均衡データ)には役に立たないことがあります。
「40人のクラスで、39人が100点、1人が0点でも、平均点は97.5点」になってしまい、0点の生徒が困っていることに気づけないのと似ています。
Precision (適合率):「当てたって言うならちゃんと当ててよ」係
「モデルが『陽性だよ』と言ったものの中で、何割が本当に陽性だったか」
$$\text{Precision} = \frac{TP}{TP + FP}$$
- モデルB: $18 \div (18 + 100) \approx 15%$
モデルBは「不正だ!」と118回叫びましたが、本当に不正だったのは18回だけ。残りの100回は誤報(偽陽性)でした。
【どんな時に重視する?】
- 誤検知(偽陽性)がウザいとき
- 例:スパム判定(重要メールがスパムに入ると困る)、レコメンド(興味ない商品ばかり出ると困る)
Recall (再現率):「とにかく見逃すな」係
「実際に陽性だったもののうち、何割をちゃんと拾えているか」
$$\text{Recall} = \frac{TP}{TP + FN}$$
- モデルB: $18 \div (18 + 2) = 90%$
- モデルA: $0 \div (0 + 20) = 0%$
モデルAはここで脱落です。不正を検知する気がないことがバレました。
【どんな時に重視する?】
- 見逃し(偽陰性)が怖いとき
- 例:病気の発見、不正検知、火災報知器
F1-score:バランス係
PrecisionとRecallのバランスを見る指標です(調和平均)。
$$\text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
- モデルB: 約 26%
- モデルA: 0%
Accuracyだけでは見えなかった「モデルBの方が(不正検知としては)マシである」ことが、数値として表れます。
ROC / AUC:「このモデル、伸びしろありそう?」を見る係
多くのモデルは「白か黒か」ではなく、「不正スコア 0.8」のような確率を出します。
「0.5以上なら陽性」とするか、「0.8以上なら陽性」とするかで、TPやFPの数は変わります。
この閾(しきい)値を動かしたときの性能変化を表したのが ROC曲線 です。
- AUC (Area Under the Curve): 曲線の下側の面積。
- 1.0 に近いほど「良いモデル(伸びしろがある)」
- 0.5 くらいだと「コイントス(運任せ)レベル」
今の閾値での一点突破を見るのがAccuracyやF1なら、AUCは「閾値を調整すれば化けるポテンシャルがあるか」を見る人事担当のような指標です。
まとめ:結局どれを見ればいいの?
| 指標 | モデルA (全部正常) | モデルB (そこそこ検知) | 性格 |
|---|---|---|---|
| Accuracy | 98% | 90% | 平均点主義。不均衡データに弱い。 |
| Precision | - | 15% | 誤検知(オオカミ少年)を許さない。 |
| Recall | 0% | 90% | 見逃しを許さない。 |
| F1-score | 0% | 26% | バランス重視。 |
タスク別「重視すべき指標」早見表
| タスク例 | 一番つらいミス | 重視したい指標 |
|---|---|---|
| がん検診・不正検知 | 見逃す (偽陰性) | Recall (まずは発見) |
| スパムメール判定 | 重要メールが消える (偽陽性) | Precision (誤判定NG) |
| 検索エンジン | 変なサイトが混ざる | Precision / F1 |
明日からできる小さな一歩
-
accuracy_scoreだけで満足しない。 必ずclassification_reportも一緒に出して Precision / Recall を確認する癖をつける。 - 「どんなミスが痛いか」を言語化する。 「見逃しが怖いのか」「誤報が怖いのか」を一言メモするだけで、見るべき指標が決まります。
データラーニングギルドとは?
データラーニングギルド は、株式会社データラーニングが運営する、
データサイエンスを中心とした学習者・現役データサイエンティスト・エンジニアのためのコミュニティです。
学びの共有・キャリア形成・横のつながりを大切にし、
勉強会、LT会、技術相談、キャリア支援、案件紹介など、
「データ領域で挑戦したい人を応援する活動」を幅広く行っています。
初心者から実務者まで、誰もが成長できる場づくりを目指しています。
