ひとことで言うと
分類性能指標は、予測が当たった割合だけでなく、どの種類の誤りをどれだけ許したかを測る物差しです。モデルの優劣は指標の数値だけでは決まらず、正例・負例の意味と運用上の損失を合わせて読んで決めます。
健康診断の判定を考えると、全員を「異常なし」にすれば全体の正解率は高く見える一方、見逃しは増えます。検査の性能を語るには、受診者全体の的中率と、異常を拾う力を分けて見る必要があります。
なぜ必要か
正解率は、予測が正しかった件数を全件数で割った値です。たとえば異常が全体の1%しかない検知問題で、常に「正常」と予測すれば正解率は99%になります。しかし、検知したい異常を一件も拾えていません。クラス比率が偏るほど、正解率は多数派クラスを当てた結果に引っ張られます。
そこで、予測と正解の組合せを4つのマスに分け、見逃しと誤警報を別々に数えます。正例を正しく正例とした件数をTP、正例を負例とした件数をFN、負例を正例とした件数をFP、負例を正しく負例とした件数をTNと呼びます。各指標はこの4マスのどこを重く見るかの違いです。なお、マスの名称は「モデルが陽性と判定したか」と「実際に陽性か」の順を混同しないことが試験でも実装でも要点です。
| 実際は正例 | 実際は負例 | |
|---|---|---|
| 正例と予測 | TP(真陽性) | FP(偽陽性) |
| 負例と予測 | FN(偽陰性) | TN(真陰性) |
仕組み
二値分類では、4マスから代表的な指標を次のように組み立てます。 は全サンプル数です。
正解率は全体の的中、適合率は陽性と予測したものの確かさ、再現率は実際の陽性を拾う割合を表します。F1は適合率と再現率を調和平均した値で、どちらか一方だけが低い場合に高くなりにくい指標です。ここでは式の暗記より、分母が「予測した陽性」なのか「実際の陽性」なのかを区別します。
閾値を動かすと、同じスコア列でも予測ラベルが変わり、4マスと指標も変化します。閾値を下げれば陽性と判定する件数が増え、一般に見逃しは減る一方、誤警報は増えます。したがって、検証時に一つの閾値の数値だけを固定して比較すると、運用条件を隠した比較になり得ます。多クラスではクラスごとの指標を出した後、各クラスを同じ重みで平均するmacro、support(各クラスの正解件数)で重み付けするweighted、全クラスのマスを合算して計算するmicroを使い分けます。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 不均衡データの評価 | 少数クラスを含むクラス別指標やmacro平均も確認する | 正解率99%だけで高性能と判断する |
| 指標の選択 | 見逃しと誤警報のどちらが高コストかを先に置く | 常にF1を選べばよいとする |
| 多クラスの平均 | クラス均等ならmacro、件数重視ならweighted、全体の寄与ならmicro | macroとweightedを同じ意味で扱う |
| 閾値の影響 | 閾値を変えると4マスと指標が変わる | 指標をモデル固有の不変値とみなす |
実装で確かめる
同じ予測スコアに対して閾値だけを変え、正解率と再現率の材料となるマスが変わることを確認します。y_score は正例らしさ、threshold は陽性と判定する境目です。
import numpy as np
y_true = np.array([1, 1, 0, 0, 0])
y_score = np.array([0.55, 0.45, 0.40, 0.35, 0.10])
for threshold in (0.5, 0.3):
y_pred = (y_score >= threshold).astype(int)
tp = np.sum((y_true == 1) & (y_pred == 1))
fn = np.sum((y_true == 1) & (y_pred == 0))
accuracy = np.mean(y_true == y_pred)
recall = tp / (tp + fn)
print(threshold, accuracy, recall)
取り違えやすいもの
| 比較対象 | 切り分け |
|---|---|
| 正解率 | 全体の当たり具合。クラス比率の偏りを受けやすい |
| 適合率・再現率 | FPを抑えるかFNを抑えるかという、異なる業務上の優先度を表す |
| F1 | 適合率と再現率を一つにまとめる。誤りの金額を直接表す指標ではない |
| macro・weighted・micro | 多クラスの集計方法の違い。指標そのものの定義とは別の選択 |
| 閾値 | モデルのスコアをラベルへ変換する設定。指標と一緒に記録する |
想起チェック
不均衡データで正解率だけを見る危険は何か
多数派を当てるだけで高い値になり、少数派の見逃しを隠すことです。
指標を選ぶ前に決める業務上の判断は何か
誤警報(FP)と見逃し(FN)のどちらが高くつくかです。そこから適合率や再現率などの優先度を決めます。
閾値を下げたとき、なぜ指標が変わるのか
陽性と判定するサンプルが増え、TP・FP・FN・TNの数え上げが変わるからです。