Area Under the Curve (AUC)
AUC 将 ROC 曲线转化为一个 0 到 1 之间的分数:分类器将随机正样本排在随机负样本之前的概率。本文介绍 ROC AUC 与 PR AUC,并提供代码。
曲线下面积(AUC)是一种指标,用于概括二分类器在所有可能决策阈值下区分两个类别的能力。在机器学习中,AUC 几乎总是指受试者工作特征(ROC)曲线下面积,也写作 ROC AUC 或 AUROC。它的数值等于模型给随机选取的正样本打分高于随机选取的负样本的概率。AUC 为 1.0 表示每个正样本的得分都高于每个负样本;0.5 表示排序效果不比随机猜测好;低于 0.5 则表示排序颠倒。由于 AUC 只取决于分数的排序,因此在有人选择阈值之前就能评估模型,这使它成为医学诊断模型、信用评分和欺诈检测中的标准指标。
AUC 的计算方式#
ROC 曲线以真正率(即召回率)为纵轴,以假正率(被错误标记的负样本比例)为横轴;随着决策阈值从最高分逐渐降到最低分,曲线也随之变化。高于所有分数的阈值不会标记任何样本,点位于 (0, 0);低于所有分数的阈值会标记所有样本,点位于 (1, 1)。AUC 是连接所有中间点的曲线下面积,通常用梯形法则计算。
通过统计样本对,也能得到相同的数值。将每个正样本与每个负样本进行比较:如果正样本排名更高,则该对计 1 分;并列计 0.5 分;否则计 0 分。所得分数正好等于 ROC AUC;统计学家称之为归一化的 Mann-Whitney U 统计量,医学研究人员则称之为一致性统计量或 c 统计量。信用风险团队常报告基尼系数,其计算方式为 2 × AUC − 1。
成对比较的视角有助于理解 AUC 的主要特性。任何保留分数顺序的变换(例如对概率进行平方,或对二分类器的 logits 应用温度缩放)都不会改变 AUC,因此模型即使 AUC 极佳,概率校准也可能很差。校准需要使用布里尔分数等单独指标评估。
不平衡数据上的 ROC AUC 与 PR AUC#
ROC AUC 不受类别比例影响,因为真正率只根据正样本计算,假正率只根据负样本计算。当正样本罕见时,这一特性会成为缺点。假设 100 个样本中只有 1 个正样本,那么 5% 的假正率意味着每个真实正样本对应约五个误报,但 ROC 曲线几乎不会因此受到影响。精确率-召回率曲线(PR 曲线)下面积,即通常用平均精确率(AP)概括的 PR AUC,以精确率为纵轴、召回率为横轴,能直接体现这些误报,因此在类别不平衡的数据上,它比 ROC 曲线更有信息量。下面的 scikit-learn 脚本会用两种方式评估同一个模型:
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import average_precision_score, roc_auc_score
from sklearn.model_selection import train_test_split
# Imbalanced binary problem: 1 positive per 100 samples
X, y = make_classification(n_samples=20_000, weights=[0.99], flip_y=0, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, stratify=y, random_state=0)
# Score the test set with a simple classifier
model = LogisticRegression(max_iter=1000).fit(X_train, y_train)
scores = model.predict_proba(X_test)[:, 1]
# The same scores summarized by the areas under two different curves
print(f"Positives in test set: {y_test.sum()} of {len(y_test)}")
print(f"ROC AUC: {roc_auc_score(y_test, scores):.3f}")
print(f"PR AUC (average precision): {average_precision_score(y_test, scores):.3f}")在 10,000 个测试样本中有 100 个正样本时,该模型的 ROC AUC 达到 0.911,但平均精确率只有 0.462。这两个数值的基准值也不同:无论类别平衡情况如何,随机排序的 ROC AUC 都是 0.5;而其平均精确率等于正样本比例,在此例中为 0.01。
多分类 AUC 与目标检测#
ROC AUC 是针对二分类定义的。对于更多类别,scikit-learn 的 roc_auc_score会计算一对多 AUC 的平均值(将每个类别与其他所有类别进行比较),或计算所有类别对的一对一 AUC,并采用宏平均或按类别比例加权的平均方式。
目标检测无法使用 ROC 曲线,因为负样本是所有不包含目标的边界框位置,其集合实际上没有界限,也无法定义有意义的假正率。检测指标改用精确率-召回率曲线下面积。Ultralytics 中的 YOLO26验证会计算每个类别的平均精确率,即其精确率-召回率包络线下面积;与 COCO评估方式相同,它会在 101 个召回率点上采样,并将这些面积取平均,得到平均精度均值(mAP),计算时使用从 0.50 到 0.95 的 IoU阈值。
AUC 与相关术语#
- 准确率:衡量单个阈值下的正确预测比例;在类别不平衡的数据上,即使漏掉所有正样本,准确率看起来也可能很高。AUC 衡量所有阈值下的排序表现。
- F1 分数:在单个阈值下综合精确率和召回率,因此衡量的是一个工作点;AUC 则概括所有工作点的表现。
- 混淆矩阵:统计单个阈值下的真正例、假正例、真负例和假负例。每个 ROC 点都会用一对比率概括一个混淆矩阵。
- 平均精确率:精确率-召回率曲线下面积;正样本罕见时通常用它来概括表现,也是 mAP 的主要组成部分。
- 部分 AUC:限定假正率范围(例如 0 到 0.1)内的曲线下面积;当只允许较低误报率时会使用这一指标,例如在大规模筛查项目中,每次误报都会触发后续检查。










