Receiver Operating Characteristic (ROC) Curve
受信者動作特性(ROC)曲線は、すべての閾値における真陽性率と偽陽性率をプロットしたものです。読み方、AUC、コードを解説します。
受信者動作特性(ROC)曲線は、2クラス分類器があらゆる判定しきい値で2つのクラスをどれほど適切に分離できるかを示すグラフです。縦軸に真陽性率、横軸に偽陽性率を取り、モデルのスコアに適用するしきい値ごとに1つの点を描くため、陽性の検出と誤警報の発生とのトレードオフを1つの図で示せます。その面積である曲線下面積(AUC)は、この図をしきい値に依存しない1つの数値に集約します。この名称は第二次世界大戦中のレーダー工学に由来し、レーダーの受信担当者が敵機をノイズからどれほど識別できるかを測るために使われていました。その後、この手法は医学、心理学、機械学習(ML)にも広まりました。
ROC曲線の作成方法#
曲線上の各点は、ある1つのしきい値で計算した混同行列から得られます。
- 真陽性率(TPR)。再現率または感度とも呼びます: TP / (TP + FN)。実際に陽性であるサンプルのうち、モデルが陽性と判定した割合です。
- 偽陽性率(FPR): FP / (FP + TN)。実際に陰性であるサンプルのうち、誤って陽性と判定された割合です。FPRは1から特異度を引いた値です。
しきい値を高い値から低い値へ動かすと、何も陽性と判定しない点(0, 0)から、すべてを陽性と判定する点(1, 1)まで曲線が描かれます。すべての陽性をすべての陰性より上位に順位付けする分類器は左上隅を通り、ランダムに推測するモデルは対角線に沿います。対角線より下の曲線は、スコアが逆転していることを示します。AUCは、無作為に選んだ陽性サンプルが、無作為に選んだ陰性サンプルより高いスコアを得る確率に等しいため、0.5は偶然と同等、1.0は完全な分離を意味します。曲線の作成には、予測確率や信頼度などの連続スコアが必要です。0/1の二値ラベルでは1つの点しか得られません。次の例では、不均衡データセットでロジスティック回帰分類器を学習し、scikit-learnのroc_curveを使って曲線を計算します。
import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.model_selection import train_test_split
# Binary task where 10% of samples are positive
X, y = make_classification(n_samples=5000, weights=[0.9], class_sep=0.8, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
# ROC analysis needs continuous scores, not hard 0/1 predictions
scores = LogisticRegression().fit(X_train, y_train).predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, scores)
print(f"AUC: {roc_auc_score(y_test, scores):.3f}")
# Each threshold is one point on the curve: higher recall costs more false alarms
for target in (0.80, 0.95):
i = np.argmax(tpr >= target) # first point that reaches the target TPR
print(f"Threshold {thresholds[i]:.2f}: TPR {tpr[i]:.2f}, FPR {fpr[i]:.2f}")モデルのAUCは0.963です。しきい値0.44では陽性の82%をFPR 0.01で検出しますが、再現率95%を達成するにはしきい値を0.02に下げる必要があり、その場合FPRは0.26に上昇します。陽性130件、陰性1,120件のこのテストデータ分割では、陽性をさらに18件検出するために、誤警報が279件増えます。
運用点の選択#
曲線は各しきい値に伴うコストを示し、どのコストを許容するかはアプリケーションによって決まります。
- 医学的スクリーニング:腫瘍の見落としは追加検査よりはるかに重大なため、スクリーニングツールではTPRの高い点で運用し、放射線科医が確認する偽陽性の増加を許容します。
- 不正検出:正当な支払いがブロックされるたびに顧客の不満につながるため、銀行は不正の大半を検出しつつ、審査チームと顧客が許容できる水準にFPRを抑える点を選びます。
- コストが同じ場合:両方の誤りのコストが同じなら、YoudenのJ統計量(TPRからFPRを引いた値)によって、対角線から最も離れた点を選びます。
Ultralytics YOLO26の分類モデルは、ROC分析に必要な連続スコアとして、results[0].probs.data内で各クラスの確率を返します。そのため、ラベル付き検証データセットから1つのクラスの確率を集めれば、そのクラスの1対他のROC曲線を作成し、デプロイ時のコストに合わせたしきい値を選択できます。
ROC曲線と関連ツールの比較#
適合率-再現率曲線では、TPRとFPRではなく適合率と再現率をプロットします。TPRとFPRはそれぞれクラス内で計算されるため、陽性の割合が下がってもROC曲線は変わりませんが、適合率は低下します。不正検査や異常検知のように陽性がまれな場合、FPRが低くても真の検出より誤警報の方が多くなる可能性があります。不均衡データセットに関するPLOS ONEの研究では、そのような状況では適合率-再現率プロットの方が情報量が多いことが示されました。物体検出が適合率-再現率曲線と平均適合率(mAP)で評価されるのも、関連する理由によります。真陰性に数えられる背景領域に上限がないため、FPRの分母が一定にならないからです。










