← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:学習問題の定式化(仮説・損失・経験リスク) | 関連:評価指標(回帰) | 数理:第一種の過誤・第二種の過誤・検出力(2種類の誤りとトレードオフ・サンプルサイズ設計)(統計)

要点(BLUF)

1. すべての出発点:混同行列

二値分類は「正例(positive, 1)か負例(negative, 0)か」を当てる問題です。予測と正解の組み合わせは4通りしかありません。これを並べたのが 混同行列(confusion matrix) です。

予測:正予測:負
実際:正TP(真陽性)FN(偽陰性・見逃し)
実際:負FP(偽陽性・誤検出)TN(真陰性)

FP(偽陽性)・FN(偽陰性)という2種類の過誤の区別は、統計の検定における 第一種・第二種の過誤 と同じ考え方です。再現率は検出力(検定力)と対応します。

flowchart TD
  S["1件の予測"] --> A{"実際は正例か"}
  A -->|"正例"| B{"正と予測したか"}
  A -->|"負例"| C{"正と予測したか"}
  B -->|"はい"| TP["真陽性(TP)"]
  B -->|"いいえ"| FN["偽陰性(FN)・見逃し"]
  C -->|"はい"| FP["偽陽性(FP)・誤検出"]
  C -->|"いいえ"| TN["真陰性(TN)"]

2. 正解率とその落とし穴

正解率(accuracy) は「全予測のうち当たった割合」です。

Accuracy=TP+TNTP+FP+FN+TN\text{Accuracy} = \frac{TP + TN}{TP + FP + FN + TN}

要するに:何件中何件当たったか。直観的ですが、クラスが不均衡だと壊れます

たとえば正例が1%しかない病気の検査で、「全員陰性」と答えるだけのモデルは正解率99%です。しかし正例は1件も見つけられていません。多数派に張るだけで高い正解率が出てしまう ——これが正解率の落とし穴で、不均衡データで正解率だけを見てはいけない最大の理由です。

3. 適合率・再現率とトレードオフ

そこで、正例に注目した2つの指標を使います。

適合率(precision):正と予測したもののうち、本当に正だった割合。

Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}

要するに:「正だと言ったときの当たりやすさ」。誤検出(FP)を嫌うときに見ます。

再現率(recall, 感度・TPR):実際の正例のうち、拾えた割合。

Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}

要するに:「正例の取りこぼしのなさ」。見逃し(FN)を嫌うときに見ます。

両者は トレードオフ の関係にあります。閾値を下げて「少しでも怪しければ正」と判定すれば、取りこぼしは減って再現率は上がりますが、誤検出が増えて適合率は下がります。逆も同様です。どちらを重視するかは 問題のコスト で決めます。

flowchart LR
  T["判定閾値"] -->|"下げる"| R1["再現率↑・適合率↓<br/>見逃し減・誤検出増"]
  T -->|"上げる"| R2["適合率↑・再現率↓<br/>誤検出減・見逃し増"]

4. F1スコア:適合率と再現率の調和平均

片方だけ良くても意味がないことが多いので、両者を1つにまとめます。F1スコア は適合率と再現率の 調和平均 です。

F1=2PrecisionRecallPrecision+RecallF_1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}

要するに:適合率と再現率の「両方が高くないと高くならない」バランス点。

なぜ算術平均でなく調和平均かというと、調和平均は 小さい方に強く引っ張られる からです。片方が極端に低い(例:再現率0.99だが適合率0.01)ときに「平均0.5」と過大評価せず、低い方に近い値(約0.02)を返します。両者を同時に高くしないと報われない設計です。

一般化した FβF_\beta では β\beta で再現率の重みを調整できます。β>1\beta>1 で再現率重視、β<1\beta<1 で適合率重視。F1F_1β=1\beta=1(同等の重み)の場合です。

5. 閾値を動かして全体を見る:PR曲線とROC曲線

多くの分類器は「正である確率(スコア)」を出し、それを 閾値 で正負に切ります。閾値は1つの値ではなく、0〜1まで連続的に動かせます。閾値ごとに混同行列が変わるので、閾値を全範囲で動かしたときの性能の軌跡 を曲線で描きます。

PR曲線(Precision-Recall曲線):横軸に再現率、縦軸に適合率。閾値を動かすと描かれる曲線。正例(少数派)に注目した曲線です。

