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:1。比如性别分类,男女各占一半。
  2. 各类错误代价相等 —— 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 知识框架图

下面这张图把准确率的定义、适用场景、陷阱和改进路径串在一起,方便你整体把握。

准确率(Accuracy)知识框架 准确率(Accuracy)知识框架 准确率 Accuracy 计算公式 (TP+TN)/(TP+TN+FP+FN) 适用场景 类别平衡 · 代价相等 混淆矩阵 TP · TN · FP · FN 常见陷阱 类别不平衡 · 掩盖错误类型 改进建议 结合 Precision/Recall/F1 核心要点:准确率简单直观,但不平衡数据下需辅以其他指标

3.6 本节要点

  • 准确率 = (TP + TN) / 总样本数,是最直观的分类指标。
  • 只在类别平衡且错误代价相等时,准确率才值得信赖。
  • 类别不平衡会「伪造」高准确率——模型全猜多数类就能拿高分。
  • 准确率无法区分 FP 和 FN,容易掩盖关键错误。
  • 实战中,永远把准确率和混淆矩阵、类别分布一起看。