Receiver Operating Characteristic (ROC) Curve
受试者工作特征 (ROC) 曲线会绘制每个阈值对应的真阳性率和假阳性率。了解如何解读 ROC 曲线、AUC 和相关代码。
受试者工作特征(ROC)曲线是一种图表,展示二分类器在所有可能的决策阈值下区分两个类别的能力。它以真阳性率为纵轴、假阳性率为横轴绘图;模型分数使用的每个阈值对应一个点,因此一张图就涵盖了捕获阳性与产生误报之间的所有权衡。曲线下的面积,即曲线下面积(AUC),将整张图概括为一个与阈值无关的数值。这个名称源自第二次世界大战期间的雷达工程,当时它用于衡量雷达接收员区分敌机与噪声的能力;后来,这种方法扩展到了医学、心理学和机器学习(ML)。
ROC 曲线的绘制方法#
曲线上的每个点都来自在某个阈值下计算的混淆矩阵:
- 真阳性率(TPR),也称召回率或灵敏度:TP / (TP + FN),即模型标记出的实际阳性所占比例。
- 假阳性率(FPR):FP / (FP + TN),即被错误标记的实际阴性所占比例。FPR 等于 1 减去特异度。
将阈值从高到低移动,曲线会从 (0, 0)(没有任何样本被标记)延伸到 (1, 1)(所有样本都被标记)。如果分类器给所有阳性的排名都高于所有阴性,它会经过左上角;随机猜测的模型会沿对角线变化;如果曲线位于对角线下方,则表示分数的方向反了。AUC 等于随机选取的阳性样本得分高于随机选取的阴性样本的概率,因此 0.5 表示随机猜测,1.0 表示完美区分。绘制曲线需要使用连续分数,例如预测概率或置信度值,因为硬性的 0/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 分类模型会通过 results[0].probs.data返回每个类别的概率,这是 ROC 分析所需的连续分数;因此,在带标签的验证集上收集某个类别的概率,就能得到该类别的一对其余类别 ROC 曲线,并根据部署环境的代价选择阈值。
ROC 曲线与相关工具的比较#
精确率-召回率曲线绘制的是精确率与召回率的关系,而非 TPR 与 FPR 的关系。由于 TPR 和 FPR 都在单个类别内计算,阳性样本变得更稀少时,ROC 曲线仍保持不变,但精确率会下降。在欺诈筛查或异常检测等阳性样本稀少的场景中,即便 FPR 很低,误报数量仍可能超过真正检出的数量;一项关于不平衡数据集的 PLOS ONE 研究发现,在这种情况下,精确率-召回率图更有参考价值。目标检测使用精确率-召回率曲线和平均精度均值(mAP)进行评估,原因类似:可计为真阴性的背景区域没有上限,因此 FPR 没有固定的分母。










