はじめに
機械学習のモデルを構築した際、そのモデルが良いものなのか、悪いものなのかを客観的に判断する必要があります。その判断基準となるのが「評価指標」です。
特に、あるデータがどのクラスに分類されるかを予測する「分類問題」では、様々な評価指標が使われます。今回はその中でも特に重要な正解率 (Accuracy)、適合率 (Precision)、再現率 (Recall)、そしてF値 (F-measure)について、初心者の方でもわかるように解説していきます。
評価の基本:混合行列 (Confusion Matrix)
各指標を理解する前に、基本となる「混合行列」について知っておく必要があります。混合行列は、分類モデルの予測結果をまとめた表で、どれを正しく分類でき、どれを間違って分類したかが一目でわかります。
例えば、画像に写っているのが「猫」か「猫以外」かを判定するモデルを考えてみましょう。「猫である」ことを陽性 (Positive)、「猫以外である」ことを陰性 (Negative)とします。このとき、予測結果は以下の4つのパターンに分類されます。
- 真陽性 (True Positive; TP): 実際に「猫」の画像を、正しく「猫」と予測できた。
- 偽陽性 (False Positive; FP): 実際は「猫以外」の画像を、間違って「猫」と予測してしまった。
- 真陰性 (True Negative; TN): 実際に「猫以外」の画像を、正しく「猫以外」と予測できた。
- 偽陰性 (False Negative; FN): 実際は「猫」の画像を、間違って「猫以外」と予測してしまった。(見逃し)
これから説明する評価指標は、すべてこのTP, FP, TN, FNの組み合わせで計算されます。
1. 正解率 (Accuracy)
正解率は、最も直感的で分かりやすい評価指標です。「全てのデータの中で、予測が正解したものの割合」を示します。
長所と短所
長所: 全体としてどれくらい正しく予測できたかを一目で把握でき、解釈がしやすいです。
短所: データの数に偏り(不均衡)がある場合に、モデルの性能を正しく評価できないことがあります。 例えば、1000件のメールのうち、迷惑メールが10件、正常なメールが990件というデータセットがあったとします。このとき、モデルが全てのメールを「正常なメール」と予測するだけで、正解率は99% (990/1000) と非常に高くなります。 しかし、このモデルは迷惑メールを1件も検出できていないため、実用的とは言えません。
2. 適合率 (Precision)
適合率は、「『陽性』と予測したデータの中で、実際に『陽性』だったものの割合」を示します。 「予測の精度」と言い換えることもできます。
どのような時に重要か?
適合率は、偽陽性 (FP) をなるべく減らしたい場合に重要な指標となります。 つまり、「間違って陽性と予測すること」のコストが高いケースです。
例:迷惑メールフィルタ
重要なメールが迷惑メールと誤判定され(偽陽性)、ユーザーに届かない事態は絶対に避けたいです。この場合、モデルが「迷惑メールだ」と予測したもののうち、本当に迷惑メールである割合(適合率)が高いことが求められます。
3. 再現率 (Recall)
再現率は、「実際に『陽性』だったデータの中で、モデルが『陽性』と予測できたものの割合」を示します。 「網羅率」や「感度」とも呼ばれます。
どのような時に重要か?
再現率は、偽陰性 (FN) をなるべく減らしたい場合に重要な指標となります。 つまり、「本当に陽性のものを見逃すこと」のコストが高いケースです。
例:病気の診断
がん検診などで、実際は病気(陽性)の患者を、誤って健康(陰性)と診断してしまう(偽陰性)と、治療の機会を失う深刻な事態につながります。この場合、実際の患者をどれだけ見逃さずに検出できるか(再現率)が極めて重要になります。
4. 適合率と再現率のトレードオフ、そしてF値 (F-measure)
トレードオフの関係
適合率と再現率は、多くの場合トレードオフの関係にあります。 一方を高くしようとすると、もう一方が低くなる傾向があるのです。
例えば、病気の診断で「少しでも怪しければ陽性と判定する」ように基準を緩めると、病気の人を見逃す確率(偽陰性)は減り、再現率は上がります。しかしその反面、健康な人を誤って病気と判定する確率(偽陽性)が増え、適合率は下がってしまいます。
F値 (F-measure / F1-score)
このトレードオフの関係にある適合率と再現率のバランスを取りたい場合に用いるのがF値です。F値は、適合率と再現率の調和平均で計算されます。
F値は、適合率と再現率の両方が高い場合に高くなり、どちらか一方が極端に低いとF値も低くなります。 そのため、両方の指標をバランス良く評価したい場合に適しています。
各指標の使い分けまとめ
これまでの指標をまとめると、以下のようになります。
評価指標 | 見ているもの | 重視するケース | 注意点 |
---|---|---|---|
正解率 (Accuracy) | 全体のうち、どれだけ正しく予測できたか | データクラスのバランスが良い場合、全体的な性能をざっくり把握したい時 | 不均衡なデータでは、モデルの性能を正しく評価できない可能性がある |
適合率 (Precision) | 陽性と予測したものの中での正解率 | 「間違って陽性と予測する」(偽陽性) コストが高い時 (例: 迷惑メール判定) | 陽性の見逃し (偽陰性) を評価できない |
再現率 (Recall) | 実際に陽性のもののうち、どれだけ見つけられたか | 「陽性を見逃す」(偽陰性) コストが高い時 (例: 病気の診断) | 誤った陽性予測 (偽陽性) を評価できない |
F値 (F-measure) | 適合率と再現率のバランス | 適合率と再現率の両方をバランス良く評価したい時、不均衡データでの評価 | 適合率と再現率のどちらをより重視すべきか、という観点は薄れる |
Python (scikit-learn) での計算例
Pythonの機械学習ライブラリであるscikit-learnを使うと、これらの評価指標を簡単に計算できます。
`classification_report`という便利な関数があり、適合率、再現率、F値を一度に出力してくれます。
from sklearn.metrics import accuracy_score, classification_report
# 正解ラベル (0: 陰性, 1: 陽性)
y_true =
# モデルの予測ラベル
y_pred =
# 正解率の計算
accuracy = accuracy_score(y_true, y_pred)
print(f"正解率 (Accuracy): {accuracy:.2f}")
# 適合率、再現率、F値のレポート出力
# target_namesでラベルの名前を指定できる
report = classification_report(y_true, y_pred, target_names=['陰性 (class 0)', '陽性 (class 1)'])
print(report)
出力結果:
正解率 (Accuracy): 0.70 precision recall f1-score support
陰性 (class 0) 0.60 0.75 0.67 4
陽性 (class 1) 0.80 0.67 0.73 6 accuracy 0.70 10 macro avg 0.70 0.71 0.70 10
weighted avg 0.72 0.70 0.70 10
このレポートから、陽性クラス (class 1) に関しては、適合率が0.80、再現率が0.67、F値が0.73であることがわかります。