混淆矩阵总结
1 课程概览
本课对混淆矩阵进行总结,复习精确率、召回率、F1值的计算公式,并通过选择题巩固知识点。重点讲解精确率和召回率的区别,以及F1值的计算方法。
2 核心概念与定义
- 混淆矩阵:四个指标(真实正例、真实反例、预测正例、预测反例)的组合。
- 精确率:预测为正例中实际为正例的比例。
- 召回率:实际为正例中被预测为正例的比例。
- F1值:精确率和召回率的调和平均数。
3 算法与模型详解
3.1 混淆矩阵总结
四个指标:
| 指标 | 公式 | 说明 |
|---|---|---|
| 精确率 | TP/(TP+FP) | 预测为正例中实际为正例的比例 |
| 召回率 | TP/(TP+FN) | 实际为正例中被预测为正例的比例 |
| F1值 | 2×精确率×召回率/(精确率+召回率) | 调和平均数 |
3.2 精确率 vs 召回率
精确率:
- 竖着看
- 预测为正例的样本中,实际为正例的占比
- 公式:TP/(TP+FP)
召回率:
- 横着看
- 实际为正例的样本中,被预测为正例的占比
- 公式:TP/(TP+FN)
3.3 选择题解析
题目1:精确率指的是?
- A. 预测为正例中实际为正例的比例 ✓
- B. 实际为正例中被预测为正例的比例
- C. 其他描述
答案:A
解析:
- 精确率:预测为正例 → 实际为正例(竖着看)
- 召回率:实际为正例 → 预测为正例(横着看)
题目2:已知精确率=0.8,召回率=0.6,求F1值?
计算过程: $$F1 = \frac{2 \times 0.8 \times 0.6}{0.8 + 0.6} = \frac{0.96}{1.4} = 0.6857...$$
四舍五入:
- 0.6857... → 0.69(四舍五入)
- 如果选项有0.68和0.69,选0.69
答案:C(0.69)
3.4 F1值计算详解
公式: $$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
示例计算(精确率=0.8,召回率=0.6):
- 分子:2 × 0.8 × 0.6 = 0.96
- 分母:0.8 + 0.6 = 1.4
- F1 = 0.96 / 1.4 = 0.6857...
- 四舍五入:0.69
4 数学原理与推导
4.1 精确率
$$\text{Precision} = \frac{TP}{TP + FP}$$
4.2 召回率
$$\text{Recall} = \frac{TP}{TP + FN}$$
4.3 F1值
$$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} = \frac{2TP}{2TP + FP + FN}$$
5 代码示例
from sklearn.metrics import precision_score, recall_score, f1_score
# 1. 选择题1验证:精确率定义
y_true = [1, 1, 1, 0, 0] # 3个正例,2个反例
y_pred = [1, 1, 0, 1, 0] # 预测结果
# 混淆矩阵: TP=2, FP=1, FN=1, TN=1
# 精确率 = TP/(TP+FP) = 2/3 = 0.667
# 召回率 = TP/(TP+FN) = 2/3 = 0.667
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(f"精确率: {precision:.4f}") # 0.6667
print(f"召回率: {recall:.4f}") # 0.6667
print(f"F1值: {f1:.4f}") # 0.6667
# 2. 选择题2验证:F1值计算
precision_val = 0.8
recall_val = 0.6
f1_manual = 2 * precision_val * recall_val / (precision_val + recall_val)
print(f"\n精确率={precision_val}, 召回率={recall_val}")
print(f"F1值(手动计算): {f1_manual:.4f}") # 0.6857
print(f"F1值(四舍五入): {round(f1_manual, 2)}") # 0.69
# 3. 验证不同精确率和召回率组合的F1值
test_cases = [
(0.8, 0.6),
(0.9, 0.5),
(0.7, 0.7),
(1.0, 0.5),
(0.5, 1.0)
]
print("\n=== F1值计算表 ===")
print("精确率\t召回率\tF1值")
for p, r in test_cases:
f1 = 2 * p * r / (p + r)
print(f"{p}\t{r}\t{f1:.4f}")
输出示例:
精确率: 0.6667
召回率: 0.6667
F1值: 0.6667
精确率=0.8, 召回率=0.6
F1值(手动计算): 0.6857
F1值(四舍五入): 0.69
=== F1值计算表 ===
精确率 召回率 F1值
0.8 0.6 0.6857
0.9 0.5 0.6429
0.7 0.7 0.7000
1.0 0.5 0.6667
0.5 1.0 0.6667
6 重难点与易错提醒
- ❗重点:精确率 = TP/(TP+FP),竖着看。
- ❗重点:召回率 = TP/(TP+FN),横着看。
- ❗重点:F1值 = 2×精确率×召回率/(精确率+召回率)。
- ❗重点:F1值是精确率和召回率的调和平均数。
- ⚠️易错:混淆精确率和召回率的方向。
- ⚠️易错:F1值计算时四舍五入的精度问题。
- 💡深入理解:精确率和召回率往往此消彼长,F1值用于平衡。
7 课堂问答精选
Q: 精确率和召回率的区别是什么?
A:
- 精确率:预测为正例中实际为正例的比例(竖着看),公式:TP/(TP+FP)。
- 召回率:实际为正例中被预测为正例的比例(横着看),公式:TP/(TP+FN)。 精确率关注预测的准确性,召回率关注是否漏检。
Q: 如何计算F1值?
A: F1值 = 2 × 精确率 × 召回率 / (精确率 + 召回率) 例如:精确率=0.8,召回率=0.6 F1 = 2 × 0.8 × 0.6 / (0.8 + 0.6) = 0.96 / 1.4 = 0.6857 ≈ 0.69
8 本课小结
- 精确率:预测为正例中实际为正例的比例。
- 召回率:实际为正例中被预测为正例的比例。
- F1值:精确率和召回率的调和平均数。
- 计算时注意四舍五入的精度。
9 延伸思考与实践
- 实践:计算不同精确率和召回率组合的F1值。
- 预习:ROC曲线和AUC指标。
- 思考:为什么需要F1值?