jjzjj

分类评价指标 F值 详解 | Micro F1 & Macro F1 & Weight F1

51Ann 2023-03-28 原文

之前写一个作业样本不均衡问题。然后查了很多文章都说要更换评价指标,不能再使用准确率了,要计算F值。我看了一下F值怎么计算,看了挺多文章的,但是感觉说的比较迷惑,或者说法比较拗口。最后还是自己再总结一个。

查准率、查全率、F值

我们平时对于一个模型预测的准不准,我们最先想到的是用准确率(Accuracy)进行评价。

$$ A = \frac{true}{total} $$

这个虽然常用,但不能满足所有任务的需求。

所以我们可以引入查准率查全率

  • 查准率(Precision):某一分类你预测对了多少个。

    $P = \frac{预测对的某一类}{你预测的某一类}$

  • 查全率(Recall):某一分类你预测出来多少个。

    $R = \frac{预测对的某一类}{样本中的某一类}$

举个例子: 计算○的:

$P_○ = \frac{2}{3}$

$R_○ = \frac{3}{2}$

查准率和查全率二者不可得兼。大概是下图这样的图像。不信你可以自己算一下。对于不同的实验曲线的形状可能略有不同。

精确率高,意味着分类器要尽量在 “更有把握” 的情况下才将样本预测为正样本, 这意味着精确率能够很好的体现模型对于负样本的区分能力,精确率越高,则模型对负样本区分能力越强。

召回率高,意味着分类器尽可能将有可能为正样本的样本预测为正样本,这意味着召回率能够很好的体现模型对于正样本的区分能力,召回率越高,则模型对正样本的区分能力越强。

从上面的分析可以看出,精确率与召回率是此消彼长的关系, 如果分类器只把可能性大的样本预测为正样本,那么会漏掉很多可能性相对不大但依旧满足的正样本,从而导致召回率降低。

F值是二者的综合: $$ F(k) =\frac{ ( 1 + k ) \times P \times R} { k^2 \times P + R },\quad 其中k>0 $$

其中$k$可以看做一个权值对待:

  • $k>1$就是查全率有更大影响,
  • $k<1$查准率有更大影响。
而我们常用的是$F1$值,$F(1)$的意思,$k=1$,此时

$$ F(1) = \frac {2 \times P \times R} { P + R } $$

对于上边的例子F1值就是:$F1_○ = \frac{2\times \frac{2}{3} \times \frac{3}{2}}{ \frac{2}{3} + \frac{3}{2}}$

对于二分类问题

道理就是我上边说的那一段,但是常规大家介绍的时候都喜欢写什么TP TN之类的字母表示,看得我头晕。所以如果上边例子看懂了的话,可以直接跳过二分类,看多分类就可以了。

二分类呢就是我上面举的那个例子。别人写F值的计算一般都喜欢用一个混淆矩阵来表示。

我们需要建立以下几个量的混淆矩阵:

  • 真正例(True Positive,TP):预测类别为正例,实际是正例,预测对了目标样本
  • 假正例(False Positive,FP):预测类别为正例,实际是负例,预测是目标,但预测错了
  • 假负例(False Negative,FN):预测类别为负例,实际是正例,没预测出来的目标样本
  • 真负例(True Negative,TN):预测类别为负例,实际是负例,。
还是上面那个例子,我们讲说圆圈是正例,方块是负例。现在就可以转化成下图这样。

字母真的很让人迷惑!!!所以我搞了文字版。TN那里灰色的,因为计算F值不需要那一项。

此时:

  • 准确率: $A = \frac{T P+T N}{\text { TP+FP+FN+TN }}$

  • 精确率:$P=\frac{T P}{T P+F P}$

  • 召回率:$R=\frac{T P}{T P+F N}$

  • F1值: $F 1=\frac{2 \times P \times R}{P+R}$

多分类

为什么我说可以不看二分类那一段,因为那一段真的四个字母表示特别容易让人迷惑。并且它跟多分类也衔接不上。因为在多分类里强行用简单的正例负例来说真的是很怪异。

不需要你再翻回去了,我直接把那个内容搬下来了。

  • 查准率(Precision):某一分类你预测对了多少个。

    $P = \frac{预测对的某一类}{你预测的某一类}$

  • 查全率(Recall):某一分类你预测出来多少个。

    $R = \frac{预测对的某一类}{样本中的某一类}$

