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

news2024/11/28 22:53:10

文章目录

  • 一、分类指标函数
    • 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_report

y_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   support

    class 0       0.67      0.50      0.57         4
    class 1       0.71      0.83      0.77         6

avg / 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_score

y_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_score

y_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.coloradmin.cn/o/779686.html

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

相关文章

什么是SQL和NoSQL?

目录 认识NoSQL 关系型数据库 非关系型数据库 关系型数据库与非关系型数据库之间的对比 认识NoSQL SQL(Structured Query Language)是一种用于管理关系型数据库的语言。关系型数据库以表格的形式存储数据,表格由行和列组成。SQL语言提供了…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项: 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

uniapp开发app获取当前位置的经纬度

查阅了大量的帖子,发现基本上都不能用,后来发现需要配置一下manifest.json才可以,话不多说上代码 真机运行打印出来的经纬度: 一、配置文件 检查一下manifest.json有没有下面的代码,没有的话就加上 { "permiss…

力扣算法 704 35 34 69 367二分查找

704.二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 二分查找法 class Solution { public:int search(vecto…

Centos安装GitLab教程

相关网站 官网安装文档可以按照官方文档去安装,但安装过程中可能会出错。所以最好按照本文章的流程去安装,我是边安装边写的文章。 准备工作 在vmware上安装centos,这里要注意下,gitlab比较占用内存,因此要分配至少…

vue 3.0 下载本地pdf文件

使用a标签,把pdf文件放到public文件夹下面 <el-form label-width"160px"> <el-form-item label"使用手册"> <div class"form-item-static"> <a href"/使用手册.pdf" target"_blank" class"link&q…

轻量级Firefox Send替代方案Gokapi

想不到一个域名的变动会影响这么大&#xff0c;访问量出现断崖式下跌。由此可见&#xff0c;平时的访问应该只是一些 RSS 的访问而已。 上面是 Pageviews&#xff0c;下面是 Uniques 今天略有回升 难怪那些大公司要花钱买域名了&#xff0c;不过老苏是个佛系的人&#xff0c;一…

【pom.xml文件】maven中scope标签和optional标签

文章目录 前言一. scope的类型总览二. 详解1.compile&#xff08;默认选项&#xff09;2. test3. runtime4.privided5. system6. import 三.optional 前言 一. scope的类型总览 设置依赖范围 可以对引入的资源进行设置&#xff0c;设置其生效的范围。生效范围主要有以下&#…

mac如何提取视频中的音频?

mac如何提取视频中的音频&#xff1f;我们经常在平时工作的时候&#xff0c;需要将一个视频里面的音频单独提取出来另做他用&#xff0c;例如很多视频自媒体博主就经常使用这种方法来储备音频素材&#xff0c;这个操作在Windows上面比较容易实现&#xff0c;毕竟有相当多的软件…

RT-Thread qemu mps2-an385 bsp 移植制作 :系统运行篇

前言 前面已经让 RT-Thread 进入了 entry 入口函数&#xff0c;并且 调整 链接脚本&#xff0c;自动初始化与 MSH shell 的符号已经预留&#xff0c; 进入了 RT-Thread 的初始化流程 接下来&#xff1a;从 内存管理、系统tick 定时器、适配串口 uart 驱动三个模块入手&#xf…

Vue-组件高级(下)

一、目标 能够知道如何使用ref引用DOM和组件实例能够知道$nextTick的调用时机能够说出keep-alive元素的作用能够掌握插槽的基本用法能够知道如何自定义指令 二、目录 ref引用动态组件插槽自定义指令Table案例 ref引用 1.什么是ref引用 ref用来辅助开发者在不依赖于jQuery的…

基于Android的自助导游系统的设计与实现(论文+源码)_kaic

摘 要 随着人们的生活水平的提高&#xff0c;外出旅游已经成为人们放松休闲的主要活动之 一。传统的旅游方式都是团队组织&#xff0c;这在很大程度上制约了游客游玩的自主性。 本文充分利用无线互联网技术的优点&#xff0c;以智能手机作为移动终端&#xff0c;设计一款自助 …

react实现路由跳转动画

下载插件 npm i react-transition-group 配置路由 import { createBrowserRouter as ReactRouter,Navigate } from "react-router-dom";import App from ../App.js import Login from "../view/login.js"; import Home from "../home.js"; co…

Django笔记之in查询及date日期相关过滤操作

这一篇介绍关于范围&#xff0c;日期的筛选 inrangedateyearweekweekdayquarterhour 1、in in 对应于 MySQL 中的 in 操作&#xff0c;可以接受数组、元组等类型数据作为参数&#xff1a; Blog.objects.filter(id__in[1,2,3])对应的 SQL 是&#xff1a; select * from blo…

Linux Shell 脚本编程学习之【第4章 awk命令最详细(第二部分)】

第4章 awk命令最详细 &#xff08;第二部分&#xff09; 1 awk编程1.1 awk模式匹配 2 awk编程示例2.1 第一种调用方式2.2 第二种调用方式2.3 第三种调用方式2.4 记录和域2.5 变量运算2.6 改变分隔符 3 关系和布尔运算符3.1 匹配正则表达式~符号 1 awk编程 awk 是一种编程语言&…

【C++11】智能指针的定义 和 种类 及 使用

智能指针 定义 为什么需要智能指针 在C中&#xff0c;动态分配内存是一项常见的任务&#xff0c;但手动管理分配和释放内存可能会导致很多问题&#xff0c;如内存泄漏、悬垂指针以及多次释放同一块内存等。为了避免这些问题&#xff0c;引入了智能指针的概念&#xff0c;它们…

MySQL主从复制原理及配置

目录 一、MySQL主从复制原理 1、什么是主从复制 2、主从复制原理 二、主从复制配置 1、主服务器数据库配置 &#xff08;1&#xff09;设置server-id值并开启binlog参数&#xff0c;启用二进制日志功能后&#xff0c;重启数据库。 &#xff08;2&#xff09;建立同步账号&a…

LabVIEW基础-lvlib库

文章目录 lvlib库llb库lvlib与llb的区别lvlib常见错误断开vi与库之间的连接 lvlib库 文件-新建-库&#xff0c;创建一个项目库文件。能在项目中创建的文件类型&#xff0c;都可以在库中创建。 在lvlib上右键-添加-文件&#xff0c;将被选中的文件放到lvlib中。被添加进lvlib的…

【PostgreSQL内核学习(八)—— 查询执行(查询执行策略)】

查询执行 查询执行概述查询执行策略可优化语句和数据定义语句四种执行策略策略选择实现Portal执行的过程 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的…

大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…