03 类别不平衡下如何选择评估指标:Accuracy 为什么会失效?

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 如何用于模型比较。

相关推荐
IT_陈寒1 小时前
Redis的KEYS命令差点把我的生产环境拖垮,改用SCAN吧
前端·人工智能·后端
野生技术架构师1 小时前
Multi-agent的新趋势,从Agent Team到Agent Swarm
开发语言·人工智能
狂师1 小时前
想做测试工具却不会写代码?怎么办?
人工智能·程序员·测试
xiangzhihong81 小时前
零基础学AI之机器学习原理
人工智能·机器学习·机器人
Aision_1 小时前
实习手记 Day:从 ELK 到 Agent 的“最后一公里”——告警消费与上下文富化
运维·人工智能·web安全·elk·网络安全·安全威胁分析
workbuddy小能手1 小时前
用 WorkBuddy 调混元 Hy3 做批量文档摘要:一个可运行的实战示例
人工智能·workbuddy
梦想的旅途21 小时前
企微私域 AI 创作:文案生成与 AI 配图自动化发布实战
人工智能·自动化·企业微信
Bruce_Liuxiaowei1 小时前
多模态AI在网络安全监控中的创新应用
人工智能·安全·web安全