03 类别不平衡下如何选择评估指标:Accuracy 为什么会失效?
在现实数据中,类别经常并不平衡。
例如:
text
信用卡欺诈:
正常交易 99.9%
欺诈交易 0.1%
设备故障:
正常状态 99%
故障状态 1%
罕见病筛查:
健康人 99.5%
患者 0.5%
这类问题被称为:
text
Imbalanced Classification
类别不平衡分类
此时单纯使用 Accuracy 往往非常危险。
一、一个 Accuracy = 99% 的"垃圾模型"
假设:
text
总样本:10000
正常样本:9900
异常样本:100
现在构造一个最简单的模型:
text
永远预测 Normal
那么:
text
TN = 9900
FN = 100
TP = 0
FP = 0
Accuracy 为:
Accuracy=990010000=0.99Accuracy=\frac{9900}{10000}=0.99Accuracy=100009900=0.99
也就是:
text
99%
但是这个模型:
text
一个异常都没有发现
因此:
Recall=00+100=0Recall=\frac{0}{0+100}=0Recall=0+1000=0
这说明:
在严重类别不平衡的数据中,高 Accuracy 可能完全没有意义。
二、选择指标的核心不是"哪个指标最好"
真正的问题应该是:
哪一种错误更加不能接受?
对于二分类模型,最重要的两种错误是:
text
FP
FN
因此,指标选择应该从错误代价开始。
三、什么时候更加关注 Recall?
Recall 为:
Recall=TPTP+FNRecall=\frac{TP}{TP+FN}Recall=TP+FNTP
如果 FN 的代价非常高,就应该更加关注 Recall。
例如:
text
癌症筛查
危险设备故障
欺诈交易初筛
安全风险检测
火灾报警
在癌症筛查中:
text
FN = 患者有病,但模型认为没病
这可能比:
text
FP = 健康人被建议进一步检查
更加严重。
因此通常希望:
text
FN 尽可能少
Recall 尽可能高
四、什么时候更加关注 Precision?
Precision 为:
Precision=TPTP+FPPrecision=\frac{TP}{TP+FP}Precision=TP+FPTP
如果 FP 的代价非常高,就应该更加关注 Precision。
例如:
text
自动封禁账号
自动删除内容
高成本人工复核
高价值客户营销
刑事风险预警
假设模型用于自动封禁用户:
text
FP = 正常用户被错误封禁
那么 FP 的业务成本非常高。
此时希望:
text
模型只有非常确定时
才预测 Positive
也就是强调 Precision。
五、Precision vs TPR:为什么有时必须看 Precision?
Recall 也叫:
text
TPR
True Positive Rate
公式:
TPR=TPTP+FNTPR=\frac{TP}{TP+FN}TPR=TP+FNTP
TPR 只关注:
text
真实 Positive
它并不知道负样本到底有多少。
这在类别极度不平衡时会产生问题。
六、一个关键例子
假设:
text
Positive = 100
Negative = 99900
某模型得到:
text
TP = 90
FN = 10
FP = 999
TN = 98901
那么:
TPR=90100=0.9TPR=\frac{90}{100}=0.9TPR=10090=0.9
也就是:
text
Recall = 90%
同时:
FPR=99999900=0.01FPR=\frac{999}{99900}=0.01FPR=99900999=0.01
FPR 只有:
text
1%
表面上看似乎很好:
text
TPR = 90%
FPR = 1%
但是 Precision 为:
Precision=9090+999≈0.0826Precision=\frac{90}{90+999}\approx0.0826Precision=90+99990≈0.0826
只有:
text
约 8.3%
也就是说:
模型预测出来的 Positive 中,超过 90% 都是假警报。
原因就在于:
text
Negative 的数量远远超过 Positive
即使 FPR 很低,也可能产生大量 FP。
因此在严重类别不平衡问题中:
Precision 往往比单独观察 TPR 和 FPR 更直观。
七、为什么 ROC 在极端不平衡数据上也要谨慎?
ROC 使用:
text
TPR
FPR
由于:
FPR=FPFP+TNFPR=\frac{FP}{FP+TN}FPR=FP+TNFP
当 Negative 数量特别大时,即使 FP 数量已经很多:
text
FPR 仍然可能很小
因此 ROC 曲线可能看起来很好。
但是对于"预测出来的正样本到底有多少是真的"这个问题,Precision 更直接。
所以极端不平衡任务中经常同时关注:
text
Precision
Recall
F1
PR Curve
PR-AUC
而不是只看 Accuracy 或 ROC-AUC。
八、F1 什么时候合适?
F1 为:
F1=2×Precision×RecallPrecision+RecallF1=2\times\frac{Precision\times Recall}{Precision+Recall}F1=2×Precision+RecallPrecision×Recall
如果:
text
Precision 很重要
Recall 也很重要
而且希望用一个数综合比较模型,可以使用 F1。
但是需要注意:
F1 不考虑 TN。
因此当正确识别负样本本身也非常重要时,不能只看 F1。
九、Specificity 什么时候重要?
Specificity 为:
Specificity=TNTN+FPSpecificity=\frac{TN}{TN+FP}Specificity=TN+FPTN
它关注:
真正的 Negative 中,有多少被正确排除。
在医学检测中,经常同时报告:
text
Sensitivity
Specificity
其中:
text
Sensitivity → 能不能找到患者
Specificity → 能不能正确排除健康人
十、可以从"错误成本"选择指标
一个非常实用的思路:
| 任务重点 | 更值得关注 |
|---|---|
| 两类数量接近,错误代价类似 | Accuracy |
| 尽量不要漏掉正类 | Recall / Sensitivity |
| 预测为正时必须可靠 | Precision |
| 正类、负类都希望兼顾 | F1 + Specificity + Confusion Matrix |
| 希望比较阈值变化 | ROC / PR Curve |
| 极度类别不平衡 | Precision、Recall、F1、PR-AUC |
| 医疗筛查 | Sensitivity + Specificity |
| 自动高风险动作 | Precision |
十一、不要把指标选择和阈值选择混为一谈
假设模型输出概率:
text
0.91
0.73
0.55
0.42
0.21
默认使用:
text
threshold = 0.5
并不意味着:
text
0.5 就一定是最佳阈值
降低阈值通常会:
text
Recall ↑
Precision 可能 ↓
提高阈值通常会:
text
Precision ↑
Recall 可能 ↓
因此真实模型部署中经常需要两步:
text
第一步:训练模型
第二步:根据业务成本选择 threshold
十二、推荐的评估思维
不要问:
text
这个模型 Accuracy 是多少?
而应该问:
text
正类占比是多少?
混淆矩阵是什么?
FP 和 FN 分别是多少?
Precision 是多少?
Recall 是多少?
Specificity 是多少?
模型的 threshold 是多少?
这个 threshold 为什么合理?
这套问题能够大幅减少对分类模型的误判。
十三、总结
类别不平衡时最重要的原则是:
不要让多数类别把少数类别的问题"淹没"。
尤其是:
text
Accuracy = 99%
并不意味着模型好。
真正需要理解的是:
text
模型漏掉了多少关键正样本?
模型产生了多少假警报?
这些错误各自的代价是什么?
下一篇将进一步讨论 threshold 改变时模型表现如何变化,以及 ROC Curve 和 AUC 如何用于模型比较。