二值分类器(Binary Classifier)是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多,比如precision、recall、F1 score、P-R曲线等。但这些指标或多或少只能反映模型在某一方面的性能。相比而言,ROC曲线则有很多优点,经常作为评估二值分类器最重要的指标之一。

ROC曲线

ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为“受试者工作特征曲线”。

ROC曲线的横坐标为假阳性率(False Positive Rate,FPR);纵坐标为真阳性率(True Positive Rate,TPR)。FPR和TPR的计算方法分别为:

$$FPR = \frac{FP}{N}$$

$$TPR = \frac{TP}{P}$$

在上式中, $P$是真实的正样本数量,$N$是真实的负样本数量,$TP$是$P$个正样本中被分类器预测为正样本的个数,$FP$是$N$个负样本中被分类器预测为正样本的个数。

举一个看病的例子。假设有10个疑似癌症患者,其中三位确实得了癌症($P=3$),另外7人不是癌症患者($N=7$)。医院对这10人做了诊断,诊断出3位癌症患者,其中有2人是真实的癌症患者($TP=2$)。那么真阳性率$TPR=\frac{TP}{P}=\frac{2}{3}$。对于7位非癌症患者来说,有1位被医院误诊为癌症患者($FP=1$),那么假阳性率$FPR=\frac{FP}{N}=\frac{1}{7}$。对于“医院”这个分类器来说,这组结果就对应ROC曲线上的一个点($\frac{1}{7},\frac{2}{3}$)。

绘制ROC曲线

事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点。

在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,下表为模型输出的结果。

样本按照预测概率从高到低排序。在输出最终的正例、负例之前,我们需要制定一个阈值,预测概率大于该阈值的样本会被判为正例,小于该阈值的样本则会判为负例。比如,指定阈值为0.9,那么只有第一个样本会被预测为正例,其他全部都是负例。之前说的截断点指的就是区分正负预测结果的阈值。

通过动态调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分,每一个截断点都会对应一个$FPR$和$TPR$,在ROC图上绘制出每个截断点对应的位置,再连接所有点就得到最终的ROC曲线。

在本例中,当截断点选择为正无穷时,模型把全部样本预测为负例,那么$FP$和$TP$必然都是0,$FPR$和$TPR$也都为0,因此曲线的第一个坐标点就是(0,0)。当吧截断点调整为0.9时,模型预测1号样本为正样本,并且该样本确实是正样本,因此,$TP=1$,20个样本中,所有正例数量为$P=10$,故$TPR=\frac{TP}{P}=\frac{1}{10}$;这里没有预测错的正样本,即$FP=0$,负样本总数$N=10$,故$FPR=\frac{FP}{N}=\frac{0}{10}=0$,对应ROC曲线上的点(0,0.1)。依次调整截断点,直到画出全部的关键点,再连接关键点即得到最终的ROC曲线。

还有一种更直观地绘制ROC曲线的方法。首先,根据样本标签统计出正负样本的数量,假设正样本数量为$P$,负样本数量为$N$;接下来,把横轴的刻度间隔设置为$\frac{1}{N}$,纵轴的刻度间隔设置为$\frac{1}{P}$;再根据模型输出的预测概率对样本进行排序(从高到低);依次遍历样本,同时从零点开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制出一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制出一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个点,整个ROC曲线绘制完成。

计算AUC

AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。计算AUC值值需要沿着ROC横轴做积分就可以了。由于ROC曲线一般都处于$y=x$这条直线的上方(若不是的话,只需要把模型预测的概率翻转成$1-p$就可以得到一个更好的分类器),所以AUC的取值一般在0.5 ~ 1之间。AUC越大,说明分类器越可能把真正的样本排在前面,分类性能越好。

ROC曲线与P-R曲线相比的特点

相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般都会发生较剧烈的变化。

这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。实际意义在于,很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的$\frac{1}{1000}$甚至$\frac{1}{10000}$。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。但需要注意,选择P-R曲线还是ROC曲线是因实际问题而异的,如果希望更多地看到模型在特定数据集上的表现,P-R曲线则能更直观地反映其性能。