python实现计算精度、召回率和F1值

article/2025/11/7 5:10:00

python实现计算精度、召回率和F1值

  摘要:在深度学习的分类任务中,对模型的评估或测试时需要计算其在验证集或测试集上的预测精度(prediction/accuracy)、召回率(recall)和F1值。本文首先简要介绍如何计算精度、召回率和F1值,其次给出python编写的模块,可直接将该模块导入在自己的项目中,最后给出这个模块的实际使用效果。

一、混淆矩阵及P、R、F1计算原理

1、混淆矩阵

  在进行二分类或多分类任务中,对于预测的评估经常需要构建一个混淆矩阵来表示测试集预测类与实际类的对应关系,混淆矩阵横坐标表示实际的类,纵坐标表示预测的类。混淆矩阵属于 n × n n\times n n×n 方阵,其中 n n n 表示类的个数。矩阵可用下面表示:
c o n f m a r t i x ( t r u e L a b e l , p r e d i c t L a b e l ) confmartix(trueLabel,predictLabel) confmartix(trueLabel,predictLabel)

因此该矩阵的某一个元素 c o n f m a r t i x ( i , j ) confmartix(i,j) confmartix(i,j) 表示实际类 i i i 被预测成 j j j 的样本个数。很显然,当前仅当 i = j i=j i=j ,即矩阵的主对角线上的元素表示被预测正确的。

2、P、R、F1值
  基于混淆矩阵可以很轻松的计算出精度、召回率和F1值,以及微平均和宏平均。

  1. 样本的总体精度(微平均,all_prediction):混淆矩阵主对角线上元素和除以混淆矩阵所有元素和。公式为:
    a l l _ p r e d i c t i o n = s u m ( d i a g ( c o n f m a r t i x ) ) s u m ( c o n f m a r t i x ) all\_prediction=\frac{sum(diag(confmartix))}{sum(confmartix)} all_prediction=sum(confmartix)sum(diag(confmartix))

  2. 某个类 i i i 的精度(label_i_prediction):元素 c o n f m a r t i x ( i , i ) confmartix(i,i) confmartix(i,i) 除以下标为 i i i 的纵坐标元素和。公式为:
    l a b e l _ i _ p r e d i c t i o n = c o n f m a r t i x ( i , i ) ∑ j c o n f m a r t i x ( j , i ) label\_i\_prediction=\frac{confmartix(i,i)}{\sum_j{confmartix(j,i)}} label_i_prediction=jconfmartix(j,i)confmartix(i,i)

  3. 某各类 i i i 的召回率(label_i_recall):元素 c o n f m a r t i x ( i , i ) confmartix(i,i) confmartix(i,i) 除以下标为 i i i 的横坐标元素和。公式为:
    l a b e l _ i _ r e c a l l = c o n f m a r t i x ( i , i ) ∑ j c o n f m a r t i x ( i , j ) label\_i\_recall=\frac{confmartix(i,i)}{\sum_j{confmartix(i,j)}} label_i_recall=jconfmartix(i,j)confmartix(i,i)

  4. 样本的总体召回率(宏平均 MACRO-averaged): 所有类的召回率的平均值。公式为:
    a l l _ r e c a l l = a v g ( ∑ i l a b e l _ i _ r e c a l l ) all\_recall=avg(\sum_i{label\_i\_recall}) all_recall=avg(ilabel_i_recall)

  5. 样本的总体精度(宏平均 MACRO-averaged):区别于第一个,宏平均为所有类的精度的均值。公式为:
    a l l _ p r e d i c t i o n = a v g ( ∑ i l a b e l _ i _ p r e d i c t i o n ) all\_prediction=avg(\sum_i{label\_i\_prediction}) all_prediction=avg(ilabel_i_prediction)

  6. F1值:总体样本(或某个类)的精度和召回率满足如下:
    F 1 = 2 × p r e d i c t i o n × r e c a l l p r e d i c t i o n + r e c a l l F1=\frac{2\times prediction \times recall}{prediction + recall} F1=prediction+recall2×prediction×recall

3、样例计算
  为了更加清楚的理解上面的计算公式,给出一个关系抽取的实例,例如下面的混淆矩阵,横坐标为实际类,纵坐标为预测的类,一共19个类。

