约 35 分钟 · 需要概率与分数计算

读完你能: 读对混淆矩阵的方向;计算常用的分类指标;从排序的角度理解 AUC;算清 n-gram 截断计数、长度惩罚和最长公共子序列;按实际的错误代价选择指标。

1. 先定下“正类”是什么

设想一个工单分流系统,把“需要人工处理的工单”定为正类。本章的混淆矩阵一律行是真实标签,列是预测标签:

预测为正 预测为负
真实为正 TP=8 FN=2
真实为负 FP=4 TN=6

FP 是误报,FN 是漏报。如果换一个类别当正类,这些格子的含义和指标的解释都会跟着变,所以要记住它们的意思,而不是死记字母的位置。

Accuracy⁡=TP+TNTP+TN+FP+FN=1420=0.7,\operatorname{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN}=\frac{14}{20}=0.7,
P=TPTP+FP=23,R=TPTP+FN=0.8,F1=2PRP+R=2TP2TP+FP+FN=811≈0.7273.P=\frac{TP}{TP+FP}=\frac23,\qquad R=\frac{TP}{TP+FN}=0.8,\qquad F_1=\frac{2PR}{P+R}=\frac{2TP}{2TP+FP+FN}=\frac8{11}\approx0.7273.

精确率(precision)问的是“报出来的里面有多少是真的”,召回率(recall)问的是“真的里面有多少被找出来了”。F1 是两者的调和平均,不能用算术平均 (P+R)/2(P+R)/2 代替:调和平均会被较小的那个值拉低,两者差距越大越明显。

如果 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 8/98/9 8/108/10 16/19≈0.842116/19\approx0.8421
B 3/63/6 3/43/4 0.6
C 1/11/1 1/21/2 2/3≈0.66672/3\approx0.6667
  • 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 四者相等(本例都是 12/1612/16)。多标签问题就不一定了。另外,Macro-F1 一般不等于“macro precision 和 macro recall 的调和平均”,两种算法都有人用,报告时要写清楚。

遇到分母为 0 的情况(比如某一类从未被预测过,precision 无从计算),要明确实现的处理规则,例如记为 0,并说明原因,而不是把它当成一个正常的观测值。

3. 阈值、ROC 与 AUC

分类器通常先输出一个分数,再用阈值把分数变成标签。阈值调高,被判为正类的样本只会变少或不变;但 precision 会不会因此变好,并没有一般性的保证。

ROC 曲线的横轴是假正率 FPR=FP/(FP+TN)FPR=FP/(FP+TN),纵轴是真正率 TPR=RTPR=R。阈值从高到低扫一遍,就画出了这条曲线。曲线下面积 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 次。

一共 3×3=93\times3=9 对,AUC=8/9≈0.88898/9\approx0.8889。

如果阈值取 0.5,则 TP=2、FP=1、FN=1、TN=2,准确率只有 4/64/6。AUC 衡量的是整体排序好不好,准确率取决于某一个具体阈值,两者并不矛盾。

AUC 也不检查分数是否“校准”,即 0.8 分的样本是否真有 80% 是正例。在类别极不平衡的任务里,还应该看 precision-recall 曲线、在指定召回率下的精确率,以及实际的处理成本。

4. BLEU:候选句里有多少片段能在参考句里找到

用同样的方式分词后,参考句是 a cat sits on the mat,候选句是 a cat is on the mat。

BLEU 用的是修正后的 n-gram 精确率:候选句里某个片段出现几次,最多只能算参考句里它出现的次数那么多个匹配,多出来的重复不算分。有多个参考句时,取各参考句里该片段出现次数的最大值。

pn=∑gmin⁡(count⁡cand(g),maxrefcount⁡(g))∑gcount⁡cand(g).p_n=\frac{\sum_g\min(\operatorname{count}_{cand}(g),\operatorname{maxrefcount}(g))}{\sum_g\operatorname{count}_{cand}(g)}.

本例候选句的 6 个 unigram 中,除了 is 都能匹配,p1=5/6p_1=5/6;5 个 bigram 中,a cat、on the、the mat 能匹配,p2=3/5p_2=3/5。

