4.3.2
Precision-Recall
まとめ
- Precision-Recall 曲線は陽性予測の精度と再現率のトレードオフを可視化する手法です。
- 確率スコアから PR 曲線と Average Precision を算出し、しきい値調整の効果を確認します。
- アラート数の制約や少数クラス対策での活用ポイントを整理します。
- 混同行列 の概念を先に学ぶと理解がスムーズです
1. 定義と直感 #
混同行列の記号を \(TP\)(真陽性)、\(FP\)(偽陽性)、\(FN\)(偽陰性)、\(TN\)(真陰性)とすると、
$$ \text{Precision} = \frac{TP}{TP + FP}, \qquad \text{Recall} = \frac{TP}{TP + FN} $$- 適合率 … 陽性と判定したうち、本当に陽性だった割合。誤報(FP)を抑えたいときに重視。
- 再現率 … 実際の陽性のうち、正しく検出できた割合。見逃し(FN)が問題になるときに重視。
- F1 スコア … 適合率と再現率の調和平均。双方を同程度に重視したいときのまとめ指標。
2. Python 3.13 での実装と PR 曲線 #
環境を確認し、必要なパッケージを導入します。
| |
次のコードでは少数クラスが 5 % のデータセットを生成し、class_weight=“balanced” 付きロジスティック回帰で PR 曲線と平均適合率(AP)を描画します。図は static/images/eval/classification/precision-recall/pr_curve.png に保存してあり、generate_eval_assets.py から再生成できます。
| |

平均適合率(AP)は PR 曲線下の面積。閾値の移動で適合率と再現率のバランスが変わる。
3. 閾値調整の考え方 #
- 閾値 0.5 固定では、再現率を高くしたいケースに十分対応できないことがある。
- PR 曲線上の任意の点に相当する閾値は precision_recall_curve の hresholds から取得可能。
- False Negative を減らしたい場合は閾値を下げて再現率を稼ぎ、Precision の低下を許容範囲内に収める。
| |
4. 多クラス分類での平均化 #
scikit-learn では verage パラメータで重み付けを切り替えられます。
- macro … クラスごとの Precision / Recall の単純平均。クラス数が少なくても比較しやすい。
- weighted … 各クラスにサンプル数の重みを付ける。データ全体のバランスを維持。
- micro … 全サンプルをまとめて再計算。クラス不均衡が強いときは少数クラスが埋もれる点に注意。
| |
5. まとめ #
- Precision は誤警報の少なさ、Recall は見逃しの少なさを測る。両方を高めるには PR 曲線で閾値を確認する。
- F1 や平均適合率(AP)を併用すると指標を 1 つに集約でき、モデル比較や閾値調整の議論がしやすい。
- Python 3.13 では scikit-learn の precision_recall_curve / verage_precision_score を使えば数行で計算・可視化できる。
閾値と適合率・再現率の変化 #
閾値を変えると適合率と再現率がどうトレードオフするか確認できます。
- F1スコア — 適合率と再現率の調和平均
- ROC-AUC — 閾値非依存の性能評価
- 平均適合率 — PR 曲線下面積
- 混同行列 — 各指標の導出元
- Focal Loss — 不均衡データ向けの損失関数