上边提到的F值是关于二分类。多分类的时候就需要用到宏F值(F-macro)和微F值(F-micro)。

  • 宏F值

    方法一: 求取每一类的F值之后求平均值。

    $F_{Macro} = \frac{1}{n}\sum_{i-1}^n F1^{(i)}$

    方法二: 还有一种说法是先分别计算查准率和查全率,再进行平均,使用平均的查准率查全率计算宏F值。

    $F_{Macro} = \frac {k \times P_{ave} \times R_{ave} } { k^2 \times P_{ave} + R_{ave}}$

  • 微F值:这样每一类的预测结果都加起来之后再计算查准率、查全率、F值。

    $F_{Micro} = \frac {k \times P_{sum} \times R_{sum}} { k^2 \times P_{sum} + R_{sum}}$

注意: 关于宏F1两种计算方法最终结果是不一样的。

在Scikit-learn(以前称为scikits.learn,也称为sklearn)的包中,使用的是第一种方式。

两种方式的使用争议一直存在。

不过在“Training algorithms for linear text classifiers”^[Lewis, David D., et al. “Training algorithms for linear text classifiers.” SIGIR. Vol. 96. 1996. 243199.243277 (acm.org)]中,作者指出,macro-F1是所有类中F1-score的平均值,即第一种方式才是macro-F1的计算方式。论文Macro F1 and Macro F1^[[1911.03347v2] Macro F1 and Macro F1 (arxiv.org)]对两种macro的方法进行简单分析,第二种方式对错误的分布不太敏感,这一点有点像micro-F1,论文作者也推荐方法一。

计算

我们还是计算F1为例:

TP 预测对○ FP 预测是○,但是预测错了 FN 没预测出来的○
2 1 1
TP 预测对□ FP 预测是□,但是预测错了 FN 没预测出来的□
4 1
TP 预测对△ FP 预测是△,但是预测错了 FN 没预测出来的△
2 1
我是手算的,如果你算的结果和我不一样,可能是我算错了。

微F1:

总和:

TP 预测对 FP 预测,但是预测错了 FN 没预测出来的
8 2 2
$$ \begin{aligned} &P_{sum} = \frac{8}{8+2} = \frac 4 5\ \ &R_{sum} = \frac{8}{8+2} = \frac 4 5\ \ &F_{Micro} = \frac {2 \times P_{sum} \times R_{sum}} { P_{sum} + R_{sum} } = \frac {2 \times \frac 4 5 \times \frac 4 5} { \frac 4 5 + \frac 4 5 } = \frac 2 5 \end{aligned} $$

宏F1:

  • 计算方法1
$$ \begin{aligned} &P_○=\frac{2}{2+1} = \frac{2}{3} &R_○=\frac{2}{2+1} = \frac{2}{3} \quad &F1_○=\frac{2 \times P ○\times R_○}{P_○+R_○} = \frac{2}{3} \ \ & P_□=\frac{4}{4+0} = 1 &R_□=\frac{4}{4+1} = \frac{4}{5} \quad & F1_□=\frac{2 \times P_□ \times R_□}{P_□+R_□} = \frac{8}{9} \ \ &P_△=\frac{2}{2+1} = \frac{2}{3} &R_△=\frac{2}{2+0} = 1 \quad &F1_△=\frac{2 \times P_△ \times R_△}{P_△+R_△} = \frac{4}{5} \end{aligned} $$ $$ F1{macro} = \frac{F1_○+F1_□+F1_△}{3} = \frac{106}{135} $$

  • 计算方法2
$$ \begin{aligned} &P_○=\frac{2}{2+1} = \frac{2}{3} &R_○=\frac{2}{2+1} = \frac{2}{3} \quad\ \ & P_□=\frac{4}{4+0} = 1 &R_□=\frac{4}{4+1} = \frac{4}{5} \quad \ \ &P_△=\frac{2}{2+1} = \frac{2}{3} &R_△=\frac{2}{2+0} = 1 \quad \end{aligned} $$

$$ \begin{aligned} &P_{ave}=P_○+P_□+P_△=\frac 7 9 \ \ &R_{ave}=R_○+R_□+R_△=\frac{37} {45} \ \ &F1_{macro} = \frac {2 \times P_{ave} \times R_{ave} } { P_{ave} + R_{ave}} = \frac {2 \times \frac 7 9 \times \frac{37} {45} } { \frac 7 9 +\frac{37} {45} } = \frac {259}{324} \end{aligned} $$

如何选择Micro F1 & Macro F1

Macro 相对 Micro 而言,小类别起到的作用更大。 举个例子,对于一个四分类问题有:

分类 TP FP
class A 1 1
class B 10 90
class C 1 TP 1
class D 1 TP 1
那么使用方法二计算有: $$ \begin{gathered} P_{A}=P_{C}=P_{D}=0.5, P_{B}=0.1 \ \ P_{\text {macro }}=\frac{0.5+0.1+0.5+0.5}{4}=0.4 \ \ P_{\text {micro }}=\frac{1+10+1+1}{2+100+2+2}=0.123 \end{gathered} $$ 我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。