在这里插入图片描述
总体均值为: 2052 / 2717 = 75.52 % 2052/2717=75.52\% 2052/2717=75.52%
各个类的精度、召回率和F1值为:在这里插入图片描述
宏平均精度为 71.09 % 71.09\% 71.09%、宏平均召回率为 71.77 % 71.77\% 71.77%、F1值为 71.43 71.43 71.43

二、python模块

  为了在实际实验中更快捷的计算相应值,许多集成的perl脚本可以很轻松的实现计算,但为了更加方便用户编辑以及无缝接入自己的项目中,本文实现python的简单脚本。用户仅需import即可调用,源码如下:

#####模块说明######
'''
根据传入的文件true_label和predict_label来求模型预测的精度、召回率和F1值,另外给出微观和宏观取值。
powered by wangjianing 2019.3.2'''
import numpy as npdef getLabelData(file_dir):'''模型的预测生成相应的label文件,以及真实类标文件,根据文件读取并加载所有label1、参数说明:file_dir:加载的文件地址。文件内数据格式:每行包含两列,第一列为编号1,2,...,第二列为预测或实际的类标签名称。两列以空格为分隔符。需要生成两个文件,一个是预测,一个是实际类标,必须保证一一对应,个数一致2、返回值:返回文件中每一行的label列表,例如['true','false','false',...,'true']'''labels = []with open(file_dir,'r',encoding="utf-8") as f:for i in f.readlines():labels.append(i.strip().split(' ')[1])return labelsdef getLabel2idx(labels):'''获取所有类标返回值:label2idx字典,key表示类名称,value表示编号0,1,2...'''label2idx = dict()for i in labels:if i not in label2idx:label2idx[i] = len(label2idx)return label2idxdef buildConfusionMatrix(predict_file,true_file):'''针对实际类标和预测类标,生成对应的矩阵。矩阵横坐标表示实际的类标,纵坐标表示预测的类标矩阵的元素(m1,m2)表示类标m1被预测为m2的个数。所有元素的数字的和即为测试集样本数,对角线元素和为被预测正确的个数,其余则为预测错误。返回值:返回这个矩阵numpy'''true_labels = getLabelData(true_file)predict_labels = getLabelData(predict_file)label2idx = getLabel2idx(true_labels)confMatrix = np.zeros([len(label2idx),len(label2idx)],dtype=np.int32)for i in range(len(true_labels)):true_labels_idx = label2idx[true_labels[i]]predict_labels_idx = label2idx[predict_labels[i]]confMatrix[true_labels_idx][predict_labels_idx] += 1return confMatrix,label2idxdef calculate_all_prediction(confMatrix):'''计算总精度:对角线上所有值除以总数'''total_sum = confMatrix.sum()correct_sum = (np.diag(confMatrix)).sum()prediction = round(100*float(correct_sum)/float(total_sum),2)return predictiondef calculate_label_prediction(confMatrix,labelidx):'''计算某一个类标预测精度:该类被预测正确的数除以该类的总数'''label_total_sum = confMatrix.sum(axis=0)[labelidx]label_correct_sum = confMatrix[labelidx][labelidx]prediction = 0if label_total_sum != 0:prediction = round(100*float(label_correct_sum)/float(label_total_sum),2)return predictiondef calculate_label_recall(confMatrix,labelidx):'''计算某一个类标的召回率:'''label_total_sum = confMatrix.sum(axis=1)[labelidx]label_correct_sum = confMatrix[labelidx][labelidx]recall = 0if label_total_sum != 0:recall = round(100*float(label_correct_sum)/float(label_total_sum),2)return recalldef calculate_f1(prediction,recall):if (prediction+recall)==0:return 0return round(2*prediction*recall/(prediction+recall),2)def main(predict_file,true_file):'''该为主函数,可将该函数导入自己项目模块中打印精度、召回率、F1值的格式可自行设计'''#读取文件并转化为混淆矩阵,并返回label2idxconfMatrix,label2idx = buildConfusionMatrix(predict_file,true_file)total_sum = confMatrix.sum()all_prediction = calculate_all_prediction(confMatrix)label_prediction = []label_recall = []print('total_sum=',total_sum,',label_num=',len(label2idx),'\n')for i in label2idx:print('  ',i)print('  ')for i in label2idx:print(i,end=' ')label_prediction.append(calculate_label_prediction(confMatrix,label2idx[i]))label_recall.append(calculate_label_recall(confMatrix,label2idx[i]))for j in label2idx:labelidx_i = label2idx[i]label2idx_j = label2idx[j]print('  ',confMatrix[labelidx_i][label2idx_j],end=' ')print('\n')print('prediction(accuracy)=',all_prediction,'%')print('individual result\n')for ei,i in enumerate(label2idx):print(ei,'\t',i,'\t','prediction=',label_prediction[ei],'%,\trecall=',label_recall[ei],'%,\tf1=',calculate_f1(label_prediction[ei],label_recall[ei]))p = round(np.array(label_prediction).sum()/len(label_prediction),2)r = round(np.array(label_recall).sum()/len(label_prediction),2)print('MACRO-averaged:\nprediction=',p,'%,recall=',r,'%,f1=',calculate_f1(p,r))

