ROC和AUC介绍以及如何计算AUC

转自: http://alexkong.net/2013/06/introduction-to-auc-and-roc/


ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,对两者的简单介绍见这里。这篇博文简单介绍ROC和AUC的特点,以及更为深入地,讨论如何作出ROC曲线图以及计算AUC。

ROC曲线

需要提前说明的是,我们这里只讨论二值分类器。对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score1,以及我们今天要讨论的ROC和AUC。下图是一个ROC曲线的示例2

ROC曲线示例

正如我们在这个ROC曲线的示例图中看到的那样,ROC曲线的横坐标为false positive rate(FPR),纵坐标为true positive rate(TPR)。下图中详细说明了FPR和TPR是如何定义的。

FPR和TPR定义

接下来我们考虑ROC曲线图中的四个点和一条线。第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。

下面考虑ROC曲线图中的虚线y=x上的点。这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果,例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另外一半的样本为负样本。

如何画ROC曲线

对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下Wikipedia上对ROC曲线的定义:

In signal detection theory, a receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.

问题在于“as its discrimination threashold is varied”。如何理解这里的“discrimination threashold”呢?我们忽略了分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。通过更深入地了解各个分类器的内部机理,我们总能想办法得到一种概率输出。通常来说,是将一个实数范围通过某个变换映射到(0,1)区间3

假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率4

按照概率排序

接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:

ROC曲线举例

当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。

其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。我认为将评分值转化为概率更易于理解一些。

AUC值的计算

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

在了解了ROC曲线的构造过程后,编写代码实现并不是一件困难的事情。相比自己编写代码,有时候阅读其他人的代码收获更多,当然过程也更痛苦些。在此推荐scikit-learn中关于计算AUC的代码。

AUC意味着什么

那么AUC值的含义是什么呢?根据(Fawcett, 2006),AUC的值的含义是: > The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.

这句话有些绕,我尝试解释一下:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。

为什么使用ROC曲线

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

ROC曲线 vs. Precision-Recall曲线

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

说明,文中除了第一张图来自Wikipedia外,其他的图都来自论文(Fawcett, 2006)6截图.

引用及其他链接:

  • 维基百科中对ROC的介绍: http://en.wikipedia.org/wiki/Receiver_operating_characteristic
  • ROC曲线及AUC评价指标 by 冒泡的崔:http://bubblexc.com/y2011/148/
  1. 我避免将precision,recall等评价指标翻译成中文,因为它们可能对应多个中文解释,极易产生混淆。 ↩

  2. 图片来源:http://en.wikipedia.org/wiki/File:Roccurves.png ↩

  3. 这种映射不一定都是可靠的,即你不一定真的得到了某个样本是正样本的概率。 ↩

  4. 注意这里使用了“Score”,而不是概率,我们暂且可以认为“Score”值就是是正样本的概率。 ↩

  5. Davis, J., & Goadrich, M. (2006, June). The relationship between Precision-Recall and ROC curves. In Proceedings of the 23rd international conference on Machine learning (pp. 233-240). ACM. ↩

  6. (Fawcett, 2006),Fawcett, T. (2006). An introduction to ROC analysis. Pattern recognition letters, 27(8), 861-874. ↩


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么Netty这么火?与Mina相比有什么优势?

转载自 为什么Netty这么火?与Mina相比有什么优势?Netty是什么?为什么这么火? Netty是目前最流行的由JBOSS提供的一个Java开源框架NIO框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发…

一张图告诉你为什么是服务网关

转载自 一张图告诉你为什么是服务网关,文末有现金抽奖。网关服务是单一访问点,并充当多项服务的代理。服务网关启用了跨所有服务的路由转发、过滤和公共处理等。在微服务实践中远不止这点功能,它可以做到统一接入、流量管控、安全防护、业务隔…

offer复习日志

(1)复习mysql,只需要 2.5 个小时;

File类对文件的操作应用

1.在不存在的文件夹下创建文件 //在当前模块下aaa文件下ddd下eee中创建一个e.txt文件 public class Demo2 {public static void main(String[] args) throws IOException {File file new File("day11_myFile\\aaa\\ddd\\eee");//createNewFile()建立文件需要文件夹…

一张图告诉你什么是系统架构师

转载自 一张图告诉你什么是系统架构师这张图从架构师的综合能力、岗位认识、岗位职责等方面,清楚的画出了作为一个架构的基本准则。人人都想成为架构师,可作为架构你达到了上面的要求了吗? 系统架构师是个神奇的岗位。为什么这么说&#xff0…

机器学习和统计里面的auc怎么理解?

转自: https://www.zhihu.com/question/39840928 作者:小小丘 (该作者对 auc的意义 讲得非常棒, 感谢付出) 链接:https://www.zhihu.com/question/39840928/answer/84906286 来源:知乎 著作权归作者所有。…

IO流总述

