1.背景

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

在不同的应用任务中,我们可以根据任务需求来采用不同的截断点,例如:

  • 更重视“查准率”,则可选择排序中靠前的位置进行截断
  • 更重视“查全率”,则可选择排序中靠后的位置进行截断

因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏。ROC曲线就是从这个角度出发来研究学习器泛化性能的有力工具。

注:混淆矩阵、查准率、查全率等概念参见上一篇文章:分类问题中模型的性能度量(一)

2.ROC曲线

2.1 ROC名称溯源(选看)

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,它源于“二战”中用于敌机检测的雷达信号分析技术。

具体来说,据说在二战期间,军队中雷达兵的任务是通过观察显示屏的雷达信号来判断是不是有敌人来了,在以下两种情况下显示屏上会有雷达信号:

  • 有敌机来袭(真实情况下的正例)
  • 有飞鸟(真实情况下的负例)

这个时候不同的雷达兵就可能会报出不同的结果:

  • 假如这个雷达兵比较谨慎,只要有信号就报告有敌情(可以看作更重视“查全率”),就会增加误报的风险;
  • 假如这个雷达兵比较大胆,只要有信号就认为是鸟(可以看作更重视“查准率”),就会增加漏报的风险。

这样就有了我们针对这个问题的“混淆矩阵”



理想情况下,希望每个雷达兵能够好好研究飞机和飞鸟信号的区别,进行准确的判断。但是现实问题是,每个雷达兵的判断标准不一,谨慎的容易出现误报,胆大的容易出现漏报。

针对以上问题,雷达兵的上级管理者汇总了每个雷达兵的汇报特点,尤其是他们的漏报和误报的概率,并将这些概率基于二维坐标系绘制成一个图形:

  • 纵坐标为敏感性(真阳性率):表示在所有敌人来袭(即真实情况为正例,TP+FN)的事件中,每个雷达兵准确预报(即TP)的概率;
  • 横坐标为1-特异性(假阳性率):表示在所有飞鸟信号(即真实情况为反例,TN+FP)中,每个雷达兵预报错误(即FP)的概率;

每个雷达兵的预报标准不同,所以得到的敏感性和特异性的组合也不同。一个雷达兵的敏感性和特异性的组合正好在一条曲线上,这条曲线就是ROC曲线。

到这里就不难理解ROC曲线为什么叫做“受试者工作特征”曲线了,在这里受试者就是指雷达兵,绘制这个曲线的目的就是观察雷达兵的工作特征,所以叫做受试者工作特征曲线。

在机器学习中,受试者就是我们的学习器了,绘制曲线的目的就是观察学习器的工作性能。

2.2 ROC曲线的绘制

分类问题中模型的性能度量(一)中介绍的P-R曲线类似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值:

  • 真正例率(True Positive Rate,TPR),也称为灵敏度(Sensitivity),

    TPR=TPTP+FNTPR=\frac{TP}{TP+FN}TPR=TP+FNTP​
  • 假正例率(False Positive Rate,FPR),也称为1-特异度(Specificity),

    FPR=FPFP+TNFPR=\frac{FP}{FP+TN}FPR=FP+TNFP​

    注:特异度=TNFP+TN\frac{TN}{FP+TN}FP+TNTN​

结合二分类问题的混淆矩阵我们知道,TP+FN其实就是所有真实情况为正的样本数,FP+TN其实就是所有真实情况为反的样本数,那么我们令P=TP+FN,N=FP+TN,就可以得到简化版的公式(便于理解):

  • TPR=TPPTPR=\frac{TP}{P}TPR=PTP​,这时很容易看出,真正例率其实就是在所有真实情况下为正的样例中,预测为正的样本所占比例;
  • FPR=FPNFPR=\frac{FP}{N}FPR=NFP​,假正例率其实就是在所有真实情况下为反的样例中,预测为正的样本所占比例;

以FPR作为横轴、TPR作为纵轴作图,就得到了“ROC曲线”,显示ROC曲线的图叫做“ROC图”,如下所示:



对ROC图的几点解释:

  • 图(a)中的对角线(图中虚线),对应于“随机猜测”模型;
  • ROC曲线越靠近左上角,性能越好;
  • 点(0,1)(左上角),对应于将所有正例排在所有反例之前的“理想模型”(左上角对应的点为(0,1),也就是FPR=0,TPR=1,结合上面的公式,可以得到这时FP=0,FN=0,模型对所有的样本分类都正确,也就是将真实为正的预测为正,真实为反的预测为反,没有假正、假反。)
  • ROC曲线与P-R曲线不一样的地方在于,当正反样例分布发生剧烈变化的时候:ROC曲线的形状基本能够保持不变;P-R曲线的形状一般会发生剧烈变化。

