第3章 F1分数定义与数学推导:调和平均数归纳总结
做分类模型评估时,光看准确率往往不够。尤其是正负样本不平衡的场景——比如欺诈检测、罕见病筛查。这时候,精确率(Precision)和召回率(Recall)就成了两个绕不开的指标。但问题来了:两个指标往不同方向走,怎么综合成一个数?F1分数就是答案。它在信息检索、NLP、医疗诊断这些领域几乎是标配。我当年第一次接触时也在想:为什么非要用调和平均数?直接取个平均值不行吗?嗯,这一章我们就把它彻底说透。
3.1 从混淆矩阵说起
在正式推导之前,快速回顾一下基础。混淆矩阵里的四个数字决定了所有分类指标:
| 实际\预测 | 正类(Positive) | 负类(Negative) |
|---|---|---|
| 正类(Positive) | TP(真正例) | FN(假负例) |
| 负类(Negative) | FP(假正例) | TN(真负例) |
- 精确率:P = TP / (TP + FP) —— 预测为正的样本里,有多少猜对了。
- 召回率:R = TP / (TP + FN) —— 真正的正样本里,我们找回了多少。
这两个指标天然存在矛盾。你让模型严格一点,精确率上去了,但可能漏掉很多正样本,召回率就掉下来。反过来放宽阈值,召回率升高,精确率又低了。F1就是把这对矛盾融合成一体的桥梁。
3.2 F1分数的数学定义
F1分数的标准公式长这样:
F1 = 2 * (P * R) / (P + R)
这个形式,其实就是精确率和召回率的调和平均数。我第一次看到这个公式时觉得挺简洁,但心里嘀咕:为什么不是 (P+R)/2 这种算术平均?别急,下面我们专门拆解调和平均数的直觉。
核心记忆点:F1只有在P和R都高时才高。如果其中一个很低,哪怕另一个是1,F1也会被拉低。
3.3 调和平均数:为什么不是算术平均?
调和平均数的定义是:对于一组正数x,y,其调和平均数为 2xy/(x+y)。它和算术平均、几何平均有什么区别?
| 平均类型 | 公式 | 特点 |
|---|---|---|
| 算术平均 | (x+y)/2 | 对极端值不敏感,大值拉高整体 |
| 几何平均 | √(x·y) | 偏向小值,但不如调和平均强烈 |
| 调和平均 | 2/(1/x + 1/y) | 最惩罚不均衡,更靠近较小的数 |
举个例子:假如P=1.0(完美精确),R=0.2(召回很低)。算术平均是0.6,而调和平均只有0.333。哪个更合理?你想想看,一个模型说“我找到的都很准,但只找到20%的正样本”,在大多数业务里这种表现根本不能接受。调和平均老实交代了短板,算术平均却粉饰太平。我习惯用F1的另一个原因是:它和我们想要的行为高度一致——模型不能偏科。
3.4 F1分数的推导过程
从历史角度看,F1最早源于信息检索领域。标准的推导从召回率R和精确率P出发,目标是找到一个综合度量,使得:
- 当P=R时,度量等于两个值。
- 度量值受较小值影响更大。
- 形式简单、对称。
把调和平均写成倒数形式:
1/F1 = 1/2 * (1/P + 1/R)
这等价于求倒数的算术平均再取倒数。为什么要绕这一步?因为倒数的算术平均在数值上更稳定,且当P或R为0时,调和平均直接为0,不会出现未定义的情况。我在做原始数据清洗时经常遇到P或R为0的极端模型,此时用公式每次都能正确报出0分,而算术平均还给我一个非零值——这不坑人嘛。
实现小技巧:在Python代码里为了避免除零错误,一般先计算分母,单独处理P+R=0的情况:
def f1_score(p, r):
if p + r == 0:
return 0.0
return 2 * p * r / (p + r)
3.5 加权变体:Fβ分数
有时候我们对召回率和精确率的重视程度不一样。比如癌症筛查,宁可多召回(甚至误报),也不能漏诊。这时候就需要Fβ分数:
Fβ = (1 + β²) * (P * R) / (β² * P + R)
其中β用来控制召回率的权重:
- β = 1 → F1,同等重要
- β = 2 → F2,召回率权重更高
- β = 0.5 → F0.5,精确率权重更高
表里总结一下:
| β值 | 名称 | 偏向 | 常见场景 |
|---|---|---|---|
| 0.5 | F0.5 | 精确率 | 搜索结果质量 |
| 1 | F1 | 平衡 | 通用二分类 |
| 2 | F2 | 召回率 | 医疗筛查、欺诈检测 |
我曾经遇到的坑:有一回用F2评估模型,β=2,结果模型为了追求高召回率,几乎把所有样本都判为正类,精确率掉到0.1。F2值虽然看起来还行(0.18),但实际业务无法接受。后来我改成同时监控P和R,不让单个指标蒙蔽双眼。记住:Fβ只是辅助,不能替代人工审查P和R的绝对值。
3.6 知识体系图解
下面这张SVG图把F1分数的核心逻辑、三个平均数的对比、以及加权变体串在一起,方便你整体把握:
我的个人习惯:在项目初期,我会同时看F1和F2。如果F1和F2差距很大,就说明P和R严重不均衡,需要调整阈值或做数据增强。有一次在命名实体识别任务中,F1=0.82但F2只有0.75,我发现召回率拖了后腿,于是重点改进了未登录词的处理逻辑,最后F1升到了0.87。你看,多一个视角就能发现问题。
总结一下这章内容:F1分数本质上就是精确率和召回率的调和平均数。它用最直接的方式惩罚了偏科模型,是二分类问题中衡量整体性能的可靠单值指标。掌握调和平均数的数学直觉,你就能在实战中快速判断什么时候用F1,什么时候用Fβ,以及如何向业务方解释为什么F1比准确率更靠谱。好了,接下来我们开始做练习题,记得亲手算一遍混淆矩阵里的F1值。