使用说明:
1、在自己的项目中,做模型的测试时,需要将实际类及预测类分别写入文件,格式例如下图:第一列为编号,第二列为类,中间用一个字符的空格隔开。
在这里插入图片描述

2、在测试的文件中添加导入模块语句

import prf1(假设这个脚本保存为 prf1.py)

3、模型预测后,执行(其中predict_file和true_file分别表示预测类文件和实际类文件):

prf1.main(predict_file,true_file)

备注:当然大家可以自己设计main函数中的打印格式

三、使用效果

  博主将该脚本用在自己的实验中,做关于中文学科知识点关系抽取实验中,输出效果如图:
在这里插入图片描述
在这里插入图片描述
  博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。欢迎转载,转载请注明出处


http://chatgpt.dhexx.cn/article/WxIjPiTK.shtml

相关文章

模型评价指标—F1值

最近空余时间在参加数字中国创新大赛,比赛规则是根据模型的F1值对参赛者进行排名。为了更深刻地理解这个指标,我最近对它做了一些梳理,现在把它分享给更多有需要的人图片。最近在参赛时也发现了一个问题,就是算法在训练集上完全拟…

精确率、召回率、F1 值、ROC、AUC等分类模型评价指标含义与作用详解

文章目录 摘要一、精确率、召回率、F函数、准确率和错误率1、定义2、区别与应用 二、ROC曲线、P-R曲线、AUC1、P-R曲线2、ROC曲线3、AUC 摘要 在涉及机器学习领域的分类问题时(尤其是衡量推荐系统性能时),经常会遇到诸如准确率、召回率、ROC…

机器学习F1值的概念

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、什么是F1-score二、计算过程1.首先定义以下几个概念:2.通过第一步的统计值计算每个类别下的precision和recall3. 通过第二步计算结果计算每个类别下…

【数学建模】分类问题的几种常见指标(一)——准确率、召回率、F1值

分类问题的几种常见指标(一)——错误率、精度、准确率、召回率、F1值 前言1 错误率与精度2 准确率与召回率2.1 混淆矩阵2.2 准确率(Precision)2.3 召回率(Recall) 3 F1值(F1-score)4…

准确率、精确率、召回率、F1值、ROC/AUC整理笔记