总的来说, 如果你的类别比较均衡,则随便;如果你认为大样本的类别应该占据更重要的位置, 使用Micro;如果你认为小样本也应该占据重要的位置,则使用 Macro;如果 Micro << Macro , 则意味着在大样本类别中出现了严重的分类错误;如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。

Weight F1

Weighted F值 是Macro 算法的改良版,顾名思义就是加权版本的F值计算。是为了解决Macro中没有考虑样本不均衡的问题。

既然是Macro F值计算的改良版,那肯定也是有两种计算方法:

  • 方法一:将各类别的F值乘以该类在总样本中的占比进行加权计算。

    $F_{Weighted} = \sum_{i-1}^n w^{(i)}F^{(i)}$

  • 方法二:在计算查准率和查全率的时候,各个类别的查准率和查全率要乘以该类在总样本中的占比进行加权计算。

    $F_{Weighted} = \frac {k \times P_{wei} \times R_{wei} } { k^2 \times P_{wei} + R_{wei}}$

    $P_{wei}=w_○P_○+w_□P_□+w_△P_△$

    $R_{wei}=w_○R_○+w_□R_□+w_△R_△$

我们还是计算F1为例:

TP 预测对 FP 预测是,但是预测错了 FN 没预测出来的 样本比例
2 1 1 30%
4 1 50%
8 2 2 20%
  • 计算方法1
$$ \begin{aligned} &P_○=\frac{2}{2+1} = \frac{2}{3} &R_○=\frac{2}{2+1} = \frac{2}{3} \quad &F1_○=\frac{2 \times P _○\times R_○}{P_○+R_○} = \frac{2}{3} \ \ & P_□=\frac{4}{4+0} = 1 &R_□=\frac{4}{4+1} = \frac{4}{5} \quad & F1_□=\frac{2 \times P_□ \times R_□}{P_□+R_□} = \frac{8}{9} \ \ &P_△=\frac{2}{2+1} = \frac{2}{3} &R_△=\frac{2}{2+0} = 1 \quad &F1_△=\frac{2 \times P_△ \times R_△}{P_△+R_△} = \frac{4}{5} \end{aligned} $$

$$ F1_{Weighted} =w_○F1_○+w_□F1_□+w_△F1_△= \frac 2 3 \times 30% + \frac 8 9 \times 50% + \frac 4 5 \times 20%= \frac {181}{225} $$

  • 计算方法2
$$ \begin{aligned} &P_○=\frac{2}{2+1} = \frac{2}{3} &R_○=\frac{2}{2+1} = \frac{2}{3} \quad\ \ & P_□=\frac{4}{4+0} = 1 &R_□=\frac{4}{4+1} = \frac{4}{5} \quad \ \ &P_△=\frac{2}{2+1} = \frac{2}{3} &R_△=\frac{2}{2+0} = 1 \quad \end{aligned} $$

$$ \begin{aligned} &P_{wei}=w_○P_○+w_□P_□+w_△P_△ = \frac 2 3 \times 30% + 1 \times 50% + \frac 2 3 \times 20%= \frac 5 6\ \ &R_{wei}=w_○R_○+w_□R_□+w_△R_△ =\frac 2 3 \times 30% + \frac 4 5\times 50% + 1\times 20%= \frac 4 5 \ \ &F1_{Weighted} = \frac {2 \times P_{wei} \times R_{wei} } { P_{wei} + R_{wei}} = \frac {2 \times \frac 5 6 \times \frac 4 5 } { \frac 5 6 + \frac 4 5 } = \frac {40}{49} \end{aligned} $$

其他参考资料

^[Multi-Class Metrics Made Simple, Part I: Precision and Recall | by Boaz Shmueli | Towards Data Science] ^[Multi-Class Metrics Made Simple, Part II: the F1-score | by Boaz Shmueli | Towards Data Science]

有关分类评价指标 F值 详解 | Micro F1 & Macro F1 & Weight F1的更多相关文章

  1. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  2. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  3. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  4. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  5. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  6. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  7. 详解Unity中的粒子系统Particle System (二) - 2

    前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif

  8. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

  9. ruby-on-rails - 带有分类器 gem 的无效编码符号 - 2

    当我将项目添加到我的Postgres数据库时,一切似乎都运行良好。在不做任何更改的情况下,只要在我的应用程序中的任何位置启动Madeleine,我的Rails应用程序就会开始失败:EncodingErrorinEventsController#updateinvalidencodingsymbolapp/controllers/events_controller.rb:137:in`update'137是问题行:135defupdate136@event=Event.find(params[:id])137m=SnapshotMadeleine.new("bayes_data")...

  10. ruby - 贝叶斯分类器分数代表什么? - 2

    我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st

随机推荐