python绘制pr曲线图_PR、ROC、AUC全击破

本文介绍了混淆矩阵、PR曲线、ROC曲线和AUC的概念,探讨了它们在评估二分类模型性能中的作用。通过实例解释了查准率和查全率,展示了PR曲线和ROC曲线的绘制过程,并讨论了AUC的计算方法,包括近似法、曼-惠特尼法和排序法。
摘要由CSDN通过智能技术生成

ee7e987a3bc716ea0dc06feb42cbcc06.png

感觉自己越来越标题党了...不过我相信看了这篇文章,以及本文的参考文献,你会期待面试官问你这些问题。这篇文章适合对上述概念存在疑惑的同学,希望我讲的足够全可以解答你的疑惑。

在之前面试的时候,被问到给定一堆样本的label和模型预测的prob,怎么手动计算ROC、AUC。当时我写的那叫一个挫,把PR曲线和ROC曲线还搞混了...然后面试回来我立志一定要把这几个概念搞清楚(感觉都是吃了亏才长记性...)。

一、混淆矩阵

在进行一切计算之前,先画二分类问题的混淆矩阵。混淆矩阵有助于理清思路,也方便后续的推导。我们将样例根据真实值与模型预测的结果组合,划分成TP、TN、FP、FN四种情形,组成所有的分类结果。

afe892784398d3436917ec25397eba46.png
混淆矩阵

这个矩阵就是“混淆矩阵”,不知道有没有人跟我一样一出手就画成了下面的样子...(虽然说也不影响写公式...但是...写成这样感觉会被怼)

56f38f4e177d5982ca3d4cf1fa7f1410.png

四种情况包括:

  • TP:预测为1,样本为1,预测正确
  • FP:预测为1,样本为0,预测错误
  • FN:预测为0,样本为1,预测错误
  • TN:预测为0,样本为0,预测正确

言归正传,我们定义查准率(Precision)和查全率(Recall)分别为:

  • 所谓查准率就是:所有预测为正的样本里,真实正样本所占比重
  • 所谓查全率就是:所有真实的正样本里,预测为正的样本所占比重

这两个例子我们可以用实例来理解:医学模型判断癌症病人我们希望Recall高一点(无病诊断为有病去治疗总比漏掉癌症病人好(所有真实患病的人里,检测出患病)),而自己买西瓜的话希望甜瓜的Precision高一点(我们买到的是预测为1(甜瓜)的样本,希望有限的买瓜次数下甜瓜更多)。

二、PR曲线

上面的分析可以看到,不同情况下我们希望在查准和查全上有个权衡。为什么会有权衡呢?因为我们二分类器输出的是预测为正样本的概率,是个[0,1]范围内的数值。那我们可以选择不同的阈值(比如我们的模型预测癌症的概率是0.2, 但是我们为了保守起见,高于0.1就认为是预测的正例)。

理解了阈值的概念,就可以继续看PR曲线了。我们将纵轴设置为Precison,横轴设置成Recall,改变阈值就能获得一系列的pair并绘制出曲线。对于不同的模型在相同数据集上的预测效果,我们可以画出一系列的PR曲线。一般来说如果一个曲线完全“包围”另一个曲线,我们可以认为该模型的分类效果要好于对比模型。

d113ba8382c999f221ff2f72a9dcb310.png
图片来自:http://simtalk.cn/2016/04/15/%E6%A8%A1%E5%9E%8B%E7%9A%84%E8%AF%84%E4%BC%B0/

但是PR曲线判断模型好坏还是有点粗糙了,我们有更常用的F1值:

可以看到F1值就是P和R值的调和平均值的2倍。

上述

值只是在二分类中,我们可以轻易扩展到多分类中。多分类中我们可以使用OneVsRest的策略,判断第i类的分类时,把不属于第i类的看做另一类,就能对每一类都算出一个F值了。使用宏平均(Macro)或者微平均(Micro)来考量多分类的效果。宏平均是多个分类F1值相加,而微平均是多个F1分子分母分别相加。

在信息检索等任务中,我们可能关注最终的结果排序,而不是仅仅召回了。所以会有P@10或者P@5,代表我们考量的是排序前10位或者前5位的元素中的查准率,排在越靠前权重越高。

与P@10对应还有NDCG指标,这两个指标都是考虑排序的,这里就不作展开了。

