[math] Recall, Precision, F1, Macro-F1, Balanced Accuracy

Recall 每个真实class里的case里,有多少是真的。(和per class accuracy每个class的accuracy是一样的) Example 二分类里 recall 不等于 overall accuracy ,但可以理解成“某一个 class 内部的 accuracy”。 假设把 1 当 positive class : | | 预测 1

Recall

每个真实class里的case里,有多少是真的。(和per-class accuracy每个class的accuracy是一样的)

Example

二分类里 recall 不等于 overall accuracy,但可以理解成“某一个 class 内部的 accuracy”。

假设把 1 当 positive class:

预测 1预测 0
真实 1TPFN
真实 0FPTN

Recall for class 1

Recall1=TPTP+FN\text{Recall}_1=\frac{TP}{TP+FN}

所有真实为 1 的样本里,有多少被正确预测成 1。

所以它是 class 1 里面的 accuracy,不是全体样本的 accuracy。

Overall accuracy

整体 accuracy 是所有样本里,有多少预测对了。

Accuracy=TP+TNTP+TN+FP+FN\text{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN}

Balanced accuracy

每个class的accuracy(也就是recall),做个平均

Balanced Accuracy=Recall1+Recall02\text{Balanced Accuracy} = \frac{\text{Recall}_1+\text{Recall}_0}{2}

为什么它叫 accuracy,但其实是 recall?

普通 accuracy 是:

Accuracy=所有预测对的样本数所有样本数Accuracy = \frac{\text{所有预测对的样本数}}{\text{所有样本数}}

它是按 sample 平均的,所以大类样本多,大类的影响就大。

而 balanced accuracy 想解决这个问题,所以它改成:

先看每个 class 自己内部预测对了多少,再对 class 平均。

Precision

在预测出来这个class的里面,有多少是真的

F1

F1=2×Precision×RecallPrecision+RecallF1 = \frac{2 \times Precision \times Recall}{Precision + Recall}

combine了precision和recall

Macro-F1

加入每个class都算了一个F1, 那就平均一下。

Macro-F1=F11+F12+⋯+F1KKMacro\text{-}F1 = \frac{F1_1 + F1_2 + \cdots + F1_K}{K}

它比overall accuracy要好很多,因为如果某一类占了很多,accuracy就会很好,但如果看一些class,就不一定那么好。这个时候Macro-F1就可以reflect到底好不好。

Macro-F1 对每个类别一视同仁,不管这个类别样本多还是少。

如果模型只在大类上表现好,但在小类上表现差,普通 accuracy 可能还不错,但 Macro-F1 会明显降低。

Example

假设数据是这样的:

True class总数预测对
Negative900850
Positive10040

普通 accuracy 是:

850+401000=0.89\frac{850 + 40}{1000} = 0.89

看起来有 89%,似乎不错。

但是 balanced accuracy 是:

Recallnegative+Recallpositive2\frac{Recall_{negative} + Recall_{positive}}{2}

也就是:

850/900+40/1002=0.944+0.4002=0.672\frac{850/900 + 40/100}{2} = \frac{0.944 + 0.400}{2} = 0.672

这里:

  • (850/900) 是 negative class 的 recall
  • (40/100) 是 positive class 的 recall

所以 balanced accuracy 会暴露出模型对 positive class 表现很差的问题。

Per-class Precision

对某个 class (c),per-class precision 是:

Precisionc=TPcTPc+FPcPrecision_c = \frac{TP_c}{TP_c + FP_c}

它回答的问题是:

模型所有预测成 class (c) 的样本里,有多少真的属于 class (c)?

也可以理解成:

我预测出来的这个 class 有多“纯”?

所以 precision 关注的是 预测出来的结果有多少是真的。

还是用 Rabbit 举例:

真实有 100 个 Rabbit。模型找出了 40 个,所以 recall 是:

RecallRabbit=40100=0.40Recall_{Rabbit} = \frac{40}{100} = 0.40

但如果模型一共预测了 80 个 Rabbit,其中只有 40 个是真的,那么:

PrecisionRabbit=4080=0.50Precision_{Rabbit} = \frac{40}{80} = 0.50

也就是说,模型预测为 Rabbit 的样本里,只有一半是真的 Rabbit。


Recall 和 Precision 的区别

指标分母是谁问的问题关注点
Per-class recall所有真实是 class (c) 的样本真实的 (c) 里,我找到了多少?漏掉多少
Per-class precision所有预测成 class (c) 的样本我预测为 (c) 的里面,有多少是真的?预测有多纯

简单记法:

  • Recall:真实有的,我找回来了多少?
  • Precision:我说有的,到底有多少是真的?

Macro-F1 和 Balanced Accuracy 的区别

指标怎么算关注什么
Balanced accuracy每个 class 的 recall 平均每类有没有被找出来
Macro-F1每个 class 的 F1 平均每类的 precision 和 recall 是否都好

所以:

  • 如果你主要关心模型有没有识别出每个类别,可以看 balanced accuracy。
  • 如果你同时关心模型对每个类别的 recall 和 precision,可以看 Macro-F1。

在类别不平衡的任务中,Macro-F1 通常比普通 accuracy 更能反映模型是否真的学到了 minority class。