文章目录
ROC (Receiver Operating Characteristic),受试者工作特征曲线;它源于“二战”中用于敌机检测的雷达信号分析技术,上世纪 60-70 年代开始被用于一些心理学、医学检测应用中,此后被引入机器学习领域。
1. ROC曲线的设计思路
ROC最初用于二分类任务,现在也可以推广到多分类任务中。在二分类任务中,模型的输出并非简单的 0/1,而是一个 [ 0 , 1 ] [0,1] [0,1]之间的预测值。然后预测值与一个分类阈值 (threshold) 进行比较:若大于阈值则分为正类,否则为反类。最常见的操作 t h r e s h o l d = 0.5 threshold=0.5 threshold=0.5
该阈值和概率预测结果直接决定了学习器的泛化能力。根据阈值和概率预测结果,我们可将测试样本进行排序:可能是正例的排在前面,不可能是正例的排在后面。这样,分类过程就相当于在这个排序中以某个“截断点”将样本分为两部分;前一部分判作正例,后一部分则判作反例。
在不同的应用任务中,我们可根据任务需求来采用不同的截断点。如果我们更重视“查准率”,则可选择排序中靠前的位置进行截断;如果更重视“查全率”,则可选择靠后的位置进行截断。 因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”。ROC 曲线就是从这个角度出发来研究学习器泛化性能的有力工具。
本节参考:周志华《机器学习 - 西瓜书》 2.3.3 节
2. 真正例率 TPR 和假正例率 FPR
对于二分类问题可将样例根据其真实类别与学习器预测类别的组合划分为真正例 (true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情形,令TP、FP、TN、FN 分别表示其对应的样例数,则显然有 TP+FP+TN +FN 样例总数。分类结果的混淆矩阵如下:

根据混淆矩阵我们可以得到 “真正例率”(True Positive Rate, TPR)和 “假正例率”(False PositiveRate, FPR):
- 真正例率 TPR:将正例预测为正例(真正例)的数量 占 所有真实情况为正例 的比例
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP - 假正例率 FPR:将反例预测为正例(假反例)的数量 占 所有真实情况为反例 的比例
F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP
3. ROC 曲线
ROC 曲线的横轴是假正例率 FPR,纵轴是真正例率 TPR
事实上,机器学习模型的一个特点是:在模型性能固定的前提下,如果模型将更多的正例预测为正例,那么也必然会将更多的反例预测为正例。即 TPR 越大,则 FPR 也会越大。 这就像邓小平同志在指导改革开放工作中说的那样,“改革开放以后,好的东西会进来,苍蝇蚊子也会进来。”
一般的ROC曲线如下:

3.1 ROC 曲线怎么画
ROC 曲线的作图步骤:
- (1)给定 m + m^+ m+ 个正例和 m − m^- m− 个反例,通过分类器得到每个样本的预测概率,对其从高到低进行排序
- (2)将分类阈值设为最大,即把所有样例均预测为反例。此时真正例率和假正例率均为0,则 ROC 曲线的起点为 ( 0 , 0 ) (0,0) (0,0)
- (3)将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。通过该阈值计算 ( F P R , T P R ) (FPR,TPR) (FPR,TPR)坐标,并使用线段连接这些坐标。
- (4)将分类阈值设为最小,即把所有样例均预测为正例。此时真正例率和假正例率均为1,则 ROC 曲线的终点为 ( 1 , 1 ) (1,1) (1,1)
根据 ROC 曲线的作图步骤,我们可以理解其物理意义和 AUC 的计算方法,后面会讲。
3.2 如何根据 ROC 曲线选择模型
在实际情况中,不同模型的 ROC 曲线会相交,此时将难以比较不同模型的性能优劣。此时需要采用一些指标来进行评估:
- FPR 为 0 时的点:在人脸识别任务中,将反例(数据库中不存在的人脸)预测为正例(数据库中存在的人脸)是很危险的,因此往往要选择 F P R = 0 FPR=0 FPR=0 时,TPR 更大 ROC 曲线对应的模型。具体分析可以参考视频 roc曲线详解
- 等错误率(Equal Error Rate, EER)表示 F P R = T P R FPR=TPR FPR=TPR 时的错误率,即点 ( 0 , 1 ) (0,1) (0,1)和 ( 1 , 0 ) (1,0) (1,0) 的连线与 ROC 曲线交点。如下图中 A 和 B 均为等错误率点,模型 A 的性能更好。

- AUC(Area Under Curve):ROC曲线坐标轴围成的面积。AUC 越大,说明模型性能越好。
在这些指标中,AUC是最常用的。但具体用什么指标来评估模型性能,需要根据具体任务来确定。
4. AUC 的计算方法
进行学习器的比较时,与 P-R 图相似,若一个学习器的 ROC 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者; 若两个学习器的 ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣此时如果一定要进行比较,则较为合理的判据是比较 ROC 曲线下的面积即 AUC (Area Under ROC Curve)
4.1 通过曲线积分的定义计算
从定义可知,AUC 可通过对 ROC 曲线下各部分的面积求和而得。假定ROC 曲线是由坐标为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} {(x1,y1),(x2,y2),...,(xm,ym)}的点按序连接而形成 ( x 1 = 0 , x m = 1 ) (x_1=0,x_m=1) (x1=0,xm=1),则 AUC 的计算方法为
A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ( y i + y i + 1 ) (1) AUC=\frac{1}{2} \sum^{m-1}_{i=1}(x_{i+1}-x_{i})(y_{i}+y_{i+1}) \tag{1} AUC=21i=1∑m−1(xi+1−xi)(yi+yi+1)(1)
式 (1) 其实就是 m − 1 m-1 m−1 个直角梯形的面积之和。尽管这种方法简单易懂,但它并不能表达 AUC 的物理意义,并且这种方法的计算量很大,因为我们要更改 m m m 次分类阈值并计算 FPR 和 TPR 才能得到坐标点 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{ (x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} {(x1,y1),(x2,y2),...,(xm,ym)}。因此往往不使用这种方法计算。
4.2 通过 AUC 的物理意义计算
4.2.1 AUC 的物理意义
AUC 的物理意义是:
随机采样一对样本(一个正样本,一个负样本),模型将正样本预测为正例的概率大于将负样本预测为正例的概率。
比如 A U C = 0.8 AUC=0.8 AUC=0.8 的含义为:随机采样一个正样本和一个负样本,在80%的情况下,模型将正样本预测为正例的概率大于将负样本预测为正例的概率。可以看到 AUC 关心的是正负样本之间的分数高低,而具体的分值则无关紧要。
可以把AUC理解为区分正类和负类的能力,当AUC越大,表示区分正负类的能力越强。当模型对正负样本没有区分能力时,模型会将一个样本随机预测为正类或负类,此时 A U C = 0.5 AUC=0.5 AUC=0.5,因此 AUC 的有效范围是 ( 0.5 , 1 ] (0.5,1] (0.5,1]。 A U C = 1 AUC=1 AUC=1 是一种理想情况,实际中由于样本数据的复杂性,几乎不可能实现。
4.2.2 AUC 的计算公式
根据 AUC 的物理意义可以推导出其计算公式:
A U C = ∑ ( p i , n j ) p i > n j P ∗ N (2) AUC=\frac{\sum(p_i,n_j)_{p_i>n_j}}{P*N} \tag{2} AUC=P∗N∑(pi,nj)pi>nj(2)
其中 P P P 为正样本数量, N N N 为负样本数量。 p i p_i pi为正样本预测得分,即将正样本预测为正例的概率; n j n_j nj为负样本预测得分,即将负样本预测为正例的概率。
用指示函数表示上式中正样本预测值 p p o s p_{pos} ppos 大于负样本预测值 p n e g p_{neg} pneg 的正负样本对,则得到
A U C = ∑ I ( p p o s , p n e g ) P ∗ N (3) AUC=\frac{\sum I(p_{pos},p_{neg})}{P*N} \tag{3} AUC=P∗N∑I(ppos,pneg)(3)
其中
I ( p p o s , p n e g ) = { 1 p p o s > p n e g 0.5 p p o s = p n e g 0 p p o s < p n e g (4) I(p_{pos},p_{neg})= \begin{cases} 1& p_{pos}>p_{neg}\\ 0.5& p_{pos}=p_{neg}\\ 0& p_{pos}<p_{neg} \end{cases} \tag{4} I(ppos,pneg)=⎩ ⎨ ⎧10.50ppos>pnegppos=pnegppos<pneg(4)
根据公式(4),AUC的计算的关键则是得到所有正负样本对,以及得到每个正负样本对的指示函数值。这是一个简单的排列组合问题。
4.2.3 实例讲解
下面以一个例子进行计算说明:
样本编号 | 真实类别 | 预测值 |
---|---|---|
A | 1 | 0.9 |
B | 0 | 0.4 |
C | 0 | 0.3 |
D | 0 | 0.1 |
E | 1 | 0.3 |
F | 0 | 0.6 |
在上述例子中,有 2 个正样本 (A, E) 和 4 个负样本 (B,C, D, F),因此一共有 2*4=8 个正负样本对,即公式 (3) 中分母为 8。
接下来计算公式中的分子,即每个正负样本对的指示函数值:
- 以 A 为正样本形成的正负样本对为 (A, B),(A, C),(A, D),(A, F),指示函数值分别为 1,1,1,1
- 以 E 为正样本形成的正负样本对为 (E, B),(E, C),(E, D),(E, F),指示函数值分别为 0,0.5 ,1,0
所以 A U C = ∑ I ( p p o s , p n e g ) P ∗ N = 1 + 1 + 1 + 1 + 0 + 0.5 + 1 + 0 2 ∗ 4 = 0.6875 AUC=\frac{\sum I(p_{pos},p_{neg})}{P*N}=\frac{1+1+1+1+0+0.5+1+0}{2*4}=0.6875 AUC=P∗N∑I(ppos,pneg)=2∗41+1+1+1+0+0.5+1+0=0.6875
由于计算所有正负样本对的指示函数值需要两层 for 循环,所以时间复杂度为 O ( P ∗ N ) O(P*N) O(P∗N)
4.2.3 Python 代码实现
code:
import numpy as np
from sklearn.metrics import roc_auc_score
# 使用 sklearn 计算 auc
def get_auc_func1(label, pred):
return roc_auc_score(label, pred)
# 使用物理意义计算 AUC
def get_auc_func2(label, pred):
# 查找正负样本索引
pos_sample_ids = [i for i in range(len(label)) if label[i] == 1]
neg_sample_ids = [i for i in range(len(label)) if label[i] == 0]
# 计算指示函数值
sum_indicator_value = 0
for i in pos_sample_ids:
for j in neg_sample_ids:
if pred[i] > pred[j]:
sum_indicator_value += 1
elif pred[i] == pred[j]:
sum_indicator_value += 0.5
auc = sum_indicator_value / (len(pos_sample_ids) * len(neg_sample_ids))
return auc
if __name__ == '__main__':
label = np.array([1, 0, 0, 0, 1, 0])
pred = np.array([0.9, 0.4, 0.3, 0.1, 0.3, 0.6])
print(f"auc = {get_auc_func1(label, pred):6f}") # auc = 0.687500
print(f"auc = {get_auc_func2(label, pred):6f}") # auc = 0.687500
使用物理意义计算的 AUC 与 sklearn 库的计算值相同。
本节参考 如何计算AUC
5. AUC 指标的优缺点
5.1 单独使用一个指标的缺点
在评估模型时,若使用准确率、精确率、召回率、TPR、FPR等单个指标,有一些明显的缺点:容易使模型虽然在评估指标上表现很好,但实际效果不佳。
单独使用准确率作为评估指标,样本分布对模型影响大。例如,当样本分布极度不均衡时,如负样本占99%,正样本占1%,若模型将全部样本预测为负样本,准确率可以达到99%,但此时模型对正负样本没有区分能力,对正样本的预测能力几乎为0。一种缓解方法是,根据正负样本分布,对正负样本的准确率进行加权求和。
单独使用精确率作为评估指标,模型将提高预测为正类的门槛,使得预测为正类的置信度非常高,同时导致把实际为正类的样本预测为负类的数量增多,也就是FN增多,因此模型只能识别非常明显的正类,此时模型对弱正类和负类的区分能力很差。
单独使用召回率或者真阳性率作为评估指标,容易导致模型将样本都预测为正类。当模型对所有样本均预测为正类时,FN=0,召回率/TPR为1,即所有正样本都被找到了,但代价是被预测为正类的样本中有大量真实负类(FP),此时模型对负样本的预测能力几乎为0。
单独使用假阳性率作为评估指标,效果和单独使用真阳性率类似,当模型将样本全部预测为正类,此时TN=0,FPR=1,模型对负样本的预测能力几乎为0。
精确率和召回率之间存在一定的“此消彼长”。当精确率越高,通常预测为正类的门槛越高,则越多的正类容易被预测为负类,导致召回率低。当召回率高,通常预测为正类的门槛低,导致预测为正类的样本里真实为负类的数量增多,使得精确率低。当一个模型能同时做到精确率和召回率都高的时候,说明模型的分类能力比较好。
TPR和FPR之间存在正相关性。从混淆矩阵和TPR以及FPR的定义可以看出,当TPR越高,说明FN越少,说明预测为正类的越多,则TP和FP越多,而样本总量不变,因此FPR越多。极端情况下,当没有样本被预测为正类,则TPR和FPR均为0,当所有样本均被预测为正类,TPR和FPR均为1。
更多介绍可以参考 什么是好的推荐,重新理解AUC
5.2 AUC 的优点
单个指标对模型评估存在多种问题,从而无法真实地评估模型的性能,因此通常综合考虑多个指标。比如F值,综合考虑精确率和召回率;比如AUC,综合考虑TPR和FPR。
准确率、精确率、召回率、F1值等对阈值的选取依赖大,不同的阈值会带来不同的结果。而从 AUC的定义 (ROC 的生成) 知道,AUC 是根据所有分类阈值得到的,不依赖于分类阈值的选取。AUC体现的是对样本的排序能力,与具体的分值无关。因此 AUC 和推荐系统中的大多数业务场景更贴合,因为大多数业务场景关心 item 之间的相对序而不关心 item 的预测分。
AUC对正负样本比例不敏感,也是它在业界被广泛使用的原因。
根据 AUC 的物理意义可知,它是对正负样本随机采样计算得到的,因此 AUC 对正负样本分布不敏感。因为当正或负样本随机采样时,分子和分母发生等比例的缩放,其值不变。当采样时不随机的,则分子分母的变化将不一定等比例,此时 AUC 的值可能受影响。
AUC 的优点:
- AUC 对样本分布不敏感,在正负样本不平衡的情况下,依然能够对分类器做出合理的评价。
- AUC 不需要手动设定阈值,能够直接从整体上(离线排序)方面衡量算法的表现。
5.3 AUC 的缺点
AUC 的缺点有:
(1)AUC 是全局性指标,对于某个用户的 AUC 值不准确。
AUC 是在线下计算对所有用户样本的的排序能力,但在真实的线上场景中,推荐发是针对某个用户,因此全局的AUC对某个用户而言并不准确。这可能会导致线下训练 AUC 高,线上AUC低。主要来源于两个方面:
- 线上会出现新样本,在线下没有见过。这部分更多是采用online learning的方式去缓解,AUC本身可改进的不多。
- 线下计算全集样本的 AUC 不适用于单独的用户,比如把 user1 点击的正样本排序高于 user2 未点击的负样本是没有实际意义的,但线下 auc 计算的时候随机采样了这种情况。一种改进方法是使用更细粒度的 AUC,如 UAUC 和 GUAC。
UAUC,即针对每个 user 的 AUC,仅使用该用户的正负样本计算AUC。但在某些场景以 user 为维度计算AUC会带来一些问题,比如用户消费深度浅,每个用户的正负样本数量有限,导致计算出的UAUC置信度低。
此时可以使用GAUC,即对用户按照一些标准/标签/特征进行 group 划分,对每个 group计算 AUC
(2)AUC 会忽略模型对正负样本的拟合能力
AUC 可以衡量正负样本的区分能力,但难以根据 AUC 确定模型对正负样本的拟合能力。例如当模型对正样本预测概率均为0.55,对负样本预测概率均为0.45时,此时 A U C = 1 AUC=1 AUC=1,从 AUC 角度来看是一个完美的模型,但模型对正负样本的拟合能力差。
(3)AUC通常用于二分类问题,对于多类别分类问题,需要进行适当的处理,如将其拆分成多个二分类任务或使用其他适用于多类别的评估指标。
(4)不适用对特定指标有要求的场景
AUC无法反映精确率、召回率等指标,这些指标可能在某些场景非常重要,比如对判断用户是否为新冠阳性这个场景,要求召回率为1,而精确率可以低一些,此时AUC将不适用。
(5)TPR 和 FPR 对 AUC 的贡献等价,类似于上一条,当对正负类的预测准确率有不同要求时AUC将无法满足区别对待 TPR 和 FPR