IO流分类 1)按照流向分类&#xff1a; 输入流&#xff1a;读取数据用的 输出流&#xff1a;写数据用的 2)按照读写的数据分类(体系结构) <1>字节流[读写任何类型的文件(任何文件底层都是字节数据)] 字节输入流&#xff1a;IntputStream(抽象类) –FileInuptStream: 读取…

分布式ID生成器的解决方案总结

转载自 分布式ID生成器的解决方案总结在互联网的业务系统中&#xff0c;涉及到各种各样的ID&#xff0c;如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢&#xff1f;特别是在复杂的分布式系统业务场景中&#xff0c;我们应该采用哪种适合自己的解决方案…

IO流相关应用

1.1.字节流复制文件 //运用字节输入输出流将a.txt文件复制到b.txt中 public class Demo1 {public static void main(String[] args) throws IOException {//创建输入流对象FileInputStream fis new FileInputStream("day11_myIO\\a.txt");//可以使用BufferedInputS…

回归模型和分类模型的区别

转自&#xff1a; https://www.zhihu.com/question/21329754 分类和回归的区别在于输出变量的类型。 定量输出称为回归&#xff0c;或者说是连续变量预测&#xff1b; 定性输出称为分类&#xff0c;或者说是离散变量预测。 举个例子&#xff1a; 预测明天的气温是多少度&…

java计算混淆矩阵(分类指标:查准率P,查全率R,P和R的调和均值F1,正确率A)

【0】README 本文使用 java 计算混淆矩阵&#xff0c;并利用 混淆矩阵值计算 分类指标&#xff1b;通用分类指标有&#xff1a; 查准率&#xff0c;查全率&#xff0c;查准率和查全率的调和均值F1值&#xff0c;正确率&#xff0c; AOC&#xff0c; AUC等&#xff1b;本文计算…

什么是CPU密集型、IO密集型?

转载自 什么是CPU密集型、IO密集型&#xff1f;CPU密集型&#xff08;CPU-bound&#xff09; CPU密集型也叫计算密集型&#xff0c;指的是系统的硬盘、内存性能相对CPU要好很多&#xff0c;此时&#xff0c;系统运作大部分的状况是CPU Loading 100%&#xff0c;CPU要读/写I/O(硬…

Properties类与IO流

1.概念 Properties是Map的子类&#xff0c;是一个双列集合&#xff0c;键和值都是字符串类型。Map集合的方法它都能使用&#xff1b; 但是推荐是Properties自己特有的方法&#xff0c;对集合进行操作。 2.特有方法 //properties属于Map集合【该集合一般添加字符串键值对】 /…

什么是无监督学习(监督学习,半监督学习,无监督聚类)?

作者&#xff1a;王丰 链接&#xff1a;https://www.zhihu.com/question/23194489/answer/25028661 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 这个问题可以回答得很简单&#xff1a;是否有监督&#xff08;sup…

Java中的6颗语法糖

转载自 Java中的6颗语法糖语法糖&#xff08;Syntactic Sugar&#xff09;&#xff0c;也称糖衣语法&#xff0c;指在计算机语言中添加的某种语法&#xff0c;这种语法对语言本身功能来说没有什么影响&#xff0c;只是为了方便程序员的开发&#xff0c;提高开发效率。说白了&am…

其他流总述

1.转换流 InputStreamReader: 把InputStream转换为Reader&#xff0c;可以指定编码表 OutputStreamWriter: 把OutputStream转换为Writer&#xff0c;可以指定编码表 //转换流[用于指定编码表读入或写出] public class Demo1 {public static void main(String[] args) throws …

如何查阅相关工作所用到的文献资料

以百度学术为例。 step1&#xff1a;百度学术里输入 最关键的paper 名称&#xff0c;并点击 被引量链接&#xff1b; step2&#xff1a;通过最近年份 或 其他条件 筛选paper &#xff08;注意看发表期刊或会议的级别&#xff09; step3&#xff1a;主要看paper的摘要或 intro&…

递归算法介绍及Java应用实战

转载自 递归算法介绍及Java应用实战 什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题&#xff0c;然后递归调用函数&#xff08;或过程&#xff09;来表示问题的解。一个过程(或函数)直接或间接调用自己本身&#xff0c;这种过程(或函数)叫递归过程(或函数…

K最近邻分类器

转自&#xff1a; http://www.cnblogs.com/qwertWZ/p/4582096.html 本章介绍了《机器学习实战》这本书中的第一个机器学习算法&#xff1a;k-近邻算法&#xff0c;它非常有效而且易于掌握。首先&#xff0c;我们将探讨k-近邻算法的基本理论&#xff0c;以及如何使用距离测量的方…

多线程安全问题1

1.问题的产生 原因&#xff1a;多个线程操作同一个共享数据。 原理&#xff1a;多个线程在访问共享数据时&#xff0c;由于CPU的随机性&#xff0c;一个线程还没有执行完&#xff0c;执行权被其他线程抢走了&#xff0c;这个时候就有可能出现线程安全问题。 解决方式&#xff…