• 理解 ROC 和 AUC


    1. 引言

    ROC(Receiver Operating Characteristic)曲线和AUC(Area Under Curve)常被用来评价一个二值分类器(binary classifier)的优劣。相比准确率、召回率、F-score这样的评价指标,ROC曲线有这样一个很好的特性:当测试集中正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

    论文[3]是篇很不错的文章,介绍了ROC和AUC的特点,如何作出ROC曲线图和计算AUC,AUC的含义,以及对多类别分类问题如何计算AUC。后来有篇博文[4]翻译了这篇文章的核心部分,浅显易懂,适合不喜欢读英文的读者。

    图1摘自论文[3]。ROC曲线,是以一系列的(fp rate, tp rate)或者写成(FPR, TPR),为二维笛卡尔坐标系中的坐标点。应用到实际问题中,对一份训练集如何算出一系列的FPR和TPR,可以参考[3]或[4]。

    AUC(确切的说,应该是AUROC)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。ROC曲线上的任意相邻两点与横轴都能形成梯形,把所有这样的梯形面积做加和即可得到AUC。一般而言,训练样本越多,在得到样本判别为正例的分数取值后不同分数也相对会越多,这样ROC曲线上的点也就越多,估算的AUC会更准些。这种思路很像微积分里常用的微分法。该方法正是在论文[3]中描述的方法,笔者在实际业务中实现了它,它并不难实现。

    2. AUC的物理含义

    那么AUC值的含义是什么呢?在论文[3],有这样一段话:”The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example. This is equivalent to the Wilcoxon test of ranks (Hanley and McNeil, 1982). The AUC is also closely related to the Gini coefficient (Breiman et al., 1984), which is twice the area between the diagonal and the ROC curve. Hand and Till (2001) point out that Gini + 1 = 2 * AUC.”

    简单翻译下:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。另外,AUC与Gini分数有联系,Gini + 1 = 2*AUC。

    关于AUC表示的概率含义在ROC的维基百科词条[5]中也有说明。不过维基百科中还提到这样一个观点,机器学习领域中经常用ROC和AUC去做模型对比,最近学术界认为这种做法会引入一些错判,有些文章对此进行了讨论。笔者认为学术界值得认真讨论此问题,但在工业界,AUC指标一般与业务评价指标(比如点击率等)本身就不是一致的,所以在实际业务中,会综合考虑AUC指标以及其他指标来选择最终模型,这样做能降低选到不良模型的可能性。

    既然了解了AUC表示的概率含义,那么就可以通过概率统计的方法来算AUC。做N次随机试验,每次实验中随机采样一个正样本和一个负样本,当模型预测正样本的分数大于模型预测负样本的分数,计数则加1。记计数最终为n(n肯定小于等于N),那么用n/N即得到AUC。Stackexchange中的一篇帖子[6]在”A concordance measure”一节中也提到了这种算AUC的方法,并通过实验说明此方法计算出的AUC与画出ROC曲线然后算AUC面积是一致的。不过应用这个物理含义来算AUC,除了走先随机采样后计数以得到概率的方案外,还可以用公式1来计算:

    iPri|P|×(|P|+1)2|P|×|N|(1)

    说明: P表示正样本集合,N表示负样本集合,|S|表示集合S的元素个数。ri表示元素i在全集(P+N)中按预测score从小到大排的rank位置(rank位置从1开始,比如:假设|P+N|=10,那么最高分的rank值为10,最低分的rank值为1)。举例子说明上式的计算过程:

    假设|P+N|有5个元素,按系统预测score从小到大排如下:

    样本情况样本1样本2样本3样本4样本5
    正例 or 负例 N P N P P
    系统预测score 0.2 0.3 0.4 0.5 0.6
    rank值ri 1 2 3 4 5

    对该例,|P|=3,|N|=2,分母为6,分子为(2+4+5)(0.5×3×4)=5。那么AUC为5÷6=0.8333

    下面用两节分别证明这个式子与AUC的物理含义是一致,以及该式与第一种方法(基于ROC曲线计算AUROC的方法)是一致的。以此得到三种方法的相互一致。(为了描述直观,先忽略因系统预测score相同导致rank值相同,后面再对此做说明)

    3. 与AUC的物理含义一致的证明

    全集(P+N)中一个正样本与一个负样本组成pair的总数为 |P|×|N| ,也就是式子中的分母。那么接下来只需要证明对于{ri}序列来说,满足正样本的rank值大于负样本rank值的pair总数是分子表达的那个数。这个可以基于加法原理来计算,对每个正样本,统计出它的rank值能大于的负样本个数,做个累加求和即可。对某个iP,它的rank值能大于的负样本个数表示为(公式2和公式3是等价的,不过式子3便于做后面的累加求和):

    4. 与基于ROC曲线计算AUROC的方法一致的证明

    画出ROC曲线(横轴为FPR=FP|N|,纵轴为TPR=TP|P|),算出每个小梯形的面积然后累加求和。对{ri}序列,该方法可以用公式形式化表示如下:

    结合公式5的说明,即证明了公式1与 基于ROC曲线计算AUROC的方法 是一致的。

    说明:当存在预测score相等的情况时,对相等score的样本,需要 赋予相同的rank(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。对这个rank是这样计算的:把所有这些预测score相等的样本的rank取平均,然后再使用上述公式。

    虽然三种方法是等价的,但在计算量上去掉排序的因素(排序的计算复杂度为O(NlogN)),公式1的计算效率要高。

    AUC为什么可以衡量分类的效果?

     

    • AUC就是从所有1样本中随机选取一个样本,从所有0样本中随机选取一个样本,然后根据你的分类器对两个随机样本进行预测,把1样本预测为1的概率为p1,把0样本预测为1的概率为p2,p1>p2的概率就是AUC。所以AUC应该反映的是分类器对样本的排序能力,另外,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常采用AUC评价分类性能的原因

    根据上面的推断,那么随机抽取一个样本,对应每一潜在可能值X都有对应一个判定正样本的概率P。

    对一批已知正负的样本集合进行分类,按照预测概率从高到低进行排序,

    对于正样本中概率最高的,排序为rank_1,

    比它概率小的有M-1个正样本(M为正样本个数),(ranl_1-M)个负样本。

    正样本中概率第二高的,排序为rank_2,

    比它概率小的有M-2个正样本,(rank_2-(M-1))个负样本,

    以此类推,正样本中概率最小的,排序为rank_M,

    比它概率小的有0个正样本,(rank_M-1)个负样本。

    总共有M*N个正负样本对,把所有比较中正样本概率大于负样本概率的例子都算上,

    得到公式: [公式]

    就是正样本概率大于负样本概率的可能性,将上述结果化简之后:

    [公式]

    上述结果就是,AUC公式

     

    AUC是现在分类模型中,特别是二分类模型使用的主要离线评测指标之一,相比于准确率,召回率,AUC有一个独特的优势,就是不管具体的得分,只关注于排序结果,这使得它特别适用于排序问题的效果评估

    根据上面的公式求解AUC

    首先对score从大到小排序,然后令最大score对应的sample的rank值为n,第二大score对应sample的rank值为n-1,以此类推从n到1。然后把所有的正类样本的rank相加,再减去正类样本的score为最小的那M个值的情况。得到的结果就是有多少对正类样本的score值大于负类样本的score值,最后再除以M×N即可。值得注意的是,当存在score相等的时候,对于score相等的样本,需要赋予相同的rank值(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。具体操作就是再把所有这些score相等的样本 的rank取平均。然后再使用上述公式。此公式描述如下:

    def naive_auc(labels,preds):
        """
        最简单粗暴的方法
       先排序,然后统计有多少正负样本对满足:正样本预测值>负样本预测值, 
          再除以总的正负样本对个数。复杂度 O(NlogN), N为样本数
        """
        n_pos = sum(labels)
        n_neg = len(labels) - n_pos
        total_pair = n_pos * n_neg
    
        labels_preds = zip(labels,preds)
        labels_preds = sorted(labels_preds,key=lambda x:x[1])//从小到大,倒序计算
        accumulated_neg = 0
        satisfied_pair = 0
        for i in range(len(labels_preds)):
            if labels_preds[i][0] == 1:
                satisfied_pair += accumulated_neg
            else:
                accumulated_neg += 1
    
        return satisfied_pair / float(total_pair)

    参考文献

    [1] Hanley, J.A., McNeil, B.J., The meaning and use of the area under a receiver operating characteristic (ROC) curve. Radiology 143, 29–36. 1982.

    [2] Breiman, L., Friedman, J., Olshen, R., Stone, C., Classification and Regression Trees. Wadsworth International Group. 1984.

    [3] Tom Fawcett, An introduction to ROC analysis. Pattern Recognition Letters. 2006.

    [4] Introduction to auc and roc

    [5] ROC(Receiver operating characteristic) (From Wikipedia)

    [6] How to calculate area under the curve auc or the c-statistic by hand

  • 相关阅读:
    Firefox for macOS 标签关闭按钮设置在左侧
    Nginx 非编译安装 stream 模块实现四层负载均衡
    苹果手机卡死,强制关机方法
    Git安装完成,文件夹下右键菜单不出现出现Git Bash Here 和Git UI Here问题
    AESUtil
    若依框架清空select2选择
    RSAUtils
    springboot 延时任务
    Mqtt的坑,真的坑
    springboot 支付宝支付业务网页端扫码
  • 原文地址:https://www.cnblogs.com/hit-joseph/p/11448792.html
Copyright © 2020-2023  润新知