第4章 文本模型怎么评估:混淆矩阵、F1、AUC 与生成指标
读完你能: 读对混淆矩阵的方向;计算常用的分类指标;从排序的角度理解 AUC;算清 n-gram 截断计数、长度惩罚和最长公共子序列;按实际的错误代价选择指标。
1. 先定下“正类”是什么
设想一个工单分流系统,把“需要人工处理的工单”定为正类。本章的混淆矩阵一律行是真实标签,列是预测标签:
| 预测为正 | 预测为负 | |
|---|---|---|
| 真实为正 | TP=8 | FN=2 |
| 真实为负 | FP=4 | TN=6 |
FP 是误报,FN 是漏报。如果换一个类别当正类,这些格子的含义和指标的解释都会跟着变,所以要记住它们的意思,而不是死记字母的位置。
精确率(precision)问的是“报出来的里面有多少是真的”,召回率(recall)问的是“真的里面有多少被找出来了”。F1 是两者的调和平均,不能用算术平均 代替:调和平均会被较小的那个值拉低,两者差距越大越明显。
如果 99% 的样本都是负类,一个永远回答“负”的模型也有 99% 的准确率,却一个正例都找不到。所以报告准确率时,必须同时说明类别分布和漏报的代价。
2. 多分类的三种平均
多分类时,对每个类别都做一次“本类对其余所有类”,算出这一类的 P、R、F1,再把各类汇总起来。仍然是行为真实、列为预测:
| 预测 A | 预测 B | 预测 C | 真实数量 | |
|---|---|---|---|---|
| 真实 A | 8 | 2 | 0 | 10 |
| 真实 B | 1 | 3 | 0 | 4 |
| 真实 C | 0 | 1 | 1 | 2 |
某一类的 precision 看它那一列,recall 看它那一行:
| 类别 | Precision | Recall | F1 |
|---|---|---|---|
| A | |||
| B | 0.6 | ||
| C |
- Macro-F1:三类的 F1 直接平均,约 0.7029。小类和大类同等重要。
- Weighted-F1:按各类真实数量 10、4、2 加权平均,约 0.7596。大类的影响更大。
- Micro-F1:先把各类的 TP、FP、FN 分别加总,再算一次 F1。这里 TP=12、FP=4、FN=4,结果是 0.75。
在每个样本恰好属于一个类、并且所有类别都参与统计的多分类问题里,micro precision、micro recall、micro F1 和 accuracy 四者相等(本例都是 )。多标签问题就不一定了。另外,Macro-F1 一般不等于“macro precision 和 macro recall 的调和平均”,两种算法都有人用,报告时要写清楚。
遇到分母为 0 的情况(比如某一类从未被预测过,precision 无从计算),要明确实现的处理规则,例如记为 0,并说明原因,而不是把它当成一个正常的观测值。
3. 阈值、ROC 与 AUC
分类器通常先输出一个分数,再用阈值把分数变成标签。阈值调高,被判为正类的样本只会变少或不变;但 precision 会不会因此变好,并没有一般性的保证。
ROC 曲线的横轴是假正率 ,纵轴是真正率 。阈值从高到低扫一遍,就画出了这条曲线。曲线下面积 AUC 有一个直观的解释:随机抽一个正例和一个负例,正例得分更高的概率;两者分数相同时算半次。
例: 三个正例的分数是 0.9、0.8、0.4,三个负例是 0.7、0.3、0.2。
- 0.9 高于全部三个负例:3 次;
- 0.8 也高于全部三个负例:3 次;
- 0.4 只高于 0.3 和 0.2:2 次。
一共 对,AUC=。
如果阈值取 0.5,则 TP=2、FP=1、FN=1、TN=2,准确率只有 。AUC 衡量的是整体排序好不好,准确率取决于某一个具体阈值,两者并不矛盾。
AUC 也不检查分数是否“校准”,即 0.8 分的样本是否真有 80% 是正例。在类别极不平衡的任务里,还应该看 precision-recall 曲线、在指定召回率下的精确率,以及实际的处理成本。
4. BLEU:候选句里有多少片段能在参考句里找到
用同样的方式分词后,参考句是 a cat sits on the mat,候选句是 a cat is on the mat。
BLEU 用的是修正后的 n-gram 精确率:候选句里某个片段出现几次,最多只能算参考句里它出现的次数那么多个匹配,多出来的重复不算分。有多个参考句时,取各参考句里该片段出现次数的最大值。
本例候选句的 6 个 unigram 中,除了 is 都能匹配,;5 个 bigram 中,a cat、on the、the mat 能匹配,。
是候选句长度, 是有效参考长度。BP 是简短惩罚:没有它,候选句只输出几个最有把握的词就能拿到很高的精确率。空的候选句直接记 0 分;有多个参考句时, 取哪个参考的长度也要事先定好规则。
本例两句都是 6 个词,BP=1;等权重的 BLEU-2 为 。
再看截断的作用:如果候选句是 cat cat cat,参考句里只有一个 cat,修正后的 是 而不是 1。
不做平滑的 BLEU 只要有一阶 ,整体就是 0,短句尤其容易碰到。因此报告 BLEU 时要写明用到几阶、是否平滑、是句子级还是语料级。语料级 BLEU 是把所有句子的匹配计数加总后再算,不是各句分数的平均。实现细节可参考 NLTK BLEU 文档。
5. ROUGE:参考句的内容被覆盖了多少
ROUGE-N 通常以参考句中的 n-gram 为分母,计算召回率;也可以同时报告精确率和 F1。上例参考句有 6 个 unigram、5 个 bigram,所以 ROUGE-1 召回率为 ,ROUGE-2 召回率为 。
ROUGE-L 用的是最长公共子序列(LCS):匹配的词不必连在一起,但先后顺序必须一致。上例的 LCS 是 a cat on the mat,长度为 5:
ROUGE-S 统计按顺序出现的“跳跃二元组”,即中间可以隔着别的词的词对。最多允许隔多远,由具体的变体规定,不同实现并不统一。
这些指标说到底都在数表面上的重合,不能可靠地检验语义或事实。把一个数字、一个否定词或一组人物关系改掉,匹配数往往只少一点,整句话的事实却已经变了。
6. METEOR:对齐加上碎片惩罚
METEOR 的不同版本可以把词形变化、同义词也算作匹配。下面先看只匹配完全相同词元的简化算法。设匹配上的词数为 :
是一个偏重召回率的调和平均。然后根据匹配结果有多“碎”扣分:
是匹配上的词在两句中都连续、顺序也一致的块的个数;分母是匹配的词数 ,不是候选句长度。上例有 5 个精确匹配,组成 a cat 和 on the mat 两块。由于 ,,于是
如果开启词干或同义词匹配,sits 和 is 可能被对齐,其他句子的匹配也会变。这已经是另一套实验配置,结果不能和上面直接比。
7. 选指标之前,先列出最怕犯的错
| 场景 | 主要看什么 |
|---|---|
| 实体抽取 | 按实体跨度和类型严格匹配的 P/R/F1 |
| 工单分流 | 各类的召回率、macro-F1、处理成本 |
| 机器翻译 | BLEU 等自动指标,加上人工检查译文是否完整准确 |
| 摘要 | 内容覆盖、与原文的事实一致性、重复和冗余 |
| 检索 | 排在前面的结果是否相关,必要时用专门的排序指标 |
比较不同模型时,必须用同一个测试集、同一套预处理。测试集也不能反复拿来调阈值、挑超参数或修改规则;那样用过之后,它实际上已经变成了验证集。
自测
1. 已知 P=0.9、R=0.1,F1 大约是多少?
。精确率再高,也掩盖不了严重的漏报。
2. 如果所有正负样本的分数都一样,按“并列算半次”计算,AUC 是多少?
每一对都算半次,AUC=0.5。这样的分数完全没有区分正负的排序能力。
- 感谢你赐予我前进的力量

