3. 准确率(Accuracy):定义、计算公式、适用场景与陷阱
3.1 定义与计算公式
准确率(Accuracy)是分类模型最直观的评估指标。
说白了,就是「猜对的次数」除以「总次数」。公式长这样:
Accuracy = (TP + TN) / (TP + TN + FP + FN)
其中:
- TP —— 真正例(正确预测为正类)
- TN —— 真负例(正确预测为负类)
- FP —— 假正例(误报)
- FN —— 假负例(漏报)
我个人习惯把准确率拆成四个字母——TP、TN、FP、FN。你想想看,分子是「两个正确」之和,分母是「所有可能」。从混淆矩阵的角度理解,准确率就是主对角线之和除以矩阵总和。
小提示: 准确率的值域是 [0, 1]。0 表示全错,1 表示全对。但在真实项目中,0.9 以上才算「可用」,0.95 以上才算「良好」。
3.2 适用场景
准确率不是万能的。我建议只在以下两种场景把它当作核心指标:
- 类别分布平衡 —— 正负样本比例接近 1:1。比如性别分类,男女各占一半。
- 各类错误代价相等 —— FP 和 FN 带来的损失差不多。比如手写数字识别,把 3 误判成 8 和把 8 误判成 3,代价几乎一样。
举个具体例子。我在项目中做过一个垃圾短信分类器,训练集里正常短信和垃圾短信比例是 50:50。这时候准确率 0.92,基本能反映真实表现。靠谱。
典型案例: MNIST 手写数字识别、CIFAR-10 图像分类(每类样本均衡)、真假新闻检测(类别平衡版本)。
3.3 陷阱与局限性
准确率有个巨坑——类别不平衡。这是我见过最频繁的误用场景。
我在项目中遇到过准确率接近 99% 但模型完全无效的情况。当时是一个医疗筛查任务,阳性样本只占 1%。模型把所有样本都判为阴性,准确率直接 99%。但这个模型查不出任何一个病人,上线等于杀人。
为什么会这样?因为分母被多数类绑架了。模型只要押注多数类,就能轻松拿到高准确率。
| 场景 | 正类占比 | 准确率 | 实际效果 | 说明 |
|---|---|---|---|---|
| 平衡数据集 | 50% | 0.85 | 可信 | 准确率能反映真实能力 |
| 轻度不平衡 | 20% | 0.90 | 部分可信 | 需结合 Precision/Recall 验证 |
| 严重不平衡 | 5% | 0.95 | 误导 | 全部预测为负类即可达 95% |
| 极端不平衡 | 1% | 0.99 | 完全误导 | 模型可能毫无预测能力 |
避坑指南: 我曾经在一个信贷风控项目里,被准确率坑过一次。项目初期模型准确率高达 97%,团队都很兴奋。上线后坏账率不降反升。一查才发现,坏账样本只占 3%,模型全部预测为「正常」,准确率当然高,但完全没有风控能力。从那以后,我每次看准确率都会同步查混淆矩阵和类别分布。
准确率的第二个陷阱是掩盖错误类型。FP 和 FN 的代价可能天差地别。在癌症筛查里,FN(漏诊)的代价远高于 FP(误诊)。但准确率把两者混在一起,你根本看不出来模型到底犯了哪种错。
3.4 代码实战:准确率计算与陷阱验证
下面用 Python 演示准确率的计算,以及类别不平衡如何「伪造」高准确率。
# 示例1:准确率计算 + 混淆矩阵
from sklearn.metrics import accuracy_score, confusion_matrix
y_true = [0, 1, 0, 0, 1, 1, 0, 0, 1, 0]
y_pred = [0, 1, 0, 0, 1, 0, 0, 1, 1, 0]
acc = accuracy_score(y_true, y_pred)
cm = confusion_matrix(y_true, y_pred)
print(f"Accuracy: {acc:.3f}")
print("Confusion Matrix:")
print(cm)
# 示例2:类别不平衡陷阱 —— 95% 负类,5% 正类
from sklearn.metrics import accuracy_score
y_true = [0] * 95 + [1] * 5
y_pred_all_zero = [0] * 100 # 全部预测为负类
acc = accuracy_score(y_true, y_pred_all_zero)
print(f"Accuracy (全部预测为0): {acc:.3f}")
# 输出 0.950 —— 准确率 95%,但模型从未预测出正类
你想想看,第二个模型什么都没学会,准确率却高达 0.95。如果只看这个数字,你会觉得模型很棒,实际上它是个废模型。
我通常的做法: 先打印混淆矩阵,再算准确率。如果看到某一行或某一列是 0,说明模型已经「偏科」了。这时候准确率再高也不能信。
修正方案很简单:在类别不平衡时,改用 Precision、Recall、F1-score 或 AUC-ROC。这些指标会在后面的章节逐一讲解。
3.5 知识框架图
下面这张图把准确率的定义、适用场景、陷阱和改进路径串在一起,方便你整体把握。
3.6 本节要点
- 准确率 = (TP + TN) / 总样本数,是最直观的分类指标。
- 只在类别平衡且错误代价相等时,准确率才值得信赖。
- 类别不平衡会「伪造」高准确率——模型全猜多数类就能拿高分。
- 准确率无法区分 FP 和 FN,容易掩盖关键错误。
- 实战中,永远把准确率和混淆矩阵、类别分布一起看。