现实任务中,通常是利用有限个测试样例来绘制ROC图,此时仅能获得有限个(FPR,TPR)坐标对,无法产生图(a)中光滑的ROC曲线,只能绘制出图(b)所示的近似ROC曲线。绘制过程如下:

  • 1.给定m+m^+m+个正例和m−m^-m−个反例,根据学习器预测结果对样例进行排序
  • 2.设置不同的分类阈值:

    2.1 把分类阈值设为最大,即把所有样例均预测为反例,此时TPR=FPR=0。在坐标(0,0)处标记一个点。

    2.2 将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为(x,y)(x,y)(x,y):

    当前若为真正例(TP),则对应标记点的坐标为(x,y+1m+)(x,y+\frac{1}{m^+})(x,y+m+1​);

    当前若为假正例(FP),则对应标记点的坐标为(x+1m−,y)(x+\frac{1}{m^-},y)(x+m−1​,y);
  • 3.最后用线段连接相邻点即得ROC曲线

3.AUC(Area Under ROC Curve)

3.1 AUC来历

进行学习器比较时,与P-R图类似:

  • 若一个学习器的ROC曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者;
  • 若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者哪个更优。此时如果一定要进行比较,则较为合理的判据是:比较ROC曲线下的面积,即AUC(Area Under ROC Curve)。

3.2 AUC几何意义

从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。

假定ROC曲线是由坐标{(x1,y1),(x2,y2),...,(xm,ym)}\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}{(x1​,y1​),(x2​,y2​),...,(xm​,ym​)}的点按序连接而成(x1=0,xm=1)(x_1=0,x_m=1)(x1​=0,xm​=1),参见上面图(b),则AUC可估算为:

AUC=12∑i=1m−1(xi+1−xi)∗(yi+yi+1)AUC=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)*(y_i+y_{i+1})AUC=21​i=1∑m−1​(xi+1​−xi​)∗(yi​+yi+1​)

3.3 AUC计算

形式化地看,AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。给定m+m^+m+个正例和m−m^-m−个反例,令D+D^+D+和D−D^-D−分别表示正、反例集合,则排序“损失”(loss)定义为:

lrank=1m+∗m−∑x+∈D+∑x−∈D−(Ⅱ(f(x+)&lt;f(x−))+12Ⅱ(f(x+)=f(x−)))l_{rank}=\frac{1}{m^+*m^-}\sum_{x^+\in D^+}\sum_{x^- \in D^-}\left(Ⅱ(f(x^+)&lt;f(x^-))+\frac{1}{2}Ⅱ(f(x^+)=f(x^-))\right)lrank​=m+∗m−1​x+∈D+∑​x−∈D−∑​(Ⅱ(f(x+)<f(x−))+21​Ⅱ(f(x+)=f(x−))),其中Ⅱ()为指示函数,在为正和假时分别取值为1,0。

即考虑每一对正、反例,

  • 若正例的预测值小于反例(即真实情况为正例的样本,被预测为正例的概率,小于,真实情况为负例的样本,被预测为正例的概率),则记1个“罚分”;
  • 若正例的预测值与反例相等,则记0.5个“罚分”。

容易看出,lrankl_{rank}lrank​对应的是ROC曲线之上的面积:若一个正例在ROC曲线上对应标记点的坐标为(x,y),则x恰是排序在其之前的反例所占的比例,即假正例率。因此有AUC计算公式

AUC=1−lrankAUC=1-l_{rank}AUC=1−lrank​

3.4 理解AUC的意义

通过AUC的定义我们知道了AUC是什么,怎么算,但是它的意义是什么呢。

3.4.1 从Mann-Whitney U test角度理解

实际上AUC和Mann-Whitney U test有密切的联系。从Mann-Whitney U test的角度来理解AUC:

  • 1.从所有正例(即m+m^+m+)中随机选取一个样本,从所有反例(即m−m^-m−)中随机选取一个样本;
  • 2.然后根据我们的学习器对两个随机样本进行预测,把正例预测为正的概率为p1,把反例预测为正的概率为p2;
  • 3.p1>p2的概率就等于AUC

3.4.2 从AUC计算公式角度理解

AUC=1−lrankAUC=1-l_{rank}AUC=1−lrank​

lrankl_{rank}lrank​表示:任取一对正反例(真实情况),把(真实情况下的)正例预测为正的概率≤\leq≤把(真实情况下的)反例预测为正的概率,的概率。

那么AUC,即1−lrank1-l_{rank}1−lrank​就相应地表示:任取一对正反例(真实情况),把(真实情况下的)正例预测为正的概率&gt;&gt;>把(真实情况下的)反例预测为真的概率,的概率。

3.4.3 一句话介绍AUC

从上面两个角度总结来看,对AUC比较全面的总结:

  • AUC就是,从测试集中随机(即任取)选定一个正例、一个反例,分类器输出该正例为正的那个概率值,比,分类器输出该反例为正的那个概率值,要大,的可能性。

还有一句更加简洁的总结:

  • 从测试集中任取一个正例、一个反例,经分类器输出,正例得分大于负例得分的概率。(对于得分的理解,见逻辑回归模型中1.1.2 对假设函数输出的解释)

