基于sklearn计算precision、recall等分类指标

文章目录

  • 一、分类指标函数
    • 1.1 precision_score函数
    • 1.2 recall_score函数
    • 1.3 accuracy_score函数
    • 1.4 f1_score函数
    • 1.5 precision_recall_curve函数
    • 1.6 roc_curve函数
    • 1.7 roc_auc_score函数
    • 1.8 classification_report函数
  • 二、二分类任务
  • 三、多分类任务
    • 3.1 Macro Average(宏平均)
    • 3.2 Micro Average(微平均)
    • 3.3 宏平均 vs. 微平均

在前面的文章中,我们已经介绍了分类指标Precision,Recall,F1-Score的定义和计算公式:详解分类指标Precision,Recall,F1-Score

我们可以知道,精度(precision)、查全率(recall)、F1的计算,是针对于二分类器来定义的。他们的计算,只与y_true和y_pred有关,要求y_true和y_pred中只含有0和1两个类别。

我们在实际计算上述二分类任务的评价指标时,可以直接调用sklearn中的函数库实现。

一、分类指标函数

1.1 precision_score函数

  • precision_score函数用于计算分类结果的查准率。
    – 官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html
    – 函数定义:
sklearn.metrics.precision_score(y_true, y_pred, labels=None, pos_label=1, average='binary', sample_weight=None)        

1.2 recall_score函数

  • recall_score函数用于计算分类结果的查全率。
    – 官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html#sklearn.metrics.recall_score
    – 函数定义:
sklearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1, 
average='binary', sample_weight=None)     

1.3 accuracy_score函数

accuracy_score函数用于计算分类结果的准确率。

sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)

1.4 f1_score函数

f1_score函数用于计算分类结果的值。

sklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, 
average='binary', sample_weight=None)

1.5 precision_recall_curve函数

precision_recall_curve函数用于计算分类结果的P-R曲线。

sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_label=None,
sample_weight=None)

1.6 roc_curve函数

roc_curve函数用于计算分类结果的ROC曲线。其原型为:

sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None,
drop_intermediate=True)

1.7 roc_auc_score函数

oc_auc_score函数用于计算分类结果的ROC曲线的面积AUC。

sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None)

1.8 classification_report函数

sklearn中的classification_report函数用于显示主要分类指标的文本报告,在报告中显示每个类的精确度,召回率,F1值等信息。

sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2)

二、二分类任务

对二分类模型来说,可以直接调用 sklearn.metrics 中的 precision_score, recall_score 和 f1_score 来进行计算,将函数中的 average 参数设置为binary (average='binary') 即可。

应用示例:

from sklearn.metrics import precision_score, recall_score, f1_score, classification_reporty_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 0, 0, 0]precision = precision_score(y_true, y_pred, average='binary')
print('precision:', precision)recall = recall_score(y_true, y_pred, average='binary')
print('recall:', recall)f1_score = f1_score(y_true, y_pred, average='binary')
print('f1_score:', f1_score)

输出结果如下:

precision: 0.714285714286
recall: 0.833333333333
f1_score: 0.769230769231

我们还可以使用 classification_report 函数来查看每一类的分类情况:

target_names = ['class 0', 'class 1']
cla_report = classification_report(y_true, y_pred, target_names=target_names)
print('cla_report:', cla_report)

输出结果如下:

             precision    recall  f1-score   supportclass 0       0.67      0.50      0.57         4class 1       0.71      0.83      0.77         6avg / total       0.70      0.70      0.69        10

三、多分类任务

前面提到,传统的精度(precision)、查全率(recall)、F1的计算公式,只适用于二分类模型。

对多分类模型来说,要用Macro Average(宏平均)或Micro Average(微平均)规则来进行F1(或者P、R)的计算。

3.1 Macro Average(宏平均)

宏平均(Macro-averaging),是先对每一个类统计指标值,然后在对所有类求算术平均值。

Macro Average(宏平均)会首先针对每个类计算评估指标,如查准率Precesion,查全率 Recall , F1 Score。然后对他们取平均得到Macro Precesion, Macro Recall, Macro F1。具体计算方式如下:

在这里插入图片描述

举例来说,假设是三个类别的分类模型:

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

Macro Average F1的计算过程如下:

(1)将第1个类别设置为True(1),非第1个类别的设置为False(0),计算P1, R1。

y_true=[1,0,0]
y_pred=[1,1,0]
P1 = (预测为1且正确预测的样本数)/(所有预测为1的样本数) = TP/(TP+FP) = 1/(1+1)=0.5
R1 = (预测为1且正确预测的样本数)/(所有真实情况为1的样本数) = TP/(TP+FN)= 1/1 = 1.0
F1_1 = 2*(PrecisionRecall)/(Precision+Recall)=20.5*1.0/(0.5+1.0)=0.6666667

(2)将第2个类别设置为True(1),非第2个类别的设置为False(0),计算P2, R2。

y_true=[0,1,0]
y_pred=[0,0,0]
P2 = (预测为1且正确预测的样本数)/(所有预测为1的样本数) = TP/(TP+FP) =0.0
R2 = (预测为1且正确预测的样本数)/(所有真实情况为1的样本数) = TP/(TP+FN)= 0.0
F1_2 = 2*(Precision*Recall)/(Precision+Recall)=0