ROC曲線(Receiver Operating Characteristic):横軸に FPR(偽陽性率)、縦軸に TPR(=再現率)

FPR=FPFP+TN,TPR=TPTP+FN\text{FPR} = \frac{FP}{FP + TN}, \qquad \text{TPR} = \frac{TP}{TP + FN}

要するに:FPRは「負例を誤って正と言った割合」、TPRは「正例を拾えた割合」。閾値を下げると両方上がり、点は右上へ動きます。

graph LR
  O["(0,0)<br/>閾値=最大<br/>全部を負と判定"] --> M["曲線が<br/>左上に張り出すほど良い"]
  M --> P["(1,1)<br/>閾値=最小<br/>全部を正と判定"]
  D["対角線=ランダム<br/>(AUC=0.5)"]

理想は左上の角 (0,1)(0,1) に近づくこと(誤検出ゼロで全部拾う)。対角線 y=xy=xランダム予測 で、それより下なら予測が逆効果ということです。

6. AUC:曲線を1つの数にまとめる

ROC曲線の 下の面積AUC(Area Under the Curve) です。0.50.5(ランダム)〜1.01.0(完璧)の値をとり、閾値に依存しない 単一指標としてモデル比較に使えます。

AUCには美しい確率的解釈があります。

AUC=P(s(x+)>s(x))\text{AUC} = P\big(\,s(x^+) > s(x^-)\,\big)

要するに:ランダムに選んだ正例のスコア s(x+)s(x^+) が、ランダムに選んだ負例のスコア s(x)s(x^-) より 高くなる確率。つまり「正例を負例より上位にランク付けできる確率」です。AUC=0.8なら、正例・負例を1つずつ取り出したとき80%の確率で正例の方が高スコアになります。

この量は統計の マン・ホイットニーのU統計量(ウィルコクソンの順位和検定)と一致します。AUCは本質的に「2群のスコア分布がどれだけ分離しているか」を順位で測る指標です。

AUCは閾値を1つに決めずに ランク付けの良さ だけを評価する点が、正解率やF1と決定的に違います。

7. 閾値の選び方

ROC・PR曲線は「全閾値の性能一覧」なので、最後に 運用する閾値を1つ選ぶ 必要があります。代表的な選び方:

flowchart TD
  Q{"FPとFNのコストは<br/>同じか"}
  Q -->|"同じ・均衡データ"| J["ユーデンのJ最大化<br/>またはF1最大化"]
  Q -->|"違う・不均衡データ"| C["期待コスト最小化<br/>(コスト考慮の閾値)"]

8. 不均衡データでは PR を見る理由

ROCには弱点があります。FPRの分母は FP+TNFP + TN で、負例(多数派)が膨大だと FPが多少増えてもFPRはほとんど動きません。結果、負例だらけのデータでは ROCもAUCも楽観的に高く見える ことがあります。

一方、PR曲線の適合率 TP/(TP+FP)TP/(TP+FP)多数派のTNを一切含まない ため、誤検出の影響が直接効きます。少数派の正例を正しく拾えているかを正直に映すので、正例がレアな問題(異常検知・不正検知・希少疾患)ではPR曲線(PR-AUC)を主に見る のが定石です。

なお、ランダム予測のPR-AUCのベースラインは 正例の割合(有病率) です(例:正例1%ならPR-AUCのランダム値は約0.01)。ROCのランダム値が常に0.5なのと違い、PRは不均衡度で基準が変わる点に注意します。

急速に変わる論点ではありませんが、近年は「閾値選択は確率較正(calibration)を前提にすべき」という議論もあります。ROC基準だけで閾値を決めるのが万能ではない点は要最新確認です。

⚠️ よくある誤解

対応するシミュレーション

simulations/roc_pr_curves.py:ロジスティック回帰の出力スコアのしきい値を 11 から 00 まで動かしながら TPR・FPR・適合率・再現率を計算し、ROC曲線PR曲線を描きます。曲線の下の面積(AUC)を台形則で求め、ROC-AUC と PR-AUC を比較します(不均衡では PR のほうが厳しく評価できる点は 不均衡データの扱い と対で確認できます)。

しきい値掃引で ROC/PR 曲線と AUC

関連ノート