第八章:模型评估与调优
学习目标
- 理解模型评估的意义和核心指标
- 掌握准确率、精确率、召回率、F1分数的计算与适用场景
- 理解过拟合与欠拟合的成因及偏差-方差权衡
- 掌握正则化方法(L1、L2、Dropout、数据增强)
- 了解交叉验证的原理与应用
前置要求
第七章:训练(理解损失函数、训练过程和常见问题)。
为什么需要评估?
训练完成后,需要评估模型性能,判断模型是否达到要求,是否可以投入使用。
核心问题
• 模型准确吗?
• 模型稳定吗?
• 模型能处理各种情况吗?
核心评估指标
准确率(Accuracy)
准确率是模型预测正确的比例。
公式
\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]
例如:100个样本,预测正确90个,准确率=90%
精确率与召回率
这两个指标用于评估分类模型的不同角度:
| 指标 | 含义 | 公式 | 应用场景 |
|---|---|---|---|
| 精确率(Precision) | 预测为正的样本中,真正为正的比例 | \(P = \frac{TP}{TP + FP}\) | "我说对的,有多少真的对" |
| 召回率(Recall) | 真正的正样本中,被预测为正的比例 | \(R = \frac{TP}{TP + FN}\) | "真的对的,我找出来多少" |
精确率 vs 召回率权衡
• 高精确率:宁可漏过,不可错报(医疗诊断——不误诊健康人)
• 高召回率:宁可错报,不可漏过(垃圾邮件检测——不漏掉垃圾邮件)
• 通常需要根据场景权衡
F1分数
F1分数是精确率和召回率的调和平均,综合评估模型性能。
F1分数公式
\[ F1 = 2 \times \frac{P \times R}{P + R} \]
当精确率和召回率都很重要时,使用F1分数作为综合指标。
损失值(Loss)
损失值衡量模型预测与真实答案的差距,训练过程中持续下降说明模型在学习。
- 训练初期:损失值高,模型在学习
- 训练中期:损失值下降,模型进步
- 训练后期:损失值稳定,模型收敛
评估指标的Python代码示例
from sklearn.metrics import (
accuracy_score, precision_score,
recall_score, f1_score, confusion_matrix
)
# 真实标签和模型预测
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 1, 0]
# 计算各项指标
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
cm = confusion_matrix(y_true, y_pred)
print(f"准确率: {accuracy:.2%}")
print(f"精确率: {precision:.2%}")
print(f"召回率: {recall:.2%}")
print(f"F1分数: {f1:.2%}")
print(f"混淆矩阵:\n{cm}")
# 输出示例:
# 准确率: 80.00%
# 精确率: 75.00%
# 召回率: 83.33%
# F1分数: 78.95%
# 混淆矩阵:
# [[3 1]
# [1 5]]
混淆矩阵
混淆矩阵是展示分类结果的表格,清晰显示预测正确和错误的情况。
| 预测为正 | 预测为负 | |
|---|---|---|
| 实际为正 | 真正例(TP) | 假负例(FN) |
| 实际为负 | 假正例(FP) | 真负例(TN) |
过拟合与欠拟合
模型训练中最重要的两个问题就是过拟合和欠拟合,它们与偏差-方差权衡(Bias-Variance Tradeoff)密切相关。
偏差与方差
| 概念 | 含义 | 对应问题 |
|---|---|---|
| 偏差(Bias) | 模型预测的平均值与真实值的差距 | 偏差大 → 欠拟合(模型太简单) |
| 方差(Variance) | 模型在不同训练集上的预测波动 | 方差大 → 过拟合(模型太复杂) |
靶心类比
想象射击靶心:
• 低偏差+低方差:所有弹孔都集中在靶心 → 理想模型
• 高偏差+低方差:弹孔集中但偏离靶心 → 欠拟合
• 低偏差+高方差:弹孔散布在靶心周围 → 过拟合
• 高偏差+高方差:弹孔散布且偏离靶心 → 最差情况
学习曲线
通过观察学习曲线(训练损失和验证损失随训练进行的变化)可以诊断问题:
- 欠拟合:训练损失和验证损失都很高,且差距不大 → 模型太简单
- 过拟合:训练损失很低,但验证损失很高且在上升 → 模型太复杂
- 良好拟合:两者都逐渐下降并趋于稳定,差距适中
正则化方法
正则化是防止过拟合的核心技术,通过限制模型复杂度来提高泛化能力。
L1 正则化(Lasso)
在损失函数中添加参数绝对值之和:
L1正则化公式
\[ L_{\text{total}} = L_{\text{original}} + \lambda \sum_{i} |w_i| \]
效果:使部分参数变为0,起到特征选择的作用,产生稀疏模型。
L2 正则化(Ridge)
在损失函数中添加参数平方和:
L2正则化公式
\[ L_{\text{total}} = L_{\text{original}} + \lambda \sum_{i} w_i^2 \]
效果:使参数值变小但不会变为0,防止任何单一参数对结果影响过大。
这是最常用的正则化方法,PyTorch中的weight_decay就是L2正则化。
Dropout
Dropout在训练过程中随机"关闭"一部分神经元,迫使网络不依赖任何单个神经元。
Dropout原理
• 训练时:每个神经元以概率p被"丢弃"(输出设为0)
• 测试时:所有神经元都参与,但输出按比例缩小
• 效果:相当于训练了多个子网络的集成,减少过拟合
• 常用丢弃率:0.2~0.5
数据增强(Data Augmentation)
通过变换训练数据来增加数据多样性,让模型学到更鲁棒的特征。
- 图像:旋转、翻转、裁剪、颜色变换、添加噪声
- 文本:同义词替换、随机删除、回译
- 语音:变速、变调、添加背景噪声
交叉验证
交叉验证是一种更可靠的模型评估方法,能充分利用数据,减少评估结果的偶然性。
K折交叉验证(K-Fold Cross Validation)
将数据集分成K个大小相等的子集("折"),每次用其中一折作为验证集,其余K-1折作为训练集,重复K次,取K次评估结果的平均值。
K折交叉验证要点
• 常用K值:5或10
• 每个样本都会被用作验证集一次
• 最终性能 = K次评估的平均值
• 比简单的训练/测试分割更可靠
• 计算成本更高(需要训练K次模型)
本章小结
- 模型评估的核心指标包括准确率、精确率、召回率和F1分数,不同场景应选择不同指标。
- 过拟合(训练好、测试差)和欠拟合(训练差、测试差)是最常见的两个问题,对应偏差-方差权衡。
- 正则化是防止过拟合的主要手段,包括L1正则化(稀疏化)、L2正则化(参数衰减)、Dropout和数据增强。
- K折交叉验证通过多次训练-验证循环提供更可靠的性能评估,减少评估结果的偶然性。
- 混淆矩阵是分析分类结果的重要工具,从中可以推导出所有核心评估指标。
练习题
-
在医疗诊断场景中,以下哪个指标最重要?
A. 准确率
B. 精确率(宁可漏过,不可错报)
C. 召回率(宁可错报,不可漏过)
D. 以上都不重要答案:B。医疗诊断中,将健康人误诊为患病(低精确率)的代价很高,因此更看重精确率。
-
以下哪种方法不能有效防止过拟合?
A. 增加训练数据
B. 使用Dropout
C. 增加模型层数和参数
D. 使用L2正则化答案:C。增加模型复杂度会加剧过拟合。增加数据、Dropout和L2正则化都是防止过拟合的有效方法。
-
5折交叉验证中,模型总共需要训练多少次?
A. 1次
B. 5次
C. 4次
D. 10次答案:B。K折交叉验证需要训练K次,每次使用不同的验证折,5折交叉验证就是训练5次。