# Summary
## 四种可能的结果
真阳性、假阳性
假阴性、真阴性
```Java
实际情况
有新冠 没新冠
┌─────────────────┐
预 有 │ 25人 10人 │ → 预测有病35人
测 新 │ (✓) (✗) │
结 冠 │ │
果 │ │
没 │ 5人 60人 │ → 预测没病65人
新 │ (✗) (✓) │
冠 └─────────────────┘
↓ ↓
实际30人 实际70人
```
# 从混淆矩阵计算各种指标
## 1. 准确率(Accuracy)
```python
准确率 = (TP + TN) / 总数
= (25 + 60) / 100
= 85%
含义:整体预测对了多少
问题:在不平衡数据上会误导
```
## 2. 精确率(Precision)
```python
精确率 = TP / (TP + FP)
= 25 / (25 + 10)
= 71.4%
含义:预测为阳性的里面,多少是真的
场景:当误报代价高时关注(如垃圾邮件)
```
## 3. 召回率(Recall)
```python
召回率 = TP / (TP + FN)
= 25 / (25 + 5)
= 83.3%
含义:实际阳性中,找出了多少
场景:当漏报代价高时关注(如癌症筛查)
```
## 4. F1分数
```python
F1 = 2 × (精确率 × 召回率) / (精确率 + 召回率)
= 2 × (0.714 × 0.833) / (0.714 + 0.833)
= 0.769
含义:精确率和召回率的平衡
```
# Cues
# Notes
我来用通俗易懂的方式介绍**混淆矩阵**(Confusion Matrix)。
## 什么是混淆矩阵?
混淆矩阵就是一个**表格**,展示模型预测的对错情况。名字叫"混淆"是因为它能清楚地显示模型在哪里"混淆"了。
## 从最简单的例子开始
### 场景:医院的新冠检测
假设医院检测了100个人:
```python
# 实际情况
实际有新冠: 30人
实际没新冠: 70人
# AI预测结果
预测有新冠: 35人
预测没新冠: 65人
```
## 四个格子的含义
### 1. 真阳性(True Positive, TP)= 25人
```Java
预测:有病 ✓
实际:有病 ✓
结果:预测正确!
例子:王大爷确实得了新冠,AI也检测出来了
```
### 2. 假阳性(False Positive, FP)= 10人
```Java
预测:有病 ✗
实际:没病 ✓
结果:虚惊一场(误报)
例子:李阿姨很健康,但AI说她有新冠
影响:李阿姨要隔离,浪费医疗资源
```
### 3. 假阴性(False Negative, FN)= 5人
```Java
预测:没病 ✗
实际:有病 ✓
结果:漏诊了(最危险!)
例子:张大哥有新冠,但AI说他没事
影响:张大哥到处走,传染其他人
```
### 4. 真阴性(True Negative, TN)= 60人
```Java
预测:没病 ✓
实际:没病 ✓
结果:预测正确!
例子:赵阿姨健康,AI也说她健康
```
## 实际应用案例
### 案例1:垃圾邮件过滤
```python
# 1000封邮件的检测结果
混淆矩阵 = {
"真垃圾被识别": 180, # TP: 垃圾邮件被正确拦截
"正常误判垃圾": 20, # FP: 重要邮件被误删(糟糕!)
"垃圾误判正常": 30, # FN: 垃圾邮件没拦住
"正常被识别": 770 # TN: 正常邮件正确通过
}
# 可视化
print("""
邮件过滤结果:
实际情况
垃圾邮件 正常邮件
┌─────────────────────┐
预 垃 │ 180封 20封 │ "老板的邮件被删了!"
测 圾 │ (✓) (✗) │
为 邮 │ │
件 │ │
│ │
正 │ 30封 770封 │ "垃圾邮件还是很多..."
常 │ (✗) (✓) │
件 └─────────────────────┘
""")
```
### 案例2:人脸识别门禁
```python
# 公司1000次进门记录
混淆矩阵 = {
"员工正确通过": 850, # TP
"陌生人被放行": 5, # FP(安全隐患!)
"员工被拦住": 50, # FN(体验不好)
"陌生人被拦": 95 # TN
}
# 不同错误的后果
if 陌生人被放行:
print("严重问题:公司安全受威胁")
if 员工被拦住:
print("体验问题:员工迟到,心情不好")
```
### 案例3:信用卡欺诈检测
```python
# 10000笔交易
欺诈检测结果 = """
实际情况
欺诈交易 正常交易
┌─────────────────────┐
预 欺 │ 85笔 200笔 │ 冻结285张卡
测 诈 │ (✓) (✗) │ 200个客户投诉
为 │ │
│ │
正 │ 15笔 9700笔 │
常 │ (✗) (✓) │ 15笔欺诈损失
└─────────────────────┘
"""
# 业务影响分析
损失分析 = {
"防止欺诈金额": 85 * 5000, # 42.5万
"客户投诉成本": 200 * 100, # 2万
"欺诈损失": 15 * 5000, # 7.5万
"净收益": "省了33万"
}
```
## 不平衡数据的陷阱
### 极端例子:信用卡欺诈
```python
# 10000笔交易,只有100笔欺诈
如果模型全部预测为"正常":
混淆矩阵 = """
欺诈 正常
┌──────────────────┐
欺诈│ 0 0 │
│ │
正常│ 100 9900 │
└──────────────────┘
"""
准确率 = 9900/10000 = 99%!
但是:完全没有检测出欺诈!
```
## 多分类混淆矩阵
### 例子:图片分类(猫、狗、鸟)
```python
三分类混淆矩阵 = """
预测结果
猫 狗 鸟
┌──────────────┐
真 猫│ 45 3 2 │ 50张猫图
实 狗│ 5 40 5 │ 50张狗图
鸟│ 2 3 45 │ 50张鸟图
└──────────────┘
52 46 52
```
### 解读
```python
# 对角线 = 预测正确
猫识别正确: 45/50 = 90%
狗识别正确: 40/50 = 80%
鸟识别正确: 45/50 = 90%
# 非对角线 = 混淆情况
最常见混淆: 5只狗被认成猫,5只狗被认成鸟
原因分析: 可能是某些狗的照片角度特殊
```
## 可视化混淆矩阵
```python
import seaborn as sns
import matplotlib.pyplot as plt
# 创建混淆矩阵
confusion_matrix = [[25, 10],
[5, 60]]
# 热力图可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix,
annot=True, # 显示数字
fmt='d', # 整数格式
cmap='Blues', # 颜色
xticklabels=['预测:有病', '预测:没病'],
yticklabels=['实际:有病', '实际:没病'])
plt.title('新冠检测混淆矩阵')
plt.ylabel('实际情况')
plt.xlabel('预测结果')
# 添加文字说明
plt.text(0.5, 0.5, '✓\n正确', ha='center', va='center', fontsize=20, color='white')
plt.text(1.5, 0.5, '✗\n误报', ha='center', va='center', fontsize=20, color='white')
plt.text(0.5, 1.5, '✗\n漏诊', ha='center', va='center', fontsize=20, color='white')
plt.text(1.5, 1.5, '✓\n正确', ha='center', va='center', fontsize=20, color='white')
```
## 如何改进模型?
### 根据混淆矩阵分析
```python
# 如果FP(误报)太多
if 假阳性 > 可接受范围:
建议 = """
1. 提高预测阈值
2. 增加更多阴性样本训练
3. 检查是否有特征导致误判
"""
# 如果FN(漏报)太多
if 假阴性 > 可接受范围:
建议 = """
1. 降低预测阈值
2. 增加更多阳性样本训练
3. 增强关键特征的权重
"""
```
## 实用技巧
### 1. 记忆口诀
```Java
True = 预测对了
False = 预测错了
Positive = 预测为正(阳性)
Negative = 预测为负(阴性)
TP: 真的阳性(✓✓)
FP: 假的阳性(✗✓)- 误报警
FN: 假的阴性(✗✓)- 漏网鱼
TN: 真的阴性(✓✓)
```
### 2. 关注重点
```python
# 医疗场景:宁可误报,不可漏诊
重点关注 = "降低FN(假阴性)"
# 垃圾邮件:不能误删重要邮件
重点关注 = "降低FP(假阳性)"
# 平衡场景:综合考虑
重点关注 = "F1分数"
```
## 总结
**混淆矩阵的价值**:
1. **一目了然**:四个数字看清模型表现
2. **发现问题**:知道模型在哪里"混淆"
3. **指导改进**:根据错误类型调整策略
4. **业务决策**:评估不同错误的代价
**记住核心**:
- 对角线上的数字越大越好(预测正确)
- 非对角线上的数字越小越好(预测错误)
- 不同场景关注不同的错误类型
混淆矩阵就像模型的"成绩单",不仅告诉你对错,还告诉你错在哪里,怎么改进!