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

相关推荐
成都佳洋光电科技有限公司几秒前
短波红外相机在穿透烟、雾、霾中的应用
人工智能·工业相机·工业镜头·短波红外·红外热像仪
9i编程4 分钟前
6. 对SKILL进行一次全新尝试,改为框架+细节方式的实践及验证:admin-web联调与bug修复
人工智能·openai·ai编程
别动我齐刘海4 分钟前
从0到1独立搭建机器人软件系统
c++·人工智能·神经网络·opencv·目标检测·机器学习·机器人
夏夜霜6 分钟前
糖球系列③:ESP 圆屏不跑模型,它只是后台的语音客户端
人工智能
小宋10217 分钟前
MCP 是什么:从零编写一个可供 AI 调用的工具服务
人工智能·github
桃西西呀9 分钟前
AI 为什么一本正经地胡说八道?3 个底层原因 + 2 个防坑法
人工智能·llm·ai编程
天空11010 分钟前
Claude Code 怎么换用 Claude Fable 5.1:配置步骤、端点验证方法,以及缓存降价 75% 到底省了多少(2026 年 9 月)
人工智能·ai编程
船厂电气自动化ai大模型12 分钟前
AI大模型与数学第64课:矩阵×向量乘法(神经网络矩阵运算底层)
数据结构·深度学习·线性代数·机器学习·推荐算法
用户7686874404913 分钟前
我为什么不用 OpenAI 的 function calling,自己用正则解析工具调用
人工智能
正在走向自律13 分钟前
从 Python 基础到大模型落地:读《深入浅出 Python 人工智能》,吃透 AI 工程化 CRUD 实战
开发语言·人工智能·python·机器学习·知识脉络