闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码。在 python 环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy包。事实证明,实践是检验真理的唯一标准,在手写代码的过程中,才能真正体会到这两个评判标准的一些小细节,代码记录如下。

一、模拟一个预测结果

因为两个曲线都是用来判断一个分类器分类性能的,所以这里直接用随机数生成一组类别和对应的置信度。类别有0、1两个类别。置信度从0到1随机生成。

data_len = 50

label = np.random.randint(0, 2, size=data_len)

score = np.random.choice(np.arange(0.1, 1, 0.01), data_len)

复制代码

生成结果如下:其中第一行代表真实的类别,第二行代表分类器判断目标是类别1的置信度。

label

1

0

1

0

0

1

1

……

score

0.22

0.31

0.92

0.34

0.37

0.18

0.51

……

因为我们的置信度是随机生成的,所以得到的结果等同于一个二分类器“瞎猜”的结果。

二、PR曲线

不管是PR曲线还是ROC曲线,首先要选定一个类别,然后针对这个类别具体计算。

该曲线的横坐标是召回率(R),纵坐标是精确度(P),故命名为PR曲线。 举一个简单的例子来说明P和R的定义:假设一个二分类器需要预测100个样本,这些样本中有80个类别1,20个类别0。当把置信度取某一个值S时,假设此时分类器认为有60个样本是类别1,在预测的这60个人样本中,有50个样本预测正确,其余10个样本预测错误。那么,对于类别1的P、R值计算如下:

即有0.667的概率预测正确,对于80个类别1的样本,分类器好比可以召唤神兽的魔法师,养了80只神兽,只召唤回来50只。所以召回率就是62.5%,其他的就被无情丢弃了。

对于类别0来说,既然二分类器认为类别1的有60个,那么反过来其余40个都认为是类别0,通过上述可以推出这40个只有10个是类别0,其余的是类别1,所以对于类别0的P、R值计算如下:

根据以上说明代码实现如下:

def PR_curve(y,pred):

pos = np.sum(y == 1)

neg = np.sum(y == 0)

pred_sort = np.sort(pred)[::-1] # 从大到小排序

index = np.argsort(pred)[::-1] # 从大到小排序

y_sort = y[index]

print(y_sort)

Pre = []

Rec = []

for i, item in enumerate(pred_sort):

if i == 0:#因为计算precision的时候分母要用到i,当i为0时会出错,所以单独列出

Pre.append(1)

Rec.append(0)

else:

Pre.append(np.sum((y_sort[:i] == 1)) /i)

Rec.append(np.sum((y_sort[:i] == 1)) / pos)

print(Pre)

print(Rec)

## 画图

plt.plot(Rec, Pre, 'k')

# plt.legend(loc='lower right')

plt.title('Receiver Operating Characteristic')

plt.plot([(0, 0), (1, 1)], 'r--')

plt.xlim([-0.01, 1.01])

plt.ylim([-0.01, 01.01])

plt.ylabel('Precision')

plt.xlabel('Recall')

plt.show()

复制代码

画出的PR曲线:

这里有个疑惑:在西瓜书里,PR曲线是过(1,0),(0,1)两个点的曲线,但是(1,0)这个点总觉得不太可能,是我对PR曲线的理解有问题?

三、ROC曲线

ROC曲线的纵坐标是TPR,横坐标是FPR(中文翻译太乱了,我还是习惯用英文表示)。TPR等同于PR曲线的召回率,FPR是所有被预测成正例的反例和真实反例的个数之比。

还是以上那个例子,对于·类别1,两者的计算如下:

def ROC_curve(y,pred):

pos = np.sum(y == 1)

neg = np.sum(y == 0)

pred_sort = np.sort(pred)[::-1] #从大到小排序

index = np.argsort(pred)[::-1]#从大到小排序

y_sort = y[index]

print(y_sort)

tpr = []

fpr = []

thr = []

for i,item in enumerate(pred_sort):

tpr.append(np.sum((y_sort[:i] == 1)) / pos)

fpr.append(np.sum((y_sort[:i] == 0)) / neg)

thr.append(item)

print(fpr)

print(tpr)

print(thr)

#画图

plt.plot(fpr, tpr, 'k')

plt.title('Receiver Operating Characteristic')

plt.plot([(0,0),(1,1)],'r--')

plt.xlim([-0.01,1.01])

plt.ylim([-0.01,01.01])

plt.ylabel('True Positive Rate')

plt.xlabel('False Positive Rate')

plt.show()

复制代码

结果如下:

可以看到,随机瞎猜的分类器得到的ROC曲线在y=x这条直线周围抖动。

如果我们把随机生成的置信度只保留小数点后一位,那么数据里有很多相同置信度的值。这种方式每次计算出来的ROC曲线会稍微有些差异,取决于排序的结果。

