# 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. **业务决策**:评估不同错误的代价 **记住核心**: - 对角线上的数字越大越好(预测正确) - 非对角线上的数字越小越好(预测错误) - 不同场景关注不同的错误类型 混淆矩阵就像模型的"成绩单",不仅告诉你对错,还告诉你错在哪里,怎么改进!