3.5 为什么用AUC

AUC的优势:AUC的计算方法同时考虑了分类器对于正例和反例的分类能力,在样本不均衡的情况下,依然能够对分类器作出合理的评价。(即AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。)

例如:在反欺诈场景,设非欺诈类样本为正例,反例占比很少(假设为0.1%):

  • 如果使用准确率评估,把所有样本预测为正,便可以获得99.9%的准确率;
  • 但是如果使用AUC,把所有样本预测为正例,TPR=FPR=1,AUC仅为0.5,成功规避了样本不均衡带来的问题。

3.6 AUC的一般判断标准

  • = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  • < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
  • 0.5 - 0.7:效果较低,但用于预测股票已经很不错了
  • 0.7 - 0.85:效果一般
  • 0.85 - 0.95:效果很好,需要选定合适阈值
  • 0.95 - 1:效果非常好,但一般不太可能

参考:

1.《机器学习》2.3,周志华

2.BAT面试官最喜欢问的问题之一:ROC曲线

3.如何理解机器学习和统计中的AUC(重点前5个回答)

4.对AUC计算公式和几何意义的理解

【分类问题中模型的性能度量(二)】超强整理,超详细解析,一文彻底搞懂ROC、AUC的更多相关文章

  1. 【分类问题中模型的性能度量(一)】错误率、精度、查准率、查全率、F1详细讲解

    文章目录 1.错误率与精度 2.查准率.查全率与F1 2.1 查准率.查全率 2.2 P-R曲线(P.R到F1的思维过渡) 2.3 F1度量 2.4 扩展 性能度量是用来衡量模型泛化能力的评价标准,错 ...

  2. 模型的性能评估(二) 用sklearn进行模型评估

    在sklearn当中,可以在三个地方进行模型的评估 1:各个模型的均有提供的score方法来进行评估. 这种方法对于每一种学习器来说都是根据学习器本身的特点定制的,不可改变,这种方法比较简单.这种方法 ...

  3. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  4. (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)

    当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...

  5. JavaScript中instanceof与typeof运算符的用法及区别详细解析

    JavaScript中的instanceof和typeof常被用来判断一个变量是什么类型的(实例),但它们的使用还是有区别的: typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typ ...

  6. 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析

    /* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的 ...

  7. 来吧,一文彻底搞懂Java中的Comparable和Comparator

    大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...

  8. 来吧,一文彻底搞懂Java中最特殊的存在——null

    没事的时候,我并不喜欢逛 P 站,而喜欢逛 programcreek 这些技术型网站,于是那天晚上,在夜深人静的时候,我就发现了一个专注基础但不容忽视的主题.比如说:Java 中的 null 到底是什 ...

  9. MyBatis框架中的条件查询!关键字exists用法的详细解析

    exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...

随机推荐

  1. 1. GC标记-清除算法(Mark Sweep GC)

    世界上第一个GC算法,由 JohnMcCarthy 在1960年发布. 标记-清除算法由标记阶段和清除阶段构成. 标记阶段就是把所有的活动对象都做上标记的阶段. 标记阶段就是"遍历对象并标记 ...

  2. sklearn中实现多分类任务(OVR和OVO)

    sklearn中实现多分类任务(OVR和OVO) 1.OVR和OVO是针对一些二分类算法(比如典型的逻辑回归算法)来实现多分类任务的两种最为常用的方式,sklearn中专门有其调用的函数,其调用过程如 ...

  3. 对象内置的方法/内置的 Symbol 值

    内置的 Symbol 值 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法. Symbol.hasInstance 对象的Symbo ...

  4. SciPy 输入输出

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  5. 用 Heapster 监控集群【转】

    Heapster 是 Kubernetes 原生的集群监控方案.Heapster 以 Pod 的形式运行,它会自动发现集群节点.从节点上的 Kubelet 获取监控数据.Kubelet 则是从节点上的 ...

  6. mysql5.7修改账户密码

    一.首次登录时,修改root账户的密码: vim /etc/my.cnf 在末尾添加 skip-grant-tables ,保存. service mysqld restart 再次登录时,不需要密码 ...

  7. Day5 - C - Agri-Net POJ - 1258

    Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet c ...

  8. 011-PHP获取数组中的元素

    <?php $monthName = array( /*定义$monthName[1]到$monthName[12]*/ 1=>"January", "Feb ...

  9. 认识json,详解JsonConfig

    说到json 初学者很迷茫,不知json怎么为何物,以及怎么用.我简单说下我的了解 既然用了json 我们就要知其然也知其所以然.下面有几个疑问 1.为什么要用json?也就是json 的优势 2.我 ...

  10. Educational Codeforces Round 64 选做

    感觉这场比赛题目质量挺高(A 全场最佳),难度也不小.虽然 unr 后就懒得打了. A. Inscribed Figures 题意 给你若干个图形,每个图形为三角形.圆形或正方形,第 \(i\) 个图 ...