python画pr曲线代码_利用Python中的numpy包实现PR曲线和ROC曲线的计算相关推荐

  1. 手机用python画太阳花的代码_利用python绘制太阳花(蓝桥杯试题)

    识别出图形中的基本形状,以基本形状为单位绘制出最终图形.绘制所示图形,中间是半径为120的圆, 四周是边长为80的12个菱形. 使用turtle绘制如图中所示的图形. 1) 背景为白色,中间圆为红色轮 ...

  2. python画一颗心_利用python画一颗心的方法示例

    前言 Python一般使用Matplotlib制作统计图形,用它自己的说法是'让简单的事情简单,让复杂的事情变得可能'.用它可以制作折线图,直方图,条形图,散点图,饼图,谱图等等你能想到的和想不到的统 ...

  3. 用python画动态皮卡丘_利用Python绘制萌萌哒的皮卡丘

    开发工具 Python版本:3.6.4 相关模块: turtle模块. 环境搭建 安装Python并添加到环境变量即可. 在cmd窗口运行"pikachu.py"文件即可. 效果如 ...

  4. python 打卡记录代码_利用Python实现对考勤打卡数据处理的总结

    利用Python实现对考勤打卡数据处理的总结 一.背景交代 二.说明 三. 8种方法 1. 查看文件是否存在 2. 导入excel文件,并把数据保存为dataframe格式 3. 计算程序运行时间 4 ...

  5. 用python画小猪佩奇代码_用python画个小猪佩奇(turtle示例源码)

    [实例简介]来副小猪佩奇,用python画个小猪佩奇 [实例截图] [核心代码]# coding:utf-8 import turtle as t def nose(x,y):#鼻子 t.pu() t ...

  6. 用python画小猪佩奇代码_用Python画小猪佩奇

    猪年农历春节前,朋友圈被一则走心的广告刷屏了.很多伙伴直呼:看哭了.当爷爷电话里听到儿子说「不回来啊」的打击是很沉重的,这位父亲想念自己的儿子和孙子,总想把最好的给他们. 如果你的孩子问你要佩奇,你除 ...

  7. 用python画苹果的代码_使用python画个小猪佩奇的示例代码

    基本原理 选好画板大小,设置好画笔颜色.粗细,定位好位置,依次画鼻子.头.耳朵.眼睛.腮.嘴.身体.手脚.尾巴,完事儿. 都知道,Turtle 是 Python 内置的一个比较有趣味的模块,俗称&qu ...

  8. 用python画星空的代码_用python画星空源代码是什么?_后端开发

    用python画星空源代码是什么? 用python画星空源代码是 from turtle import * from random import random,randint screen = Scr ...

  9. 用python画国旗的程序_利用python画国旗(示例)

    概述 昨天在网上看到有人利用turtle模块画出了五角星,觉得很好玩.晚上睡觉前想,这样的话其实可以画国旗啊.于是编写了下面的代码.可是!我并没有准确的设计方法,所以不敢擅自画国旗啊.如果谁有标准的设 ...

最新文章

  1. 实验三_166_张珍珍
  2. wxWidgets:wxFTP类用法
  3. sql server 隔离级别
  4. 用OpenMP加速你的程序[转]
  5. 新兴的多媒体格式——MXF 文件格式分析 和简介
  6. Android 使用gradle版本冲突
  7. 如何设计好分布式数据库,这个策略很重要
  8. c语言中尖括号的作用,C语言中,#include
  9. VScode中SVN插件详细配置【官网】
  10. :root选择器的妙用【2021.11.14】
  11. 平面的几种的方程表示
  12. Pikachu靶场暴力破解关卡3
  13. 电商系统购物车设计思路
  14. 公职人员财产公开_知道您的财产:Web设计人员/开发人员的薪资指南[比较]
  15. 对抗攻击经典论文——FGSM学习笔记 EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
  16. mysql数据库被勒索删库怎么办
  17. 2011年系统架构师考试题详解
  18. c语言中的二目运算符,C语言中的三目运算符是什么
  19. 工程管理系统源码-专注项目数字化管理
  20. 电表检测部署应用:手把手教你把PPOCRLabel改成想要的模样

热门文章

  1. Endnote基础——分章节插入文献
  2. Emmet插件的常用语法
  3. web 苹果手机 与 正则问题
  4. 参考爆料英特尔i5 10400f配什么主板?深度爆料评测
  5. python enumerate class_枚举对象enumerate
  6. 名编辑电子杂志大师教程 | 如何在电子宣传册中添加视频按钮
  7. (转)左手坐标系和右手坐标系
  8. 表访问方式----全表扫描(Full Table Scans, FTS)
  9. 小米开机动画android,华为nova 5官方图赏 小米CC开机动画首曝光
  10. 计算机二级无法交费,二级计算机啥时候交费截止