文章目录 前言 一、TP、TN、FP、FN概念二、准确率、精确率(精准率)、召回率、F1值1.准确率(Accuracy)2.精确率(Precision)查准率3.召回率(Recall)查全率4.F1值(H-mean值&…

准确率、精准率、召回率和F1值详解

专业术语的中英文对照表 英文名准确率Accuracy精准率Precise召回率RecallF1值F1 measure Precise和Recall是广泛应用在信息检索和统计学分类领域的两个度量值,用来评价结果的质量;F1 measure是综合Precise和Recall两个指标的评估指标,用于综…

matlab color选取(颜色对照表)

只看前面部分,后面的颜色不用看 参考链接:https://wenku.baidu.com/view/111e6c47773231126edb6f1aff00bed5b8f3734e.html

Matlab RGB 颜色对照表(0-1之间取值)

需要说明的是我并非此表的制作者,原链接如上,我也已将原作者信息一并截入图中,此举只是为了扩大此表传播度,所以连标题都没改。此前想找个如此全的对照表找了好久,是同门师妹发给我该链接才知道这张表,感谢…

matlab画图RGB调色

1.使用matlab画图时,怎样才能调出顺眼的颜色呢?反正我之前使用红、绿、蓝三种颜色画图时,真的辣眼睛。下面这图是我根据一篇论文上的图像调的颜色: 我也知道这并不好看,但是可以给各位提个醒、提个方向。 代码也奉上&…

让颜色对应数值,matlab colormap

#问 如何让自己画出的数值对应不同的颜色呢?换话句话说,如何用不同的颜色表示不同的数值呢? 就是让数值的范围对应颜色的范围。 matlab colormap ##标准色 hsv 色彩饱和值(以红色开始束) hot 从黑到红到黄到白 cool …

【Matlab】到底怎么自定义colorbar/colormap的颜色?

1.Introduction 最近在搜混淆矩阵的时候,发现别人做的图研究就是好看。于是乎开始探寻怎么改变图片colorbar的颜色,搜到后面发现其实是改变colormap的颜色,colorbar只是显示而已。 中间也走过不少坑,一把辛酸泪呀~ 2.Materials …

MATLAB | 有关数值矩阵、颜色图及颜色列表的技巧整理

这是一篇有关数值矩阵、颜色矩阵、颜色列表的技巧整合,会以随笔的形式想到哪写到哪,可能思绪会比较飘逸请大家见谅,本文大体分为以下几个部分: 数值矩阵用颜色显示从颜色矩阵提取颜色从颜色矩阵中提取数据颜色列表相关函数颜色测…

MATLAB颜色的使用(转)

http://blog.csdn.net/t673afa/archive/2009/09/29/4617106.aspx 如何使用、显示、修改和如何创建用户自己的颜色映象。然后,阐述在一个 图形窗口 中仿真多个颜色映象的技术或只使用颜色映象的一部分的技术。最后,讨论照明模型并提供例子。 颜色映象理解…

Linux更换挂载点

目的:/dev/vdb 原本挂载在/data目录下,现在将他挂载在/data0 目录下 步骤: 1、查看/dev/vdb 的挂载点 #df -h2、卸载 /data 挂载点 #umount /data #df -h3、创建新的挂载点,并挂载、查看 #mkdir /data0 #mount /dev/vdb /data0…

Linux各个挂载点及其分区介绍

本文介绍Linux常用分区挂载点常识以及桌面、服务器分区挂载点的推荐配置,当然这个配置是天缘自己写的,分区大小这个话题是仁者见仁智者见智,欢迎大家一起交流这个话题,比如WEB服务、邮件服务、下载服务等,我们一起交流…

Linux磁盘分区和挂载点

https://www.jianshu.com/p/cc2d19dcc204 在Linux系统中最多只有16个分区。Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码。Windows是用不同的盘符来区分并抽象不同的分区方便我们访问,那么Linux是如何区分不同的分区的…

centos 的挂载和挂载点理解

文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 7.8G 0 7.8G 0% /dev tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs 7.8G 8.7M 7.8G 1% /run tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/vda1 40G 2.5G 35G 7% / tmpfs 1.6G 0 1.6G 0% /run/user/0 当我从华为云上安装好以后自动出现以…

linux 文件系统挂载时挂载点(目录)的选择

本篇内容很简单,就是给大家强调一个小知识点。在挂载文件系统的时候,尽可能选择空目录进行挂载,当然了不是空的目录也可以,但是不建议。 在实际的挂载中会出现这样一种情况,如果选择当挂载点的目录非空,当文…

到底什么是挂载?

首发公号:Rand_cs 在 L i n u x Linux Linux 的文件系统中,有个很重要的概念就是挂载,挂载大家应该都很熟悉,除了根文件系统,其他所有文件系统都要先挂载到根文件系统中的某个目录之后才能访问。 所谓的根文件系统就…