ROC 曲线与 PR 曲线

ROC 曲线与 PR 曲线

  • ROC 曲线和 PR 曲线是评估机器学习算法性能的两条重要曲线,两者概念比较容易混淆,但是两者的使用场景是不同的。本文主要讲述两种曲线的含义以及应用的场景。

定义

ROC 曲线和 PR 曲线都是用在二分类中,且涉及到下图的几个概念(摘自 The Relationship Between Precision-Recall and ROC Curves)


上面四个指标用大白话解释如下

  • Recall:查全率,正样本中被预测出来是正的比例(越大越好)
  • Precision:查准率,预测的正样本中被正确预测的比例(越大越好)
  • True Positive Rate:跟 Recall 定义一样 (越大越好)
  • FPR : 负样本中被预测为正的比例(越小越好)

对于一个二分类问题,往往要设定一个 threshold,当预测值大于这个 threshold 时预测为正样本,小于这个 threshold 时预测为负样本。如果以 Recall 为横轴,Precision 为纵轴,那么设定一个 threshold 时,便可在坐标轴上画出一个点,设定多个 threshold 则可以画出一条曲线,这条曲线便是 PR 曲线。

PR 曲线是以 Recall 为横轴,Precision 为纵轴;而 ROC曲线则是以 FPR 为横轴,TPR 为纵轴。

那么两者的关系是怎样的?


对比

The Relationship Between Precision-Recall and ROC Curves 中证明了以下两条定理

  • 定理1:对于一个给定的的数据集,ROC空间和PR空间存在一一对应的关系,因为二者包含完全一致的混淆矩阵。我们可以将ROC曲线转化为PR曲线,反之亦然。

  • 定理2:对于一个给定数目的正负样本数据集,曲线 A 在 ROC 空间优于曲线 B ,当且仅当在 PR 空间中曲线 A 也优于曲线 B。

定理 2 中 “曲线A优于曲线B” 是指曲线 B 的所有部分与曲线 A 重合或在曲线 A 之下。而在ROC空间,ROC曲线越凸向左上方向效果越好。与ROC曲线左上凸不同的是,PR曲线是右上凸效果越好。

从定理 2 来看,ROC 空间和 PR 空间两个指标似乎具有冗余性,那么为什么还需要这同时两个指标呢?答案是在两者在样本不均衡的情况下表现有较大差异。


下图是ROC曲线和Precision-Recall曲线的对比,摘自 An introduction to ROC analysis

图 (a) 和 (b) 是在样本正负比例为 1:1 下的 ROC 曲线和PR 曲线,图(c) 和 (d) 是在样本正负比例为 1:100 下的 ROC 曲线和PR 曲线。

从结果来看:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。


文章 An introduction to ROC analysis中认为这是个优点,原因是在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而 ROC 这种对不平衡样本的鲁棒性使得其曲线下的面积 AUC 不会发生突变。

那么,AUC 意味这什么?首先 AUC 值是一个概率值,表示随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率。 AUC计算 - 进阶操作

因此,AUC值实际上反映了模型的 rank 能力,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面。这个指标尤其适用在某些场景下(如 CTR 预估),每次要返回的是最有可能点击的若干个广告(根据CTR排序, 选择排在前面的若干个),实际上便是在考验模型的排序能力。除此之外,CTR 中存在着样本不均衡的问题,正负样本比例通常会大于 1:100,如果采用 PR 曲线,则会导致 AUC 发生剧变,无法较好反映模型效果。

然而,ROC 曲线不会随着类别分布的改变而改变的优点在一定程度上也是其缺点。因为 ROC 曲线这种不变性其实影响着的是 AUC 值,或者说是评估分类器的整体性能。但是在某些场景下,我们会更关注正样本,这时候就要用到 PR 曲线了。


比如说信用卡欺诈检测,我们会更关注 precision 和 recall,比如说如果要求预测出为欺诈的人尽可能准确,那么就是要提高 precision;而如果要尽可能多地预测出潜在的欺诈人群,那么就是要提高 recall。一般来说,提高二分类的 threshold 就能提高 precision,降低 threshold 就能提高 recall,这时便可观察 PR 曲线,得到最优的 threshold。

除此之外,Quora 上的问题

What is the difference between a ROC curve and a precision-recall curve? When should I use each?中也举了一下的例子说明了在欺诈检测的问题中,PR 曲线更能反映结果的变化。

Let’s take an example of fraud detection problem where there are 100 frauds out of 2 million samples.

Algorithm 1: 90 relevant out of 100 identified

Algorithm 2: 90 relevant out of 1000 identified

Evidently, algorithm 1 is more preferable because it identified less number of false positive.

In the context of ROC curve,

Algorithm 1: TPR=90/100=0.9, FPR= 10/1,999,900=0.00000500025

Algorithm 2: TPR=90/100=0.9, FPR=910/1,999,900=0.00045502275

The FPR difference is 0.0004500225

For PR Curve

Algorithm 1: precision=0.9, recall=0.9

Algorithm 2: Precision=90/1000=0.09, recall= 0.9

Precision difference= 0.81

The difference is more apparent in PR curve


总结

