2、准确率的谎言:当正负样本极度不平衡时,准确率如何欺骗你
准确率(Accuracy)可能是大家最熟悉的指标了。我刚入行那会儿,也习惯性地先看准确率。直到有一次,我被它狠狠坑了一把。
那是一个信用卡欺诈检测项目。正样本(欺诈)只占0.1%,负样本(正常交易)占99.9%。我训练了一个模型,准确率高达99.8%。当时我还挺得意,觉得模型表现不错。
结果一上线,业务方就炸了。模型几乎没抓到任何欺诈交易。为什么?因为模型学到的策略很简单:把所有交易都预测为「正常」。这样准确率就是99.9%。
你看,准确率在这里完全失效了。它成了一个谎言。
2.1 准确率的定义与局限
准确率的公式很简单:
Accuracy = (TP + TN) / (TP + TN + FP + FN)
说白了,就是预测正确的样本数除以总样本数。
这个公式有个隐含假设:正负样本的重要性是相等的。但在很多真实场景中,这个假设根本不成立。
| 场景 | 正样本比例 | 准确率陷阱 |
|---|---|---|
| 信用卡欺诈检测 | 0.1% | 全判为正常,准确率99.9% |
| 罕见病诊断 | 0.01% | 全判为健康,准确率99.99% |
| 设备故障预测 | 1% | 全判为正常,准确率99% |
为什么会这样?因为准确率对多数类有天然的偏向。当负样本占绝对优势时,模型只要学会「躺平」——全部预测为负类,就能拿到很高的准确率。
2.2 一个真实的项目教训
我记得在2019年,我参与过一个工业质检项目。产品缺陷率大约0.5%。我们训练了一个缺陷检测模型,准确率达到了99.2%。
但实际测试时,模型漏掉了超过一半的缺陷产品。为什么?因为模型学到的决策边界严重偏向正常产品。它把很多「疑似缺陷」的样本都归为正常,因为这样能让准确率更高。
后来我们改用召回率(Recall)和精确率(Precision)来评估,才发现模型对缺陷的召回率只有42%。
这个教训让我养成了一个习惯:在PRD中,必须明确指定评估指标,不能只写「准确率不低于XX%」。尤其是当正负样本比例超过10:1时,准确率基本可以忽略。
2.3 什么时候可以用准确率?
准确率不是完全没用。我个人习惯在以下场景中使用它:
- 正负样本基本平衡(比例在1:1到3:1之间)
- 错误代价对称(假阳性与假阴性的代价相近)
- 作为基线指标(快速了解模型整体表现)
但一旦出现不平衡,我建议你立刻转向其他指标。
2.4 替代方案:用混淆矩阵说话
与其只看一个准确率数字,不如看混淆矩阵。它把预测结果分成四类:
预测为正 预测为负
实际为正 TP FN
实际为负 FP TN
从混淆矩阵可以衍生出三个更有用的指标:
- 精确率(Precision):TP / (TP + FP) —— 预测为正的样本中,有多少是真的正
- 召回率(Recall):TP / (TP + FN) —— 真正的正样本中,有多少被找出来了
- F1分数:2 * (Precision * Recall) / (Precision + Recall) —— 精确率和召回率的调和平均
2.5 避坑指南
我曾经在评审一个PRD时,看到需求里写着「模型准确率需达到95%以上」。数据集是用户流失预测,流失用户只占2%。
我当场就问:「如果模型把所有用户都预测为不流失,准确率是98%,这个模型能用吗?」
对方沉默了。后来我们把指标改成了「流失用户召回率不低于80%,同时精确率不低于60%」。
所以,写PRD时请记住:
- 不要只写准确率,尤其是在不平衡场景下
- 明确指定少数类的评估指标(召回率、精确率、F1)
- 如果业务方坚持用准确率,加上一个约束条件:「在保证少数类召回率不低于XX%的前提下」
2.6 小结
准确率是个好指标,但它有适用条件。当正负样本极度不平衡时,它就成了一个谎言。你想想看,一个99.9%准确率的模型,可能连一个欺诈交易都抓不到。这样的模型你敢上线吗?
在PRD中,请务必根据数据分布选择合适的评估指标。别让准确率欺骗了你,也别让它欺骗了你的业务方。