(3)将第3个类别设置为True(1),非第3个类别的设置为False(0),计算其P3, R3。

y_true=[0,0,1]
y_pred=[0,0,1]
P3 = (预测为1且正确预测的样本数)/(所有预测为1的样本数) = TP/(TP+FP) = 1/1=1.0
R3 = (预测为1且正确预测的样本数)/(所有真实情况为1的样本数) = TP/(TP+FN)= 1/1 = 1.0
F1_3 = 2*(PrecisionRecall)/(Precision+Recall)=21.0*1.0/(1.0+1.0)=1.0

(4)对P1、P2、P3取平均为P,对R1、R2、R3取平均为R,对F1_1、F1_2、F1_3取平均F1。

P=(P1+P2+P3)/3=(0.5+0.0+1.0)/3=0.5
R=(R1+R2+R3)/3=(1.0+0.0+1.0)/3=0.6666666
F1 = (0.6666667+0.0+1.0)/3=0.5556

最后这个取平均后的得到的P值/R值,就是Macro规则下的P值/R值。对这个3类别模型来说,它的F1就是0.5556。

【基于sklearn 实现 Macro Average】:

下面给出基于sklearn计算Macro Average(宏平均)的样例,将函数中的 average 参数设置为macro (average='macro') 即可。

from sklearn.metrics import precision_score, recall_score, f1_scorey_true = [1, 2, 3]
y_pred = [1, 1, 3]precision = precision_score(y_true, y_pred, average='macro')
print('precision:', precision)recall = recall_score(y_true, y_pred, average='macro')
print('recall:', recall)f1_score = f1_score(y_true, y_pred, average='macro')
print('f1_score:', f1_score)

输出结果如下:

precision: 0.5
recall: 0.666666666667
f1_score: 0.555555555556

3.2 Micro Average(微平均)

Micro Average(微平均)会考虑到所有类别的贡献,将所有类别的预测结果合并在一起,然后计算整体的性能指标。

Micro-average = (TP + FP) / (TP + TN + FP + FN)

分母就是输入分类器的预测样本个数,分子就是预测正确的样本个数(无论类别)。

对于Micro F1而言,Micro F1 = Micro Recall = Micro Precesion = Accuracy

【基于sklearn 实现 Micro Average】:

下面给出基于sklearn计算Micro Average(微平均)的样例,将函数中的 average 参数设置为micro (average='micro') 即可。

from sklearn.metrics import precision_score, recall_score, f1_scorey_true = [1, 2, 3]
y_pred = [1, 1, 3]precision = precision_score(y_true, y_pred, average='micro')
print('precision:', precision)recall = recall_score(y_true, y_pred, average='micro')
print('recall:', recall)f1_score = f1_score(y_true, y_pred, average='micro')
print('f1_score:', f1_score)

输出结果如下:

precision: 0.666666666667
recall: 0.666666666667
f1_score: 0.666666666667

3.3 宏平均 vs. 微平均

  • Macro平均:对每个类别的性能指标分别计算平均值,然后再对这些平均值求平均。
    – 在Macro平均中,对于每个类别,分别计算查准率、查全率和F1分数,并对这些指标进行简单平均。
    – Macro平均给予每个类别相同的权重,不考虑样本数量的差异,因此能够平等对待每个类别。
    – Macro平均更适用于每个类别的性能对整体性能均等重要的情况。

  • Micro平均:将所有类别的预测结果合并在一起,然后计算整体的性能指标。
    – 在Micro平均中,所有类别的真正例、假正例和假负例的数量总和用于计算查准率、查全率和F1分数。
    – Micro平均给予每个样本相同的权重,无论其属于哪个类别,因此对于样本数量不均衡的问题,Micro平均会偏向于样本数量多的类别。
    – Micro平均更适用于在不同类别上有明显不均衡样本分布的情况,且更关注整体性能而不是每个类别的个别性能。

总结来说:Macro平均是对每个类别的结果进行独立计算,并对各个类别的结果进行平均,适用于每个类别的性能对整体性能均等重要的情况。而Micro平均是将所有类别的结果合并成一个总体进行计算,适用于样本数量不均衡或关注整体性能的情况。而选择使用哪种平均方法取决于具体的问题和需求。

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

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

相关文章

怎样原生制作lis的CentOS容器镜像

本文介绍从一个空白的裸机CentOS自己构造检验允许的docker环境。来达到运行环境的高度定制,而不是只能依赖VS或者微软或者数据库厂商提供的镜像当做基础制作。更容易理解基础原理。最终输出产物为lisnew.tar,一个开箱即用的lis运行环境。 制作的整个过程…

os.environ[“CUDA_VISIBLE_DEVICES“]学习总结

今天发现一个很有意思的东西 import torch import os # Specify the GPU device os.environ["CUDA_VISIBLE_DEVICES"] "1" print(torch.cuda.is_available())但是如果修改下面的设置后,结果就变成了 import torch import os # Specify the…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能,返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Rust之泛型、特性和生命期(四):验证有生存期的引用

