混淆矩阵及精确率、召回率、F1值介绍
1 课程概览
本课讲解分类问题的评估方法。逻辑回归做分类不能只使用准确率,需要通过精确率、召回率、F1值、ROC曲线、AUC指标等评估。核心是掌握混淆矩阵,通过它计算精确率、召回率和F1值。
2 核心概念与定义
- 混淆矩阵:分类模型评估的基础矩阵。
- TP(真正例):真实为正例,预测为正例。
- FN(伪反例):真实为正例,预测为反例。
- FP(伪正例):真实为反例,预测为正例。
- TN(真反例):真实为反例,预测为反例。
- 精确率(Precision):真正例在预测为正例中的占比。
- 召回率(Recall):真正例在真实正例中的占比。
- F1值:精确率和召回率的调和平均数。
3 算法与模型详解
3.1 为什么不能只用准确率
问题:癌症患者没有被全部检测出来
示例:
- 张三去医院检测是否得癌
- 医院说:97%概率正确
- 但张三无法接受3%的误判风险
结论:需要精确率、召回率、F1值、ROC曲线、AUC值等指标
3.2 混淆矩阵
矩阵结构:
| 预测为正例 | 预测为反例 | |
|---|---|---|
| 真实为正例 | TP(真正例) | FN(伪反例) |
| 真实为反例 | FP(伪正例) | TN(真反例) |
四个术语:
| 缩写 | 全称 | 含义 |
|---|---|---|
| TP | True Positive | 真正例(真实正例,预测正例) |
| FN | False Negative | 伪反例(真实正例,预测反例) |
| FP | False Positive | 伪正例(真实反例,预测正例) |
| TN | True Negative | 真反例(真实反例,预测反例) |
记忆技巧:
- True/False:表示预测是否正确
- Positive/Negative:表示预测结果
- 对角线(TP, TN)是预测正确的
- 非对角线(FP, FN)是预测错误的
3.3 精确率(Precision)
别名:查准率
定义:真正例在预测为正例中的占比
公式: $$\text{Precision} = \frac{TP}{TP + FP}$$
理解:竖着看,预测为正例的样本中有多少是真正的正例
示例:恶性肿瘤当作正例,想知道模型对恶性肿瘤的预测准确率
3.4 召回率(Recall)
别名:查全率
定义:真正例在真实正例中的占比
公式: $$\text{Recall} = \frac{TP}{TP + FN}$$
理解:横着看,真实正例的样本中有多少被预测出来了
示例:恶性肿瘤当作正例,想知道能不能把所有恶性肿瘤都预测出来
3.5 F1值
定义:精确率和召回率的调和平均数
公式: $$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$$
作用:同时考虑精确率和召回率
3.6 精确率 vs 召回率
| 对比 | 精确率 | 召回率 |
|---|---|---|
| 别名 | 查准率 | 查全率 |
| 方向 | 竖着看 | 横着看 |
| 分母 | TP+FP(预测为正例) | TP+FN(真实为正例) |
| 含义 | 预测为正例的准确率 | 真实正例的检出率 |
3.7 案例计算
数据:10个样本
- 真实值:6个恶性(正例),4个良性(反例)
- 假设:恶性为正例
模型A:
| 预测正例 | 预测反例 | |
|---|---|---|
| 真实正例 | TP=3 | FN=3 |
| 真实反例 | FP=0 | TN=4 |
模型A计算:
- 精确率 = 3/(3+0) = 100%
- 召回率 = 3/(3+3) = 50%
- F1值 = 2×1×0.5/(1+0.5) = 0.667
模型B:
| 预测正例 | 预测反例 | |
|---|---|---|
| 真实正例 | TP=6 | FN=0 |
| 真实反例 | FP=3 | TN=1 |
模型B计算:
- 精确率 = 6/(6+3) = 66.7%
- 召回率 = 6/(6+0) = 100%
- F1值 = 2×0.667×1/(0.667+1) = 80%
3.8 API介绍
| 指标 | 函数名 | 说明 |
|---|---|---|
| 精确率 | precision_score | 查准率 |
| 召回率 | recall_score | 查全率 |
| F1值 | f1_score | 调和平均数 |
| 混淆矩阵 | confusion_matrix | 混淆矩阵 |
4 数学原理与推导
4.1 混淆矩阵
$$\text{混淆矩阵} = \begin{bmatrix} TP & FN \ FP & TN \end{bmatrix}$$
4.2 精确率
$$\text{Precision} = \frac{TP}{TP + FP}$$
4.3 召回率
$$\text{Recall} = \frac{TP}{TP + FN}$$
4.4 F1值
$$F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} = \frac{2TP}{2TP + FP + FN}$$
4.5 准确率
$$\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}$$
5 代码示例
import numpy as np
import pandas as pd
from sklearn.metrics import (
confusion_matrix,
precision_score,
recall_score,
f1_score,
accuracy_score
)
# 1. 准备数据
# 10个样本:6个恶性(正例,1),4个良性(反例,0)
y_true = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
# 模型A预测结果
y_pred_A = [1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
# 模型B预测结果
y_pred_B = [1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
# 2. 计算混淆矩阵
print("=== 模型A ===")
cm_A = confusion_matrix(y_true, y_pred_A)
print("混淆矩阵:")
print(cm_A)
# 输出: [[4, 0], [3, 3]] → TN=4, FP=0, FN=3, TP=3
print("\n=== 模型B ===")
cm_B = confusion_matrix(y_true, y_pred_B)
print("混淆矩阵:")
print(cm_B)
# 输出: [[1, 3], [0, 6]] → TN=1, FP=3, FN=0, TP=6
# 3. 计算评估指标
def evaluate_model(y_true, y_pred, model_name):
"""评估模型"""
print(f"\n=== {model_name} 评估 ===")
# 混淆矩阵
cm = confusion_matrix(y_true, y_pred)
tn, fp, fn, tp = cm.ravel()
print(f"TP={tp}, FP={fp}, FN={fn}, TN={tn}")
print(f"准确率: {accuracy_score(y_true, y_pred):.4f}")
print(f"精确率: {precision_score(y_true, y_pred):.4f}")
print(f"召回率: {recall_score(y_true, y_pred):.4f}")
print(f"F1值: {f1_score(y_true, y_pred):.4f}")
# 评估两个模型
evaluate_model(y_true, y_pred_A, "模型A")
evaluate_model(y_true, y_pred_B, "模型B")
# 4. 用DataFrame展示混淆矩阵
def show_confusion_matrix(y_true, y_pred, model_name):
"""用DataFrame展示混淆矩阵"""
cm = confusion_matrix(y_true, y_pred)
df = pd.DataFrame(
cm,
index=['真实良性(0)', '真实恶性(1)'],
columns=['预测良性(0)', '预测恶性(1)']
)
print(f"\n{model_name} 混淆矩阵:")
print(df)
show_confusion_matrix(y_true, y_pred_A, "模型A")
show_confusion_matrix(y_true, y_pred_B, "模型B")
输出示例:
=== 模型A ===
混淆矩阵:
[[4 0]
[3 3]]
=== 模型B ===
混淆矩阵:
[[1 3]
[0 6]]
=== 模型A 评估 ===
TP=3, FP=0, FN=3, TN=4
准确率: 0.7000
精确率: 1.0000
召回率: 0.5000
F1值: 0.6667
=== 模型B 评估 ===
TP=6, FP=3, FN=0, TN=1
准确率: 0.7000
精确率: 0.6667
召回率: 1.0000
F1值: 0.8000
模型A 混淆矩阵:
预测良性(0) 预测恶性(1)
真实良性(0) 4 0
真实恶性(1) 3 3
模型B 混淆矩阵:
预测良性(0) 预测恶性(1)
真实良性(0) 1 3
真实恶性(1) 0 6
6 重难点与易错提醒
- ❗重点:混淆矩阵是计算所有指标的基础。
- ❗重点:精确率 = TP/(TP+FP),竖着看。
- ❗重点:召回率 = TP/(TP+FN),横着看。
- ❗重点:F1值 = 2×精确率×召回率/(精确率+召回率)。
- ❗重点:默认类别少的为正例。
- ⚠️易错:混淆TP和FP的方向。
- ⚠️易错:混淆精确率和召回率。
- 💡深入理解:精确率和召回率往往此消彼长,需用F1值平衡。
7 课堂问答精选
Q: 为什么不能只用准确率评估分类模型?
A: 准确率不能满足所有场景。例如癌症检测,如果只看准确率97%,但仍有3%的癌症患者可能被漏诊,这对患者来说是致命的。因此需要精确率(查准率)、召回率(查全率)、F1值等指标来全面评估模型。
Q: 精确率和召回率有什么区别?
A:
- 精确率(查准率):竖着看,TP/(TP+FP),预测为正例的样本中有多少是真正的正例。
- 召回率(查全率):横着看,TP/(TP+FN),真实正例的样本中有多少被预测出来了。 精确率关注预测的准确性,召回率关注是否漏检。
8 本课小结
- 混淆矩阵:TP、FN、FP、TN四个值。
- 精确率:TP/(TP+FP),查准率。
- 召回率:TP/(TP+FN),查全率。
- F1值:2×精确率×召回率/(精确率+召回率)。
- API:precision_score、recall_score、f1_score、confusion_matrix。
9 延伸思考与实践
- 实践:用Python计算混淆矩阵和评估指标。
- 预习:ROC曲线和AUC值。
- 思考:如何根据业务场景选择精确率还是召回率?