sklearn中精确率、召回率及F1值得micro,macro及weighted算法

news2024/9/20 15:39:34

为什么要用精确率和召回率
有这样一个训练集,1000个人参加了结直肠癌CRC的检测,实际有0.5%的人得了CRC(即5个人)。用神经网络算法得到检测这样一个训练集能达到99%的准确率。从数值上判断该算法是不错的,因为只有1%的误差。那么我们是否能应用该算法进行实际生产呢?这是不能的。因为如果误判一个人,对该人造成的影响是巨大的。如果不使用算法,直接预测这1000个人全没有得CRC,发现只有0.5的误差,比神经网络算法还好,这显然说明使用准确率在偏斜类样本集中判断算法好坏是不靠谱的。这时候,就需要使用精确率和召回率来判断了。
ps:偏斜类是指某类样品数量明显大于另一类样品
精确率和召回率
TP(True Positive): 实际为正类,预测为正类
TN(True Negative): 实际为正类,预测为负类
FP(False Positive): 实际为负类,预测为正类
FN(False Negative): 实际为正类,预测为负类
记忆 :T读成正确,F读成错误,P读成正类,F读成负类。例如,TP :正确的预测成正类,那么说明他实际也为正类
在这里插入图片描述
从混淆矩阵中得出对应的召回率和精确率在上例中代表的意思:
召回率(recall)为实际有CRC肿瘤的病人中,成功预测有CRC肿瘤的百分比,数值越大越好
精确率(precision)为预测的所有肿瘤病人中,实际上有肿瘤的病人,数值越大越好
这样,对于上面误差为1%的神经网络算法。TP∈ \in∈ [0,1,2,3,4,5] ,取最好的情况,假设5个病人全都预测出,即TP=5;因为1%的误差,则FP=10,FN=0,那么precision=5/(5+10)≈ \approx≈ 0.333…,说明该算法不好。
对于我们刚才那个总是预测病人没有CRC的方法,TP=0,召回率和精准率都是 0,直接排除。

F1值的由来
在这里插入图片描述
sklearn中P/R/F1的micro,macro及weighted的算法

from sklearn.metrics import precision_score, recall_score, f1_score, confusion_matrix

1.构建数据集

y_pred = [ 0, 0, 0,1, 1, 1, 1, 1,  2, 2, 2 ]
y_true = [ 0, 1, 0, 1, 1, 2, 2, 2, 1, 0, 2 ]

2.数据集的混淆矩阵

confusion_matrix(y_true, y_pred )
array([[2, 0, 1],
[1, 2, 1],
[0, 3, 1]])

3.数据集的详细报告

print(classification_report(y_true, y_pred))

在这里插入图片描述

4.报告中的micro avg:计算总体的TP, FN, FP

p1 = precision(5, 6)
r1 = recall(5, 6)
f1 = F1(p1, r1)
p1, r1, f1
(0.45454545454545453, 0.45454545454545453, 0.45454545454545453)
p1 = precision(5, 6)
r1 = recall(5, 6)
f1 = F1(p1, r1)
p1, r1, f1
(0.45454545454545453, 0.45454545454545453, 0.45454545454545453)

5.对应sklearn

precision_score(y_true, y_pred, average='micro')
recall_score(y_true, y_pred, average='micro')
f1_score(y_true, y_pred, average='micro')
0.45454545454545453

6.报告中的macro avg:各类的precision,recall,f1加和求平均

p0 = precision(2, 1)   # 0 类精确率,TP表示实际为0类预测也为0类,从混淆矩阵中得值为2;
                             # FP表示实际为别类但是却错误的预测成了0类,从混淆矩阵中得值为1。
p1 = precision(2, 3)
p2 = precision(1, 2)
avg_p = (p0 + p1 + p2) / 3
r0 = recall(2, 1)
r1 = recall(2, 2)
r2 = recall(1, 3)
avg_r = (r0 + r1 + r2) / 3
f0 = F1(p0, r0)
f1 = F1(p1, r1)
f2 = F1(p2, r2)
avg_f = (f0 + f1 + f2) / 3
avg_p, avg_r, avg_f
(0.4666666666666666, 0.47222222222222215, 0.46560846560846564)

7.报告中weighted avg :对每一类别的f1_score进行加权平均,权重为各类别数在y_true中所占比例

# y_true中 0类有3个,1类有4个,2类有4个
avg_p = 3/11 *p0 + 4/11*p1 + 4/11*p2
avg_r = 3/11*r0 + 4/11*r1 + 4/11* r2
avg_f = 3/11*f0 +4/11*f1 + 4/11*f2
avg_p, avg_r, avg_f
(0.4484848484848485, 0.4545454545454546, 0.44733044733044736)

8.precision_score,recall_score,f1_score中average='binary’的计算
只适用于二分类,用正类的y=1的TP,FP,FN来计算precision,recall,f1

y_pre = [ 0, 0, 0, 1, 1, 1, 1, 1 ]
y_tru = [ 0, 1, 0, 1, 1, 0, 0, 1 ]
precision_score(y_tru, y_pre, average='binary')
0.6
confusion_matrix(y_tru, y_pre)
array([[2, 2], [1, 3]])
precision(3, 2)
0.6

9.precision和recall的关系
在这里插入图片描述
转载链接: https://blog.csdn.net/qq_34964399/article/details/102723241

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

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

相关文章

springboot+disruptor再体验

Disruptor是一个高性能队列,常见的还有kafka、rabbitmq等,下面体验一下~ 1、Disruptor简介 Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的…

[C++]STL之string的模拟实现

上一章我们对string的常见接口及使用进行了讲解,接下来我们将对一些常见的接口,包括构造函数,析构函数,运算符重载等等进行模拟实现.方便我们理解string接口实现的原理. 在讲解之前先说一下string的成员变量. 首先是字符串内容_…