三、ROC曲线

ROC曲线的全称是“受试者曲线”,与PR曲线类似。它相比PR曲线能够在样本不均衡的条件下给出更加合理的结果。先看一下ROC的纵轴和横轴:纵轴是TPR,横轴是FPR,对应的计算方式是:

可以看到TPR的定义是和Recall是一样的。TPR和FPR分别描述了在正负样本里(正样本=TP+FN,负样本=FP+TN),TP和FP样本所占的比例。与PR曲线一样,我们可以通过调整阈值,来改变TPR和FPR。下面举个例子(引用自 CSDN)

以下列数据举例: 
y_true = [0, 1, 0, 1],真实值 
y_score = [0.1, 0.35, 0.4, 0.8], 预测概率值 
分别取4组判定正例用的阈值:[0.1, 0.35, 0.4, 0.8],可得相应4组FPR,TPR: 
FPR: [1, 0.5, 0.5, 0] 
TPR: [1, 1, 0.5, 0.5] 
绘制ROC曲线图如下: 

18bd0f8ccae304e12289c89f93a08c31.png
图片源自:https://blog.csdn.net/XKira/article/details/70920269

可以看到ROC曲线一般是个阶梯形,我们的样本和采样点越多,阶梯效应就越不明显。当数据量足够大采样阈值足够多的时候,这条曲线就会平滑,如下图。

9f0da6e5feab779aba1b45c2d8179592.png
图片来源:https://codeday.me/bug/20180826/233698.html

模型的效果越好,整个ROC曲线越往左上角靠,与PR类似如果一个模型ROC曲线完全cover另一个,说明该模型优于另一模型。

四、AUC

4.1 概念

AUC一般指的是ROC曲线与横轴构成的面积(area-under-curve)

4.2 计算

给定数据集如何计算AUC呢,当然是在不调用sklearn的方式下,我所了解的有3种计算方式。

方法1、近似法

这个方法取自西瓜书,是最基础的做法:即我们计算ROC曲线下每个矩形的面积,如下图:

4962514fbca384af8e666d24970c0998.png

显然这是个近似的方法,因为我们会多算虚线处三角形面积的一半。并且我们需要改变阈值并绘制出所有的矩形,计算复杂,故这种方法不推荐。

方法2

这个方法也叫“曼 - 惠特尼法”,我们构造M*N个正负样本对。然后看看正例样本的predict值大于负例样本的情况,即

,计数为1. 如果predict概率相等则需要乘以0.5

8632fee586742edd123057724113163f.png

如上图,我们有4个样本,2正例2负例(M=2,N=2),模型分别输出不同的predict概率。然后我们像上图右侧一样构建正负样本对。所以按照方法2,我们计算出最终的auc为3/4.

方法3、排序

这种属于上面“曼 - 惠特尼法”的优化版本,通过排序避免了

时间的正负样本对构造。我们先看一下怎么算。将数据按照predict从小到大排列,然后得到一个rank。然后计算正样本所在的rank的总和(如下图,总和为2+4=6),然后要减去
. 这一个公式可以这样理解:我们取排在第i位的正样本,那它可以构成多少符合条件的
样本对呢?

a0c7ee082c711c5f298635b538b16fcd.png

构成样本对的思路可以这样想:第1正样本,如果它排在

的位置,那它前面一定有
个负样本;第2个正样本,它排在
的位置,那它前面一定有
个负样本(额外的-1是因为前面已经有个正样本了我们不做计算),以此类推我们可以得到递推公式,
我们发现这个式子和上面式子的分子是等价的。

abf1f99d21e372dcd20660ee00aedca3.png

这样一来,通过排序我们将算法复杂度从

降低到了
,并且经过上面的证明它们是等价的。

有关这个“曼 - 惠特尼法”更详细的信息可以参阅参考文献,或者自行搜索。

参考文献

让你彻底记住什么是ROC/AUC(看不懂你来找我)​www.jianshu.com
200cc451eb774bf1895b3287c48530e3.png
https://blog.csdn.net/qq_22238533/article/details/78666436​blog.csdn.net https://blog.csdn.net/XKira/article/details/70920269​blog.csdn.net https://codeday.me/bug/20180826/233698.html​codeday.me https://blog.csdn.net/AckClinkz/article/details/89397481​blog.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值