精确率(Precision)、召回率(Recall)与 F1 是分类任务中最常用的细粒度指标 trio。相比 Accuracy,它们按类别拆开「查准」与「查全」,并在类别不平衡时更可靠。
段末注释:F1 是 Precision 与 Recall 的调和平均;macro 先算每类 F1 再平均,micro 先汇总 TP/FP/FN 再算全局 P/R/F1。
系列索引:微调评估指标导读
一、直观含义(以单类为例)
以「预测为 fear」为例,混淆计数:
| 预测 fear | 预测非 fear | |
|---|---|---|
| 真 fear | TP | FN |
| 真非 fear | FP | TN |
- Precision(查准率):你说是 fear 的里,有多少真是 fear
(\text{P} = \frac{TP}{TP + FP}) — 「宁缺毋滥」 - Recall(查全率):真是 fear 的里,你抓住了多少
(\text{R} = \frac{TP}{TP + FN}) — 「宁滥毋缺」 - F1:P 与 R 的调和平均
(F1 = \frac{2PR}{P + R})
人话:P 衡量「误报多不多」,R 衡量「漏报多不多」,F1 在二者间折中。
二、使用场景与所需数据
| 场景 | 推荐平均方式 |
|---|---|
| 多类不平衡(如情绪、意图) | macro F1 |
| 多标签分类 | 每标签算 P/R/F1 再 macro;或 sample-wise |
| 大类主导、关心总体 TP/FP | micro F1(≈ accuracy 在多类 one-hot 下) |
| 关心样本量加权 | weighted F1 |
数据要求:离散标签 (\hat{y}_i, y_i \in {1,\ldots,C});生成式任务需先解析输出为标签字符串。
三、计算方式
3.1 多类 macro / micro / weighted
对类别 (c),记 (P_c, R_c, F1_c):
| 平均 | 公式 | 特点 |
|---|---|---|
| macro | (\frac{1}{C}\sum_c F1_c) | 小类与大类等权;不平衡任务首选 |
| micro | 全局合并 TP/FP/FN 后算 F1 | 受大类主导 |
| weighted | (\sum_c \frac{n_c}{N} F1_c) | 按 support 加权 |
3.2 代码
1 | from sklearn.metrics import f1_score, classification_report |
classification_report 输出每类的 precision、recall、f1-score、support,是微调报告的标准附件。
3.3 数值示例
六类情绪、基座零样本评估:macro_f1 = 0.482,accuracy = 0.625。macro 更低说明少数类 F1 拖累整体——若只看 accuracy 会高估模型。
四、如何解读
| 模式 | 可能原因 |
|---|---|
| 某类 recall 极低 | 模型很少预测该类;或常与它类混淆 |
| 某类 precision 极低 | 模型乱预测到该类 |
| macro_f1 ↑ 但 accuracy ↓ | 少数类改善、多数类略降——业务上可能仍更好 |
| 各类 F1 均低 | 基座能力弱或 prompt 与任务不匹配 |
微调验收:优先看 macro_f1 delta;若业务只关心某一类(如「anger 不能被漏掉」),单独盯该类的 recall。
五、局限性与常见误用
- 依赖标签解析规则:生成式输出
Fear.、fearful是否算对,需在评估脚本中统一规范化。 - macro 对小类方差大:某类 test 仅 5 条,F1 波动剧烈。
- F1 隐含 P/R 等权:若业务更怕 FN,应直接优化 recall 或看 PR 曲线。
- 不能反映排序质量:推荐系统 top-k 需 MAP、NDCG 等。
- 与 train loss 无单调关系:loss 低不保证 macro F1 升。
六、与其他指标的关系
| 指标 | 关系 |
|---|---|
| Accuracy | 平衡二分类时 F1 与 accuracy 相关;多类不平衡时分化 |
| 混淆矩阵 | 矩阵对角线对应各类 TP;off-diagonal 解释 P/R 低的原因 |
| Token-level F1(SQuAD 等) | 字符/词 span 重叠 F1,非分类 F1;见 QA 评估 |
七、实践建议
- 多类微调报告:macro_f1 + classification_report + 混淆矩阵,accuracy 作补充。
zero_division=0避免某类未预测时报错。- 对比微调前后时,固定
labels=参数列表,防止类别顺序变化导致不可比。 - 生成式评估慢,可先用较小
EVAL_LIMIT看趋势,正式实验再放大。