ROC与AUC

今天电面的时候问到AUC,答得不好,其实是知道的,就是说不出来,然后看西瓜书和网上找资料来整理一下,不能一个坑里掉进去两次,不总结下次碰到不会就是活该,怪不得别人。

很多学习器是为测试样本产生一个实值或者概率预测,然后将这个预测值与一个分类阈值进行比较,如果大于阈值则分为正类,否则分为负类。这个实值或者概率预测结果的好坏,直接决定了学习器的泛化能力。实际上,根据这个实值或者概率预测结果,我们可以将测试样本惊喜排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。这样,分类过程就相当于在排序中以某个“截断点”将样本分为两部分,前一部分判作正例,后一部分判作反例。

在不同的应用任务中,我们可以根据任务需求来采用不同的截断点,例如若更重视“查准率”,则可以选择排序中 靠前的位置进行截断;若更注重“查全率”,则可选择靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况”下的泛化能力的好坏。ROC曲线则是从这个角度出发来研究学习器泛化性能的有利工具。顺便说下查全率查准率是什么。对于二分类问题,可将样例根据真实类别与学习器预测类别的组合划分为真正例(true positive),假正例(false positive),真反例(true negative),假反例(false negative)四种情况。令TP,FP,TN,FN分别表示其对应的样例数,则显然TP+FP+TN+FN=样例总数。分类结果的“混淆矩阵”如下:

(1)若一个实例是正类并且被预测为正类,即为真正类(True Postive TP)

(2)若一个实例是正类,但是被预测成为负类,即为假负类(False Negative FN)

(3)若一个实例是负类,但是被预测成为正类,即为假正类(False Postive FP)

(4)若一个实例是负类,但是被预测成为负类,即为真负类(True Negative TN)


真实情况 预测结果  
  正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

查准率P和查全率R分别定义如下:P=TP/(TP+FP),R=TP/(TP+FN),他俩是矛盾的度量,一般来说,查准率高时,查全率往往会偏低;而查全率高时,查准率往往偏低。

由上表可得出横,纵轴的计算公式:

(1)真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity

(2)负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity

(3)真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity

假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

如下面这幅图,(a)图中实线为ROC曲线,线上每个点对应一个阈值。

 ROC与AUC

横轴FPR:1-TNR,1-Specificity,FPR越大,预测正类中实际负类越多。

纵轴TPR:Sensitivity(正类覆盖率),TPR越大,预测正类中实际正类越多。

理想目标:TPR=1,FPR=0,即图中(0,1)点,故ROC曲线越靠拢(0,1)点,越偏离45度对角线越好,Sensitivity、Specificity越大效果越好。

AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。

首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

既然已经这么多标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。下图是ROC曲线和Presision-Recall曲线的对比:

ROC与AUC 

在上图中,(a)和(c)为Roc曲线,(b)和(d)为Precision-Recall曲线。

(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,(c)(d)是将测试集中负样本的数量增加到原来的10倍后,分类器的结果,可以明显的看出,ROC曲线基本保持原貌,而Precision-Recall曲线变化较大。

AUC能拿来干什么

从作者有限的经历来说,AUC最大的应用应该就是点击率预估(CTR)的离线评估。CTR的离线评估在公司的技术流程中占有很重要的地位,一般来说,ABTest和转全观察的资源成本比较大,所以,一个合适的离线评价可以节省很多时间、人力、资源成本。那么,为什么AUC可以用来评价CTR呢?我们首先要清楚两个事情:

  1. CTR是把分类器输出的概率当做是点击率的预估值,如业界常用的LR模型,利用sigmoid函数将特征输入与概率输出联系起来,这个输出的概率就是点击率的预估值。内容的召回往往是根据CTR的排序而决定的。
  2. AUC量化了ROC曲线表达的分类能力。这种分类能力是与概率、阈值紧密相关的,分类能力越好(AUC越大),那么输出概率越合理,排序的结果越合理。

我们不仅希望分类器给出是否点击的分类信息,更需要分类器给出准确的概率值,作为排序的依据。所以,这里的AUC就直观地反映了CTR的准确性(也就是CTR的排序能力)

AUC如何求解

步骤如下:

  1. 得到结果数据,数据结构为:(输出概率,标签真值)
  2. 对结果数据按输出概率进行分组,得到(输出概率,该输出概率下真实正样本数,该输出概率下真实负样本数)。这样做的好处是方便后面的分组统计、阈值划分统计等
  3. 对结果数据按输出概率进行从大到小排序
  4. 从大到小,把每一个输出概率作为分类阈值,统计该分类阈值下的TPR和FPR
  5. 微元法计算ROC曲线面积、绘制ROC曲线
  1. ROC曲线反映了分类器的分类能力,结合考虑了分类器输出概率的准确性
  2. AUC量化了ROC曲线的分类能力,越大分类效果越好,输出概率越合理
  3. AUC常用作CTR的离线评价,AUC越大,CTR的排序能力越强

参考周志华老师的西瓜书和http://blog.csdn.net/zdy0_2004/article/details/44948511和https://segmentfault.com/a/1190000010410634