W4-2 准确率99%的分类器,为什么可能一个目标也找不到?

假设你想在一批产品照片里找出有缺陷的产品。有人展示一个分类器:“准确率99%。”这个数字很漂亮,但当你问它到底找出了多少件缺陷产品时,答案却可能是零。

这不需要篡改测试结果,也不需要复杂的数学。只要大部分照片本来就没有缺陷,一个几乎不干活的规则,就可能得到很高的总分。

99%究竟在数什么?

下面全部是为了说明问题而设计的假设数据,不是某个工厂或AI产品的实测结果。测试集有1000张照片,其中990张正常,10张有缺陷;每张照片只对应一件产品,真实类别已经确认。

分类器甲采用最简单的规则:不看照片,全部判为“正常”。它正确判断了990张正常照片,同时漏掉全部10张缺陷照片。

准确率就是“判断正确的样本数÷总样本数”,所以甲的准确率为990÷1000=99%。数字计算完全正确,找缺陷的任务却完全没有完成。

这样的规则并非只能当笑话。scikit-learn 的基线分类器文档就提供忽略输入特征、始终预测训练数据中最常见类别的策略,供复杂模型比较。基线的意义在于提醒我们:一个成绩,首先应该和不分析具体对象也能得到的成绩相比。

因此,看到99%时还要问一句:在这批样本上,始终猜数量最多的那一类,能得多少分?

把一个总分拆成四格

现在假设分类器乙会根据照片报警。在同一测试集上,它找到了8张缺陷照片,漏掉2张;同时把18张正常照片误报为缺陷,剩余972张正常照片判断正确。

把真实类别与预测类别交叉排列,就得到混淆矩阵。下表仍是教学假设,行表示真实类别,列表示预测类别:

真实情况 预测为缺陷 预测为正常
有缺陷:10张 8:正确检出 2:漏检
正常:990张 18:误报 972:正确放行

scikit-learn 对混淆矩阵的定义正是逐格统计真实类别与预测类别的组合。阅读不同资料时要先看行列标签,不能只凭格子位置认数字。

乙的准确率为(8+972)÷1000=98%,比甲低一个百分点。但它确实找到了大部分缺陷产品。总分下降,并不自动意味着它对当前任务更差;现在需要知道,漏检与误报各自带来什么后果。

找到了多少,与报得准不准,是两个问题

召回率问的是:全部真实目标中,找回了多少?乙的召回率为8÷10=80%,甲则为0÷10=0%。

精确率问的是:所有报出的目标中,真正的目标占多少?乙一共报警26次,其中8次正确,所以精确率为8÷26,约30.8%。换句话说,检查乙的报警清单时,仍会遇到不少正常产品。

这两个百分比的分母不同,不能互相替代。“找到了80%的缺陷”不意味着“80%的报警都有缺陷”。Google 的分类评价教程给出了准确率、召回率和精确率的数学定义,也解释了为什么类别不平衡时只看准确率容易误导。

甲从不报警,其精确率公式的分母为零,不能因此宣称它“报警百分之百准确”。报告这类结果时,应明确没有预测为目标的样本,并说明指标如何处理零分母。

多报警一些,就一定更好吗?

如果把全部照片都报为缺陷,召回率确实能达到100%,但人工仍要检查全部1000张照片。这相当于把筛选工作原封不动地交回去,并没有证明分类器能区分两类产品。

许多分类器先输出一个分数,再按阈值决定是否报警。对同一组固定分数,降低报警阈值会让更多样本进入报警清单;它可能同时增加正确检出与误报。抬高阈值则可能减少误报,也漏掉更多目标。Google 的阈值教程展示了这种变化,并说明阈值应结合任务与错误代价选择。

在这个假设场景里,如果误报只意味着多看一眼照片,漏检却会造成昂贵返工,团队可能愿意接受更多误报。若每次复核都很耗时,报警清单的长度也会成为限制。哪一个方案合适,不能只凭一个百分比决定;这些代价需要由实际工作流程提供,不能从示例替真实项目作结论。

一份有用的成绩单,还应交代什么?

至少要把测试样本总数、各类数量、四格计数、采用的阈值,以及漏检和误报的后果放在一起看。比较甲乙时,也必须说明是否使用了同一批样本、相同的类别定义和评价条件。

类别比例尤其不能省略:仍然全部猜“正常”,若正常照片只占一半,准确率就只剩50%。规则一点没变,成绩却变了。这是上述计数方式直接推得的结果,说明准确率与它所面对的样本组成相连。

示例中真实缺陷只有10张,多检出或少检出1张,召回率就会变化10个百分点。因此,报告80%时还要保留“10张真实缺陷中检出了8张”这层计数信息。小数位再多,也不能把有限的目标样本变多。

99%并不是一个没有意义的数字。它回答了“这批样本中总共有多少判对了”,却没有单独回答“目标有没有被找到”。即使把成绩写成99.000%,也没有补上被总分省略的那张表。先确认在测什么,再讨论数字有多漂亮,评价才真正开始。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注