BLEUN=BPexp⁡(∑n=1Nwnln⁡pn),∑nwn=1,BLEU_N=BP\exp\left(\sum_{n=1}^{N}w_n\ln p_n\right),\qquad\sum_nw_n=1,
BP={1,c≥re1−r/c,0<c<r.BP=\begin{cases}1,&c\ge r\\e^{1-r/c},&0<c<r.\end{cases}

cc 是候选句长度,rr 是有效参考长度。BP 是简短惩罚:没有它,候选句只输出几个最有把握的词就能拿到很高的精确率。空的候选句直接记 0 分;有多个参考句时,rr 取哪个参考的长度也要事先定好规则。

本例两句都是 6 个词,BP=1;等权重的 BLEU-2 为 (5/6)(3/5)=1/2≈0.7071\sqrt{(5/6)(3/5)}=\sqrt{1/2}\approx0.7071。

再看截断的作用:如果候选句是 cat cat cat,参考句里只有一个 cat,修正后的 p1p_1 是 1/31/3 而不是 1。

不做平滑的 BLEU 只要有一阶 pn=0p_n=0,整体就是 0,短句尤其容易碰到。因此报告 BLEU 时要写明用到几阶、是否平滑、是句子级还是语料级。语料级 BLEU 是把所有句子的匹配计数加总后再算,不是各句分数的平均。实现细节可参考 NLTK BLEU 文档。

5. ROUGE:参考句的内容被覆盖了多少

ROUGE-N 通常以参考句中的 n-gram 为分母,计算召回率;也可以同时报告精确率和 F1。上例参考句有 6 个 unigram、5 个 bigram,所以 ROUGE-1 召回率为 5/65/6,ROUGE-2 召回率为 3/53/5。

ROUGE-L 用的是最长公共子序列(LCS):匹配的词不必连在一起,但先后顺序必须一致。上例的 LCS 是 a cat on the mat,长度为 5:

PL=5/6,RL=5/6,F1,L=5/6.P_L=5/6,\quad R_L=5/6,\quad F_{1,L}=5/6.

ROUGE-S 统计按顺序出现的“跳跃二元组”,即中间可以隔着别的词的词对。最多允许隔多远,由具体的变体规定,不同实现并不统一。

这些指标说到底都在数表面上的重合,不能可靠地检验语义或事实。把一个数字、一个否定词或一组人物关系改掉,匹配数往往只少一点,整句话的事实却已经变了。

6. METEOR:对齐加上碎片惩罚

METEOR 的不同版本可以把词形变化、同义词也算作匹配。下面先看只匹配完全相同词元的简化算法。设匹配上的词数为 mm:

P=m/c,R=m/r,Fmean=10PRR+9P.P=m/c,\qquad R=m/r,\qquad F_{mean}=\frac{10PR}{R+9P}.

FmeanF_{mean} 是一个偏重召回率的调和平均。然后根据匹配结果有多“碎”扣分:

penalty=0.5(chunksm)3,M=Fmean(1−penalty).penalty=0.5\left(\frac{chunks}{m}\right)^3,\qquad M=F_{mean}(1-penalty).

chunkschunks 是匹配上的词在两句中都连续、顺序也一致的块的个数;分母是匹配的词数 mm,不是候选句长度。上例有 5 个精确匹配,组成 a cat 和 on the mat 两块。由于 P=R=5/6P=R=5/6,Fmean=5/6F_{mean}=5/6,于是

M=56[1−0.5(25)3]=56×0.968≈0.8067.M=\frac56\left[1-0.5\left(\frac25\right)^3\right]=\frac56\times0.968\approx0.8067.

如果开启词干或同义词匹配,sits 和 is 可能被对齐,其他句子的匹配也会变。这已经是另一套实验配置,结果不能和上面直接比。

7. 选指标之前,先列出最怕犯的错

场景 主要看什么
实体抽取 按实体跨度和类型严格匹配的 P/R/F1
工单分流 各类的召回率、macro-F1、处理成本
机器翻译 BLEU 等自动指标,加上人工检查译文是否完整准确
摘要 内容覆盖、与原文的事实一致性、重复和冗余
检索 排在前面的结果是否相关,必要时用专门的排序指标

比较不同模型时,必须用同一个测试集、同一套预处理。测试集也不能反复拿来调阈值、挑超参数或修改规则;那样用过之后,它实际上已经变成了验证集。

自测

1. 已知 P=0.9、R=0.1,F1 大约是多少?

2×0.9×0.1/(0.9+0.1)=0.182\times0.9\times0.1/(0.9+0.1)=0.18。精确率再高,也掩盖不了严重的漏报。

2. 如果所有正负样本的分数都一样,按“并列算半次”计算,AUC 是多少?

每一对都算半次,AUC=0.5。这样的分数完全没有区分正负的排序能力。