开发环境 Windows 10Rust 1.71.0 VS Code 1.80.1 项目工程 这里继续沿用上次工程rust-demo 验证具有生存期的引用 生存期是我们已经在使用的另一种泛型。生存期不是确保一个类型具有我们想要的行为,而是确保引用在我们需要时有效。 我们在第4章“引用和借用”一…

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置: 启动本地设备和添加监听器: 搜寻远程设备: 发送订阅COV报…

python try/except/finally

稍微总结一下&#xff0c;否则总是忘。 x abc def fetcher(obj, index): return obj[index] fetcher(x, 4) 输出&#xff1a; File "test.py", line 6, in <module> fetcher(x, 4) File "test.py", line 4, in fetcher return obj[index] …

zookeeper的应用

Zookeeper的配置文件解析: Zookeeper内部原理: 选举机制 半数机制:在集群环境中半数以上的机器存活,这个集群可用,所以在设计Zookeeper集群系统时&#xff0c;通常会选择 奇数台服务器来搭建Zookeeper的集群 虽然在配置文件中并没有指定Master和Slave。但是&#xff0c;Zookeep…

第三十二章:MySQL事务日志

第三十二章&#xff1a;MySQL事务日志 32.1&#xff1a;概述 事物有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事物的隔离性有锁机制实现。而事物的原子性、一致性和持久性由事物的redo日志和undo日志来…

Redis入门基础命令

文章目录 一、redis1.1 redis概述1.2 redis安装 二、string2.1 基础命令2.2 存储结构2.3 应用 三、list3.1 基础命令3.2 应用 四、hash4.1 基础命令4.2 存储结构4.3 应用 五、set5.1 基础命令5.2 存储结构5.3 应用 六、zset6.1 基础命令6.2 存储结构6.3 应用 一、redis 1.1 re…

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

Java中的队列

队列的理解 队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作。 LinkedList类实现了Queue接口&#xff0c;因此我们可以把LinkedList当成Queue来用。 常用方法 实例 import java.util…

Stable Diffusion服务环境搭建(远程服务版)

Stable Diffusion服务环境搭建&#xff08;远程服务版&#xff09; Stable Diffusion是什么 Stable diffusion是一个基于Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&#xff09;的文图生成&#xff08;text-to-image&#xff09;模型。具体来说&#…

C# IO FileStream流(一)使用整理

一、C# IO 文件流&#xff0c;常用操作整理 来自其他开发者的整理&#xff1a; 文件操作常用相关类 1)Directory //操作目录&#xff08;文件夹&#xff09;&#xff0c;静态类。2)Path//静态类&#xff0c;对文件或目录的路径进行操作&#xff08;很方便&#xff09;【字符…

[深度学习实战]基于PyTorch的深度学习实战(中)[线性回归、numpy矩阵的保存、模型的保存和导入、卷积层、池化层]

目录 一、前言二、线性回归2.1 训练代码2.2 绘图部分代码2.3 numpy 数组的保存和导入代码2.4 完整代码 三、numpy矩阵的保存四、模型的保存和导入4.1 保存模型4.2 导入模型 五、卷积层5.1 Conv2d5.1.1 函数定义5.1.2 参数说明5.1.3 测试代码5.1.4 最终结果 5.2 Conv1d5.2.1 函数…

element ui 上传控件携带参数到后端

1.携带固定参数&#xff1a; 2.携带不固定参数&#xff1a; <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…

ShardingSphere分库分表实战之MySQL主从集群搭建

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

Java并发编程学习笔记(一)线程的入门与创建

一、进程与线程 认识 程序由指令和数据组成&#xff0c;简单来说&#xff0c;进程可以视为程序的一个实例 大部分程序可以同时运行多个实例进程&#xff0c;例如记事本、画图、浏览器等少部分程序只能同时运行一个实例进程&#xff0c;例如QQ音乐、网易云音乐等 一个进程可以…

【C++进阶之路】适配器、反向迭代器、仿函数

文章目录 前言一、适配器①模拟实现栈②模拟实现对列 二、反向迭代器三、仿函数总结 前言 我们先来笼统的介绍一下今天的三个内容。 适配器——简单的理解就是复用&#xff0c;用已经实现的轮子&#xff0c;来继续实现某种功能。 反向迭代器——原理很简单&#xff0c;就是对…

摄影测量-共线方程、共面方程

1、共线方程 在摄影测量中&#xff0c;绝大多数的结算方法都是基于共线条件方程式的&#xff0c;如单片空间后方交会解法、像对空间前方交会解法、光束法区域网评查以及直接线性变换等。 2、共面方程 描述像片对内摄影基线以及同名光线位于同一平面的一种条件方程。在摄影测量…

分表后mybatis-plus删除操作失效等问题处理

因为重构dao层&#xff0c;问题太多了&#xff0c;于是想着另起一个章节。 4 count的问题 使用count复用&#xff0c;不需要查询所有字段&#xff0c;否则会出现下面的错误 ### SQL: SELECT COUNT( t.id,t.company_id,t.user_id,t.bind_time,t.role_type,t.job_type,t.studen…