AUC,area under ROC curve的缩写,就是ROC曲线下的面积;ROC曲线是啥呢,就是类似于这样的一张图:
左边是理想状态下,右边是基于有限样例绘制,也就是实际情况下ROC曲线一般都是右边那样,从左下角一拱一拱地拱到了右上角;
可以看到横坐标叫假正例率,纵坐标叫真正例率,啥意思呢,就是判定为真实际又恰好为真的数量 占实际就为真的比例就是真正例率(以下称为TPR);判定为真实际却为假的数量 占实际就为假的比例就是假正例率(以下称为FPR)(以上是文字描述,公式看这里https://www.cnblogs.com/JesusAlone/p/9758471.html)
那么给定了一串样本和对应的打分,怎么得到的这个ROC曲线呢,这里就要提到阈值的概念了,先举一个例子吧,比如有一串样本和对应的打分如下,class表示实际的类别,score表示模型的打分:
这里所有样本按打分排成一串,要得到ROC曲线上的一点,就要知道该点对应的TPR和FPR,就要知道在这个点判定为真实际为真的数量、实际为真的样本总数,判定为真实际为假的数量、实际为假的样本总数;
实际为真的样本总数其实是固定的,看一下上图class = p的数量就是(以下用M表示,这里M=10),实际为假的看一下class = n的数量就是(以下用N表示,这里N=10);那么关键就是判定为真实际为真的数量和判定为真实际为假的数量了;
怎么去判定呢,关键在于阈值,一开始设定阈值为1,那么TPR和FPR就都为0(思考一下为什么,这里考一下什么叫“判定”),然后阈值到了0.9,TPR = 1/10、FPR = 0,在ROC图上就从原点往上走了一步;
之后每遇到一个判定为真实际为真的样本就往上走一步,每遇到一个判定为真实际为假的样本就往右走一步,直到走到世界尽头,划掉,是走到(1,1),至此ROC曲线绘制完毕如下:
然后接着说AUC怎么算,不能老是画张图出来然后一个一个矩形算吧,这些矩形背后难道没有对应的物理意义可以对着样本就算出来的吗,答案是有的;
比如上面的图片,从0.2往右走一步表示阈值调整后后面紧接着一个判定为正的负样本,那么这条横线再往右的延长线是不是就代表着这两个正样本(9和8)后面所有的负样本,那么这条延长线和x轴围成的面积(这里要再乘以MN)表示的是不是就是这两个正样本所在位置后面的负样本的数量;(这里从每个画x的节点向右画延长线,两条延长线之间的面积就是该点后面负样本的数量)
上面这段话可能有些不好理解,继续拿例子来说,0.9后面有10个负样本,那么这个点和x轴围成矩形的面积(再*100)就是10,0.51后面有7个负样本,那么这个点和0.52延长线所围成矩形的面积(再*100)就是7,以此类推;(严格证明好像要涉及一个啥Wilcoxon-Mann-Witney Test,在参考的第二篇里有提到,但这里可以直观从auc的画法上去理解)
那么这么只看样本来算AUC的方法就呼之欲出了,AUC的面积就是每条延长线之间的矩形面积之和,每个矩形面积又代表了这个正样本后负样本的个数,所以整体的面积就是每个正样本数后头负样本的个数之和,用公式表示就是:
这里M表示正样本总数,N表示负样本总数,其中,
这也揭示了AUC的物理意义,即任取一对正负样本,正样本的预测值大于负样本的预测值的概率;那么有人还是嫌麻烦,难道还要一个一个去数吗,当然不是啦,公式就是要做到最简洁嘛,而且这里显然跟每个正样本所在的位置关系很大嘛;
继续改良,先给出公式:
看上去很难但算起来很简单的样子,就是把所有正样本所在的位置(公式里的ranki)求和,然后把M和N一顿操作(回顾一下,M和N表示的是总的正样本数和负样本数),就ok了;注意哦这里的ranki所指的正样本位置是从大开始的,比如上面例子里score = 0.9的样本对应的rank是20,score = 0.8的样本对应的rank是19,以此类推;
这个求和再相减的公式为什么能和上面那个I(P正样本,P负样本)的公式对应呢,原来啊,这里做的就是把I(P正样本,P负样本)得到为rank - i,再求和;什么是rank - i 呢,继续举例子,当rank = 20时,包括自身和后面的正样本数为10,减掉后就是对应的负样本数了;当rank = 19时,包括自身和后面的正样本数为9,减掉后就是对应的负样本数了,以此类推再求和不就是总的正样本后负样本的个数吗;
这里有一种特例我们一直没有提到,那就是score相等的情况,在ROC曲线里这对应了一根斜线(思考一下为什么,以及一段斜线表示的是几个样本),类似于下面这个样子:
(答案:一个正样本,两个负样本)
所以如果是直接计算曲线下面积就要用梯形公式而不是矩形公式来计算每一个竖向矩形的面积:
那如果用物理意义的公式来算,相同score样本间的正序对的个数应该算作0.5,依然能够得到每个正样本的正序对的个数再求和;
至于为什么是0.5,其实很简单,比如这个例子中的正反顺序为【反,正,[正,正,反],反,正,反,正,反,正】,[] 括起来的实例分数相同,如果这几个样本按相同的rank只算这个rank后的负样本数(即例子中[]后的负样本数),其实得到的是(2,3)这个点和(1,1)的水平延长线构成的矩形面积,还少了前面三角形这一块面积(负样本数为底、正样本数为高);
这一块三角形的面积如果补全成矩形对应的正反顺序是正正反,正序对的个数为1+1,现在直接连接了矩形的两个对角,正序对的个数便应该算作0.5+0.5;可以得到总的正序对个数是4+3.5+3.5+2+1=14;auc=14/30=7/15
那么对第二个带rank的公式来说,相同scroe的rank要求和取均值;比如这个例子中score相同的三个样本的rank就都是(9+8+7)/3=8,总的auc的计算是((10+8+8+5+3+1)-(6*7)/2) /6*5) = 7/15;至于为什么是取rank均值,而后面的相减项不变,对照上面的正序对的个数计算方式可以认为是3.5*2+5+4 = 16/2 = 8(上面式子里为什么是8);
(上面两段没有看懂也没有关系,实际情况下score相同的情况非常小,而且套入计算公式时就把正序对个数当成0.5计算即可,用ranki那个公式就取三个rank的均值作为正样本的ranki即可)
这里顺道再说一下西瓜书里提到的一个概念叫rank损失,公式如下:
理解了物理意义之后这个公式应该不难理解了,Lrank = 1 - AUC,同样还可以从图里找到对应的面积;
说到这里AUC的计算方式就都说完了~ 下面是拓展延伸部分,比较了ROC曲线和PRC曲线在用作metric时的优劣;
最后引用的这篇文章后面的思考部分还提到了在类不平衡问题下,比如正负例90:10,将所有样本判定为正例,准确率没有意义但AUC可以处理(因为全部判定为正的话AUC曲线也仅仅是连接了(0,0)和(1,1));
但更有意义的是它说明了为什么工业界常用AUC来作为CTR预估的指标,比较了ROC曲线和PRC曲线(PRC曲线的画法也是将样本按score排成一串,每次取一个阈值路过一个样本,算一个recall(横坐标)和precision(纵坐标),当阈值和第一个预测值相等时,recall(实际为真里预测为真的占比)~0,precision(预测为真里实际为真的占比)=1):
a/b是正负例均衡时的ROC和PRC,c/d是负例样本扩大10倍后的ROC和PRC,每个图里两个曲线是两个分类器;可以看到在正负样本大致分布均匀时,ROC曲线更稳定,没有PRC曲线那么多的起伏(原因在于recall增加时,precision大体呈下降趋势,但小范围内可能会不单调);但正负比不均衡,负例远大于正例时,PRC曲线就能更敏感地反映出分类器的真实性能;
作者举了这样一个例子:两图红色的点表示相同的点,即TPR也就是recall等于0.8的点,假设共100个正例,简单的计算可知这两幅图表示出来了一个正例数为100,负例数为15200的样本,但是“在点A处,分类器将1600 (1520+80)个样本预测为positive,而其中实际上只有80个是真正的positive。 我们凭直觉来看,其实这个分类器并不好。但由于真正negative instances的数量远远大约positive,ROC的结果却“看上去很美”,因为这时FPR因为负例基数大的缘故依然很小。所以,在这种情况下,PRC更能体现本质。”
原因作者也给出来了,在于“FPR 和 TPR (Recall) 只与真实的正例或负例中的一个相关(可以从他们的计算公式中看到),而其他指标如Precision则同时与真实的正例与负例都有关”
当然尽管如此,工业界还是采用ROC曲线来作为ctr的线下预估指标,这是为什么呢,作者也给出了自己的思考:首先,ROC和PRC都是排序强相关的指标,但相比较而言,一是因为AUC还是能比较两个算法之间的优劣,只是绝对值可能会表现得过于乐观;二是AUC鲁棒性更强,不管在何种情况下都能保持稳定,不会出现PRC曲线偶尔可能抽风的情况;三是AUC的计算方式更简单,基于以上三点采用的选择。
参考:https://blog.csdn.net/qq_22238533/article/details/78666436 举例计算了auc的两种计算方式,没有说明原理
https://blog.csdn.net/pzy20062141/article/details/48711355 前半部分大体参考此篇
https://blog.csdn.net/weixin_41362649/article/details/89081651 红蓝图,举例说明了auc的第二种计算方式