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

查准率、查全率、F值

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

F1值计算 python f1值怎么计算_评价指标

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

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

  • 查准率(Precision):某一分类你预测对了多少个。
    F1值计算 python f1值怎么计算_算法_02
  • 查全率(Recall):某一分类你预测出来多少个。
    F1值计算 python f1值怎么计算_评价指标_03

举个例子:

F1值计算 python f1值怎么计算_评价指标_04


计算○的:

F1值计算 python f1值怎么计算_F1值计算 python_05

F1值计算 python f1值怎么计算_正例_06

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

F1值计算 python f1值怎么计算_正例_07

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

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

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

F值是二者的综合:
F1值计算 python f1值怎么计算_正例_08

其中F1值计算 python f1值怎么计算_算法_09可以看做一个权值对待:

  • F1值计算 python f1值怎么计算_正例_10就是查全率有更大影响,
  • F1值计算 python f1值怎么计算_F1值计算 python_11查准率有更大影响。

而我们常用的是F1值计算 python f1值怎么计算_评价指标_12F1值计算 python f1值怎么计算_评价指标_13的意思,F1值计算 python f1值怎么计算_正例_14,此时

F1值计算 python f1值怎么计算_正例_15

对于上边的例子F1值就是:F1值计算 python f1值怎么计算_评价指标_16

对于二分类问题

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

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

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

  • 真正例(True Positive,TP):预测类别为正例,实际是正例,预测对了目标样本
  • 假正例(False Positive,FP):预测类别为正例,实际是负例,预测是目标,但预测错了
  • 假负例(False Negative,FN):预测类别为负例,实际是正例,没预测出来的目标样本
  • 真负例(True Negative,TN):预测类别为负例,实际是负例,。

还是上面那个例子,我们讲说圆圈是正例,方块是负例。现在就可以转化成下图这样。

F1值计算 python f1值怎么计算_算法_17

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

此时:

  • 准确率: F1值计算 python f1值怎么计算_评价指标_18
  • 精确率:F1值计算 python f1值怎么计算_F1值计算 python_19
  • 召回率:F1值计算 python f1值怎么计算_评价指标_20
  • F1值: F1值计算 python f1值怎么计算_分类_21

多分类

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

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

  • 查准率(Precision):某一分类你预测对了多少个。
    F1值计算 python f1值怎么计算_算法_02
  • 查全率(Recall):某一分类你预测出来多少个。
    F1值计算 python f1值怎么计算_评价指标_03

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

  • 宏F值
    方法一: 求取每一类的F值之后求平均值。
    F1值计算 python f1值怎么计算_正例_24
    方法二: 还有一种说法是先分别计算查准率和查全率,再进行平均,使用平均的查准率查全率计算宏F值。
    F1值计算 python f1值怎么计算_F1值计算 python_25
  • 微F值:这样每一类的预测结果都加起来之后再计算查准率、查全率、F值。
    F1值计算 python f1值怎么计算_正例_26

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

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

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

不过在“Training algorithms for linear text classifiers”1中,作者指出,macro-F1是所有类中F1-score的平均值,即第一种方式才是macro-F1的计算方式。论文Macro F1 and Macro F12对两种macro的方法进行简单分析,第二种方式对错误的分布不太敏感,这一点有点像micro-F1,论文作者也推荐方法一3456

计算

我们还是计算F1为例:

F1值计算 python f1值怎么计算_评价指标_27

TP 预测对○

FP 预测是○,但是预测错了

FN 没预测出来的○

2

1

1

TP 预测对□

FP 预测是□,但是预测错了

FN 没预测出来的□

4

0

1

TP 预测对△

FP 预测是△,但是预测错了

FN 没预测出来的△

2

1

0

我是手算的,如果你算的结果和我不一样,可能是我算错了。

微F1

总和:

TP 预测对

FP 预测,但是预测错了

FN 没预测出来的

8

2

2

F1值计算 python f1值怎么计算_F1值计算 python_28

宏F1

计算方法1

F1值计算 python f1值怎么计算_评价指标_29
F1值计算 python f1值怎么计算_正例_30

计算方法2

F1值计算 python f1值怎么计算_算法_31

F1值计算 python f1值怎么计算_评价指标_32

如何选择Micro F1 & Macro F1

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

分类TPFPclass A11class B1090class C1 TP1class D1 TP1

那么使用方法二计算有:
F1值计算 python f1值怎么计算_F1值计算 python_33
我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。

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

Weight F1

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

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

  • 方法一:将各类别的F值乘以该类在总样本中的占比进行加权计算。
    F1值计算 python f1值怎么计算_F1值计算 python_34
  • 方法二:在计算查准率和查全率的时候,各个类别的查准率和查全率要乘以该类在总样本中的占比进行加权计算。
    F1值计算 python f1值怎么计算_评价指标_35
    F1值计算 python f1值怎么计算_算法_36
    F1值计算 python f1值怎么计算_F1值计算 python_37

计算

我们还是计算F1为例:

F1值计算 python f1值怎么计算_评价指标_27

TP 预测对

FP 预测是,但是预测错了

FN 没预测出来的

样本比例


2

1

1

30%


4

0

1

50%


8

2

2

20%

计算方法1

F1值计算 python f1值怎么计算_评价指标_29

F1值计算 python f1值怎么计算_正例_40

计算方法2

F1值计算 python f1值怎么计算_算法_31

F1值计算 python f1值怎么计算_评价指标_42


Lewis, David D., et al. “Training algorithms for linear text classifiers.” SIGIR. Vol. 96. 1996. 243199.243277 (acm.org) ↩︎

[1911.03347v2] Macro F1 and Macro F1 (arxiv.org) ↩︎

sklearn中 F1-micro 与 F1-macro区别和计算原理 ↩︎

机器学习 Micro-F1和Macro-F1详解 ↩︎

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 ↩︎

分类问题的评估指标一览 (weixin.qq.com) ↩︎