精确率 0.99、召回 0.10 的模型,算术平均给 0.545,F1 只给 0.182。 F1 是调和平均,被小值主导——召回那一项是 10,直接压住精确那一项的 1.01。
上一节看到了精确率和召回率的拉扯。这一节讲怎么用一个数把它们合起来,以及为什么不能用算术平均。
一、为什么不用算术平均
算术平均(精确 + 召回)÷ 2。它的问题是对两个数一视同仁。 精确 0.9、召回 0.1 的模型,算术平均是 0.500,看着「及格」。 但这个模型十个该抓的只抓到一个,实际不可用。 调和平均的公式是 2PR ÷(P + R),等价于「倒数的算术平均再取倒数」。 因为先取倒数,小值的那一项会变成大数,权重自然就大了。 精确 0.9、召回 0.1:倒数分别是 1.111 和 10,平均是 5.556,再取倒数得 0.180。 召回那个 10 把整体拉下来了。 这就是调和平均的意义:任何一个维度垮了,总分就垮。它不给「一项优秀」发免死金牌。
二、三个互补的模型,F1 也分不出来
Demo 第一张表:A(精确 0.9/召回 0.2)、B(0.6/0.6)、C(0.2/0.9)。 A 和 C 的算术平均都是 0.550,F1 都是 0.327。两个指标都认为它们一样。 这是合理的——A 和 C 只是把两个数换了位置,价值确实相同。 F1 不区分「高在精确」和「高在召回」,这是它的设计。 B 的 F1 是 0.600,比 A、C 都高。因为它是均衡的,两个维度都不瘸。 这就是 F1 想要的:它奖励「两边都不错」,不奖励「一边极致」。
三、F1 和算术平均真正的分歧
第二张表固定精确率 0.9,召回从 0.9 降到 0.1。 召回 0.5 时:算术平均 0.700,F1 0.643。差得不多。 召回 0.1 时:算术平均 0.500,F1 0.180。差了 0.32。 越不平衡,两者分歧越大。 因为算术平均是线性的,F1 是双曲的——召回接近 0 时 F1 也接近 0,算术平均却只掉一半。 还有一行更值得看:精确 0.99、召回 0.10,算术平均 0.545(比 0.500 还高),F1 只有 0.182。 精确率从 0.9 提到 0.99 几乎没提升 F1,因为瓶颈在召回那边。 这告诉你怎么读 F1:它不是「平均分」,是「短板分」。想提高 F1,该补的是那个低的值。
四、需要偏袒某一侧时用 Fβ
通用形式:Fβ =(1 + β²)× P × R ÷(β² × P + R)。β 等于 1 时退化成 F1。 β 大于 1(比如 2)偏重召回,低召回被罚得更重;β 小于 1(比如 0.5)偏重精确。 Demo 里精确 0.9、召回 0.2 的模型:F0.5 是 0.529,F1 是 0.327,F2 是 0.237。 同一组数,β 一变结论就变。 所以报 F1 之前要先想清楚:这个任务里精确和召回真的等重吗?如果是医疗筛查,F2 比 F1 更合适; 如果是垃圾邮件过滤,F0.5 更合适。 β 不该拍脑袋定。 它应该和「误报代价 : 漏报代价」这个比值对应——虽然实践中很少有人真去算这个比值, 但至少要有意识地选。
五、动手 Demo:F1 与算术平均:精确 0.99 召回 0.10 时差出 0.36
先用三个互补的模型(精确召回互换)比算术平均和 F1;再固定精确率扫召回,看两者差距怎么拉开; 最后算 β 取 0.5、1、2 时的 Fβ。
am = (p + r) / 2.0 # 算术平均
f1 = 2 * p * r / (p + r) # 调和平均
for b in (0.5, 1.0, 2.0):
fb = (1 + b * b) * p * r / (b * b * p + r)
实跑输出:
--------------------------------------------------------------------
F1 分数:为什么不用算术平均
--------------------------------------------------------------------
场景 三个模型的精确率和召回率,正负正好互补
模型 精确率 召回率 算术平均 F1
-----------------------------------------------
A:宁可错杀 0.900 0.200 0.550 0.327
B:均衡 0.600 0.600 0.600 0.600
C:宁可漏掉 0.200 0.900 0.550 0.327
看这张表:A 和 C 的算术平均都是 **0.550**,完全一样——在算术平均眼里,一个精确率 0.9、一个召回率 0.9,价值相同。
它们把两个数互换,算术平均不变,这是合理的。但 F1 也不变(都是 **0.327**)——因为 F1 是调和平均,它同样对「一个高一个低」只惩罚一次,不区分是高在精确还是高在召回。
所以这一节要比较的不是「A 和 C 谁更好」,是「为什么不平衡时 F1 比算术平均狠」。看下面这组:精确率固定 0.9,召回从 0.9 一路降到 0.1。
精确率 召回率 算术平均 F1
---------------------------------
0.90 0.90 0.900 0.900
0.90 0.50 0.700 0.643
0.90 0.10 0.500 0.180
0.99 0.10 0.545 0.182
精确率 0.99、召回 0.10 的算术平均 0.545(看起来很体面)
同一组的 F1 0.182(很难看,但诚实)
召回掉到 0.10 意味着「十个该抓的只抓到一个」。这种模型基本没用。算术平均给了它 0.545,等于放过了一个废模型;F1 给了 0.182,说得很清楚。
原因是调和平均被小值主导:1/F1 的一半来自 1/精确率,一半来自 1/召回率,召回率 0.10 那一项是 10,直接压住了另一项的 1.01。
需要偏向某一侧时用 F 的通用形式 Fβ:β 大于 1 偏召回,小于 1 偏精确。
β Fβ(精确 0.900、召回 0.200) 偏向
------------------------------------------
0.5 0.529 偏精确
1.0 0.327 均衡
2.0 0.237 偏召回
β 越大越看重召回,低召回被罚得越重(表里 β=2 时只有 0.237)。医疗筛查常用 β=2,因为漏诊比误诊严重。但 β 不是随便定的,它应该对应「误报和漏报的代价比」。
A 和 C 的 F1 都是 0.327,算术平均都是 0.550。 两个指标都认为它们等价——这不是缺陷,A 和 C 确实只是把两个数换了位置。 B(0.6/0.6)的 F1 是 0.600,明显高于 A 和 C。F1 奖励均衡,这是它和算术平均最不一样的地方。 第二张表最有说服力:召回 0.9 时两者只差 0.000,召回 0.1 时差 0.320。 所以「用算术平均还是 F1」这个问题,在不平衡的时候才有意义。 Fβ 那一小表:同一组 P、R,β 从 0.5 到 2,F 从 0.529 掉到 0.237。 所以报 F 分数时必须写清 β 是多少,只写「F 值 0.5」是不完整的。
30 秒实验
- 算一下精确 0.6、召回 0.4 的 F1,再算算术平均,看差多少。
- 把 β 设成 10,看 Fβ 会掉到多少——想想这意味着什么。
- 想一想:为什么召回接近 0 时,F1 也接近 0,而算术平均只掉一半?
常见误区
- 「F1 是精确率和召回率的平均」——是调和平均,不是算术平均,低值权重更大。
- 「F1 高就说明两个都不错」——F1 0.6 可能来自 0.9 和 0.45,也可能来自 0.6 和 0.6。
- 「F 分数不用写 β」——β 不同结论完全不同,必须标明。
自测三问(点开对答案)
1. F1 的公式是什么? —— 2 乘精确率乘召回率,再除以(精确率加召回率)。 2. 为什么 F1 比算术平均更适合不平衡场景? —— 调和平均被小值主导,一项垮了总分就垮,不给「一项优秀」发免死金牌。 3. Fβ 里的 β 表示什么? —— 偏向程度:β 大于 1 偏召回,小于 1 偏精确,等于 1 就是 F1。分类问题讲完了。下一节换到回归:误差该怎么量。
- ☐ (本节完,下一节 9.1.4 误差:更好地处理异常值带来的影响)