混淆矩阵基础:TP、FP、TN、FN 的定义与计算
评估一个分类模型好不好,光看「准确率」往往不够。我刚开始做机器学习时,就吃过这个亏。
举个例子,一个数据集里 95% 是负样本,5% 是正样本。模型什么都不做,直接预测全部为负,准确率也有 95%。这模型能叫好吗?显然不能。这时候就需要更细的指标——而所有细指标,都建立在一个核心工具上:混淆矩阵。
到底什么是混淆矩阵?
说白了,混淆矩阵就是一个 2×2 的表格。它记录了模型预测结果和真实标签的四种组合情况。
我们以二分类为例(正类为 Positive,负类为 Negative):
- TP(True Positive):真实为正,预测也为正。模型判断对了。
- FP(False Positive):真实为负,预测为正。模型报错了,这叫「误报」。
- TN(True Negative):真实为负,预测也为负。模型判断对了。
- FN(False Negative):真实为正,预测为负。模型漏掉了,这叫「漏报」。
嗯,这里要注意。很多初学者会把 FP 和 FN 搞混。我个人习惯用一句话记:「FP 是模型太敏感,FN 是模型太迟钝」。
一个具体的计算例子
我们来看一组实际预测结果。假设有 10 个样本,真实标签和模型预测如下:
真实值: [1, 0, 1, 1, 0, 0, 1, 0, 0, 1]
预测值: [1, 0, 0, 1, 0, 1, 1, 0, 1, 1]
(1 代表正类,0 代表负类)
怎么算?我一般直接写代码统计,而不是手算。但理解原理,手算一次也无妨。
我们逐样本对比:
- 样本1:真实 1,预测 1 → TP
- 样本2:真实 0,预测 0 → TN
- 样本3:真实 1,预测 0 → FN
- 样本4:真实 1,预测 1 → TP
- 样本5:真实 0,预测 0 → TN
- 样本6:真实 0,预测 1 → FP
- 样本7:真实 1,预测 1 → TP
- 样本8:真实 0,预测 0 → TN
- 样本9:真实 0,预测 1 → FP
- 样本10:真实 1,预测 1 → TP
统计结果:
| 指标 | 计数 |
|---|---|
| TP | 4 |
| FP | 2 |
| TN | 3 |
| FN | 1 |
有了这个矩阵,你就能计算出几乎所有分类指标了。比如准确率 (TP+TN)/(TP+FP+TN+FN) = 7/10 = 0.7。但更重要的,是你能看出模型的问题——FP 有 2 个,FN 有 1 个,这意味着模型有点「激进」,容易把负类判成正类。
为什么混淆矩阵这么重要?
我个人觉得,混淆矩阵是评估体系的「地基」。一旦你构建好了这个 2×2 矩阵,后面的精确率、召回率、F1、ROC 曲线、AUC,全都是从这个矩阵衍生出来的。地基不稳,上面的指标全是空中楼阁。
让我用一张图来展示混淆矩阵的结构和它如何影响后续指标:
如何用代码生成混淆矩阵?
在实际项目中,我很少手工算。Python 的 sklearn 库提供了现成的方法:
from sklearn.metrics import confusion_matrix
y_true = [1, 0, 1, 1, 0, 0, 1, 0, 0, 1]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0, 1, 1]
cm = confusion_matrix(y_true, y_pred)
print(cm)
输出是一个 2×2 数组:
[[3 2]
[1 4]]
这里要注意 sklearn 的约定:行是真实值,列是预测值。所以第一行是真实负类(TN=3, FP=2),第二行是真实正类(FN=1, TP=4)。跟我刚才手算的结果完全一致。
一个常见的坑
你想想看,明明模型跑得还行,结果因为看反了矩阵,以为 FP 很多,调了半天阈值。这种事我见过不止一次。
多分类怎么处理?
对于多分类,混淆矩阵会变成 N×N 的形式。比如三分类,就是一个 3×3 矩阵。对角线上的元素就是预测正确的样本数,非对角线就是各种「混淆」情况。
举个例子,三分类(类别:0, 1, 2):
y_true = [0, 1, 2, 0, 1, 2, 0, 1, 2]
y_pred = [0, 1, 2, 0, 1, 1, 0, 0, 2]
cm = confusion_matrix(y_true, y_pred)
print(cm)
输出:
[[3 0 0]
[0 2 1]
[0 0 3]]
这意味着:
- 类别 0:全部预测正确,3 个 TP。
- 类别 1:2 个正确(位置 [1,1]),1 个被误判为类别 2(位置 [1,2])。
- 类别 2:全部正确。
多分类场景下,你可以选择「一对多」策略,把当前类别当正类,其他所有类别当负类,然后计算每个类别的精确率、召回率等指标。我个人习惯这样处理,因为可以单独分析每个类别的问题。
为什么要先学混淆矩阵?
因为后面的 AUC、RMSE 这些指标,虽然看起来高大上,但它们本质上都是在回答同一个问题:「模型在哪些地方犯了错,错得有多严重?」。混淆矩阵给了你第一个、也是最直观的答案。
搞懂了 TP、FP、TN、FN,你就掌握了评估模型好坏的「四则运算」。后面的知识都是在这个基础上做加法和乘法。地基打牢了,房子才不会塌。