综上,有以下几条结论(参考 机器学习之类别不平衡问题 (2) —— ROC和PR曲线

  1. ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能(通常是会计算AUC,表示模型的rank性能),相比而言PR曲线完全聚焦于正例。

  2. 如果有 多份数据且存在不同的类别分布。比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。

  3. 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。(参考上面 Quora 的例子)

  4. 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。

ROC 曲线与 PR 曲线的更多相关文章

  1. ROC曲线、PR曲线

    在论文的结果分析中,ROC和PR曲线是经常用到的两个有力的展示图. 1.ROC曲线 ROC曲线(receiver operating characteristic)是一种对于灵敏度进行描述的功能图像. ...

  2. 精确率与召回率,RoC曲线与PR曲线

    在机器学习的算法评估中,尤其是分类算法评估中,我们经常听到精确率(precision)与召回率(recall),RoC曲线与PR曲线这些概念,那这些概念到底有什么用处呢? 首先,我们需要搞清楚几个拗口 ...

  3. ROC曲线和PR曲线

    转自:http://www.zhizhihu.com/html/y2012/4076.html分类.检索中的评价指标很多,Precision.Recall.Accuracy.F1.ROC.PR Cur ...

  4. ROC曲线 VS PR曲线

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  5. 【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考

    ROC曲线 在网上有很多地方都有说ROC曲线对于正负样本比例不敏感,即正负样本比例的变化不会改变ROC曲线.但是对于PR曲线就不一样了.PR曲线会随着正负样本比例的变化而变化.但是没有一个有十分具体和 ...

  6. ROC曲线和PR曲线绘制【转】

    TPR=TP/P :真正率:判断对的正样本占所有正样本的比例.  Precision=TP/(TP+FP) :判断对的正样本占判断出来的所有正样本的比例 FPR=FP/N :负正率:判断错的负样本占所 ...

  7. 机器学习之类别不平衡问题 (2) —— ROC和PR曲线

    机器学习之类别不平衡问题 (1) -- 各种评估指标 机器学习之类别不平衡问题 (2) -- ROC和PR曲线 完整代码 ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题 ...

  8. P-R曲线及与ROC曲线区别

    一.P-R曲线 P-R曲线刻画查准率和查全率之间的关系,查准率指的是在所有预测为正例的数据中,真正例所占的比例,查全率是指预测为真正例的数据占所有正例数据的比例. 即:查准率P=TP/(TP + FP ...

  9. 查全率(Recall),查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC的应用场景

    之前介绍了这么多分类模型的性能评价指标(<分类模型的性能评价指标(Classification Model Performance Evaluation Metric)>),那么到底应该选 ...

  10. PR曲线,ROC曲线,AUC指标等,Accuracy vs Precision

    作为机器学习重要的评价指标,标题中的三个内容,在下面读书笔记里面都有讲: http://www.cnblogs.com/charlesblc/p/6188562.html 但是讲的不细,不太懂.今天又 ...

随机推荐

  1. P8936 月下缭乱 Sol

    考虑对操作的区间 \([l_i,r_i]\) 的下标进行扫描线而不是对操作的值扫.用 \(m\) 个 set 动态维护 \(x_i\) 对应的操作的下标集合,再用一个可删堆来维护当前所有操作 \(x_ ...

  2. 记一次 .NET 某车零件MES系统 登录异常分析

    一:背景 1. 讲故事 这个案例有点特殊,以前dump分析都是和软件工程师打交道,这次和非业内人士交流,隔行如隔山,从指导dump怎么抓到问题解决,需要一个强大的耐心. 前几天有位朋友在微信上找到我, ...

  3. websocket多实例推送解决方案-数据实时展示

    需求 需要前端展示实时的订单数据信息.如下图所示,实时下单实时页面统计更新展示 思路方案 前端使用websocket 建立通信 后端监听数据库的binglog变更,实时得到最新数据,推送到前端 现状及 ...

  4. 🚀 jdbc-plus是一款基于JdbcTemplate增强工具包, 已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用

    jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包, 基于JdbcTemplate已实现分页.多租户.动态表名等插件,可自定义扩展插件,可与mybatis.myba ...

  5. 文心一言 VS chatgpt (3)-- 算法导论2.1

    一.以图 2-2 为模型,说明INSERTION-SORT 在数组 A=(31,41,59,26,41,58)上的执行过程. 文心一言: 以图 2-2 为模型,说明INSERTION-SORT 在数组 ...

  6. SICP:元循环求值器(Python实现)

    求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 在这个层次结构的最底层是对象语言.对象语言只 ...

  7. 【源码解读】asp.net core源码启动流程精细解读

    引言 core出来至今,已经7年了,我接触也已经4年了,从开始的2.1,2.2,3.1,5,6再到如今的7,一直都有再用,虽然我是一个Winform仔,但是源码一直从3.1到7都有再看,然后在QQ上面 ...

  8. Django自定义storage上传文件到Minio

    首先新建一个MyStorage.py,自定义Storage类 from io import BytesIO from django.core.files.storage import Storage ...

  9. springboot+springsecurity+jwt+elementui图书管理系统

    ​​图书管理系统​​ 一.springboot后台 1.mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --> <dependency> < ...

  10. 【Haxe】(二)字符串与变量的输入输出

    前言 每次学习一门新语言,各种手册和教程一上来就是讲变量如何定义,数据结构怎么用,很少有讲输入输出应该怎么写的.我比较喜欢先搞懂这部分,这让我感觉像是掌握了学习主动权,很能调动我的学习积极性.于是我的 ...