微信小程序picker组件遇到的问题以及解决办法

一、picker基本概念二、遇到的问题三、如何解决四、延伸五、效果图一、picker基本概念 先来看一下官方文档中picker的基本概念: 从底部弹起的滚动选择器,现支持三种选择器,通过mode来区分,分别是普通选择器,时间选择器…

Bochs下载安装

文章目录下载Bochs配置BochsBochs Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的…

【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中会遇到要将场景中的Text的字体全部替换的情况。 所以…

NetInside网络分析帮您解决系统性能问题(一)

前言 某大学信息中心负责人表示,有用户反馈,在通过VPN访问某一IP的80端口时连接时断时续。同时信息中心给到的信息是通过VPN:XXX.XXX.253.5访问IP地址XXX.XXX.130.200的80端口出现访问时断时续问题。 需要通过分析系统看一下实际情况&#…

云原生周刊 | 人类、机器人与 Kubernetes

近日 Grafana 官网发表了一篇博客介绍了 2022 年比较有意思、脑洞大开的一些 Grafana 使用案例,比如监控特斯拉 Model 3 的充电状态、OTA 更新状况等等。 海事技术供应商 Royal IHC 利用 Grafana 展示客户船队的关键性能指标,例如燃料消耗、服务时间、大…

Allegro174版本新功能介绍之打开坐标超链接功能

Allegro174版本新功能介绍之打开坐标超链接功能 Allegro在升级到174的时候默认打开时,报表中的坐标是不带超链接的,如下图 直接点击坐标,是无法自动跳转到坐标所在位置的 但是Allegro174是开放了打开超链接的功能的,具体操作如下 选择Setup选择User Preferences

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第一篇】(持续更新中)

【 Vue3 Vite setup语法糖 Pinia VueRouter Element Plus 第一篇】(持续更新中) 1.使用 Vite脚手架创建 Vue3 项目 终端输入命令 npm create vite 项目名选择 Vue项目并回车根据自己的爱好,选择配置即可 2. 开启 Network 访问地址 npm run dev后 提示 use -…

磨金石教育||商业插画的发展现状如何?学习插画可以月入过万吗?

商业插画是什么?现如今,商业插画已经在生活中随处可见。你买的所有带包装的产品,上面的各种有趣的产品插图,就是插画师做的产品插画。特别是一些零食类的产品,在包装箱上,我们常可以看到各种大眼睛拟人化的…

电脑出现0xc00000e9错误代码的解决方法

每当假期结束回来,经常发现Windows系统的电脑一段时间不开机,开机就出现0xc00000e9的错误代码。为什么明明没有任何操作却出现错误呢?驱动人生带大家一文了解。 出现0xc00000e9错误代码的原因 先来了解一下电脑出现0xc00000e9错误代码的主要…

数字孪生架构

很多同学对数字孪生特别感兴趣,经常有同学问我:数据孪生系统怎么做?有没有教程?除了Unity开发,开发数字孪生还需要掌握什么技能?有人介绍了一个数字孪生的外包,从来没做过,能不能接&…

Spring 中常用的几个工具类

AnnotatedElementUtils 类 获取某个类的某个方法上是否有标注注解,并可以通过其他 API 获取到这个类注解上的属性值,该工具类其他 API 下面截图可以查看。 public static boolean isBeanAnnotated(Method method) {return AnnotatedElementUtils.hasAn…

Redis 应用问题解决

缓存穿透 key 对应的数据在数据源并不存在,每次针对此key的请求从缓存中获取不到,请求会都压到数据源,从而可能压垮数据源。 解决方案 一个一定不存在的缓存及查询不到的数据,由于缓存是不命中时被动写的,并且处于容…

docker 19.03构建跨平台的镜像包并推送到私有仓库

默认的docker构建image镜像是不能跨平台的,如果需要构建跨平台的镜像,需要docker的版本在19.03版本以上,并开启buildx。以下为具体的步骤 版本:docker 19.03。 一.安装/开启 buildx 1.1.手动开启dockerx开关 docker 19.3 暂默认不开启dockerx,需要手动开启 vim /etc/pro…

Scala 数据结构-集合

文章目录Scala 数据结构-集合一、集合简介1、不可变集合继承图2、可变集合继承图二、数组1、不可变数组(1) 创建数组(2) 访问数组(3) 遍历数组(4) 添加元素Scala 数据结构-集合 一、集合简介 1)Scala的集合有三大类:序列seq,集合Set&#x…

解决fstab丢失,重启系统变为只读模式

现象描述: 背景:openEuler20.03 在/etc/fstab文件丢失、重启系统后,系统变为只读模式 [rootlocalhost ~]# echo 111 > 1.txt -bash: 1.txt: Read-only file system 解决方法: 查看系统信息,确认挂载信息&#…

【C进阶】数据在内存中的存储

数据在内存中的存储前言一、数据类型介绍(一)基本概念(二)类型的基本归类1.整型家族2.浮点型家族3.构造类型4.指针类型5.空类型二、整形在内存中的存储(一)原码、反码、补码1.概念2.为什么内存中存的是补码…

android input 事件分发 --- 注册input

android input 事件分发 --- 注册input应用注册input事件应用注册input事件 应用如果要监听input的事件,那么肯定就存在一个注册监听input事件的过程,跟随着addView方法我们跟着走一下frameworks/base/core/java/android/view/WindowManagerImpl.java Ov…

Centos7 安装 MongoDB

使用docker安装Mongo 1、拉取镜像 注:需要科学上网 docker pull mongo [rootlocalhost ~]# docker pull mongo Using default tag: latest latest: Pulling from library/mongo 846c0b181fff: Pull complete ef773e84b43a: Pull complete 2bfad1efb664: Pull co…