第 4 章 模型评估
训练误差只能说明模型在训练集上的表现,不能说明模型在新数据上的表现。模型评估要回答的问题是:这个模型离开训练集以后还可靠吗?
模型评估围绕一个问题展开:模型在未见过的数据上是否可靠。本章依次讨论数据划分、交叉验证、评估指标、ROC 曲线、模型选择、欠拟合、过拟合、偏差、方差、学习曲线和数据泄漏。
4.1 数据划分
建模时通常把数据分成训练集、验证集和测试集。
| 数据集 | 作用 |
|---|---|
| 训练集 | 拟合模型参数 |
| 验证集 | 选择模型和调超参数 |
| 测试集 | 最终评估模型效果 |
训练集用于学习参数。例如线性回归中的权重、神经网络中的连接权重,都是通过训练集得到的。
验证集用于比较不同模型或不同超参数。例如多项式阶数、学习率、正则化系数、网络层数,都应该根据验证集表现来选。
测试集只在最后使用一次。如果反复根据测试集结果修改模型,测试集就参与了模型选择,最终评估会偏乐观。
数据量较大时,可以直接划分训练集、验证集和测试集。数据量较小时,如果只划出一份验证集,评估结果可能受划分方式影响很大,这时可以使用交叉验证。
4.2 交叉验证
交叉验证的核心思想是:不要只依赖一次训练集和验证集划分,而是让不同样本轮流做验证集,再把多次验证结果平均。
最常见的是 K 折交叉验证。把训练数据分成
第 1 次:第 1 折验证,其余训练
第 2 次:第 2 折验证,其余训练
...
第 K 次:第 K 折验证,其余训练最后得到
其中
交叉验证常用于:
- 数据量不大,希望评估更稳定。
- 比较不同模型。
- 选择正则化系数、树深度、核函数参数等超参数。
交叉验证通常只在训练集内部进行。测试集仍然保留到最后一次性使用。
如果任务是分类,并且类别比例不平衡,应该使用分层交叉验证,让每一折中的类别比例尽量接近整体数据。否则某些折里正类太少,评估结果会不稳定。
时间序列数据不能随意打乱后做普通 K 折交叉验证。因为未来数据不能参与过去模型的训练,否则会造成信息泄漏。时间序列更适合按时间顺序做滚动验证。
4.3 评估指标
评估指标要和任务目标一致。
回归任务常用:
| 指标 | 含义 | 特点 |
|---|---|---|
| MSE | 平方误差的平均值 | 对大误差更敏感 |
| MAE | 绝对误差的平均值 | 更容易解释 |
| RMSE | MSE 的平方根 | 量纲和原始标签一致 |
| 模型解释方差的比例 | 用来衡量拟合程度 |
分类任务常用:
| 指标 | 含义 |
|---|---|
| Accuracy | 预测正确的比例 |
| Precision | 预测为正类的样本中,有多少是真的正类 |
| Recall | 真实正类中,有多少被找出来 |
| F1 | Precision 和 Recall 的综合 |
| ROC-AUC | ROC 曲线下面积,从排序角度衡量二分类模型区分能力 |
如果类别很不平衡,只看准确率容易误判。例如异常检测、欺诈识别、疾病筛查中,正类样本很少,模型全预测为负类也可能有很高准确率,但没有实际价值。
4.4 Precision、Recall 和 F1
二分类结果可以分成四类:
| 名称 | 含义 |
|---|---|
| TP(True Positive) | 真实为正,预测为正 |
| FP(False Positive) | 真实为负,预测为正 |
| TN(True Negative) | 真实为负,预测为负 |
| FN(False Negative) | 真实为正,预测为负 |
Precision:
Recall:
F1:
其中
Precision 关注“预测出来的正类有多准”,Recall 关注“真正的正类有没有找全”。二者经常需要权衡。
例如疾病筛查更重视 Recall,因为漏掉病人代价很高;垃圾邮件过滤更重视 Precision,因为把正常邮件误判成垃圾邮件会影响用户。
4.5 ROC 曲线和 AUC
ROC 是 Receiver Operating Characteristic,AUC 是 Area Under Curve。
很多二分类模型输出的不是类别,而是一个分数或概率。真正做分类时,需要选择阈值。
例如:
- 分数大于 0.5,判为正类。
- 分数大于 0.8,判为正类。
阈值不同,模型的 TP、FP、TN、FN 都会变化。ROC 曲线就是用不同阈值下的表现画出来的曲线。
ROC 曲线的横轴是 FPR,纵轴是 TPR。
TPR 也就是 Recall:
FPR 表示真实负类中被误判为正类的比例:
当阈值从高到低变化时,模型会把越来越多样本判为正类。TPR 往往会上升,FPR 也往往会上升。ROC 曲线描述的就是这种权衡关系。
AUC 是 ROC 曲线下的面积。它可以理解为:随机取一个正样本和一个负样本,模型把正样本排在负样本前面的概率。
| AUC | 含义 |
|---|---|
| 0.5 | 接近随机猜测 |
| 0.7 到 0.8 | 有一定区分能力 |
| 0.8 到 0.9 | 区分能力较好 |
| 接近 1 | 区分能力很强 |
ROC-AUC 关注排序能力,不依赖某一个固定阈值。但在类别极度不平衡时,PR 曲线(Precision-Recall Curve)有时更有参考价值,因为 PR 曲线更关注正类识别效果。
4.6 模型选择
模型选择是从多个候选模型中选一个。
例如多项式回归中,可以选择:
如果只看训练误差,高阶模型通常更占优势,因为它表达能力更强。但训练误差低不代表新数据表现好。
基本流程:
- 用训练集训练多个候选模型。
- 用验证集或交叉验证比较模型表现。
- 选择验证表现最好的模型。
- 用测试集做最终评估。
测试集不能参与第 2 步,否则测试集就不再独立。
4.7 欠拟合和过拟合
欠拟合:模型太简单,连训练集规律都没有学好。
过拟合:模型太复杂,把训练集中的噪声也学进去了。
根据训练误差和验证误差可以初步判断:
| 情况 | 训练误差 | 验证误差 | 常见原因 |
|---|---|---|---|
| 欠拟合 | 高 | 高 | 模型太简单、特征不足、训练不充分 |
| 合适拟合 | 低 | 低 | 模型复杂度和数据规律匹配 |
| 过拟合 | 很低 | 高 | 模型太复杂、数据太少、正则化不足 |
欠拟合通常需要提高模型表达能力,例如加入有效特征、使用更复杂模型、训练更充分。过拟合通常需要提高泛化能力,例如增加数据、加强正则化、减少无效特征或降低模型复杂度。
4.8 偏差和方差
偏差是模型预测的期望值与真实函数之间的差距。设真实规律为
偏差的平方为:
方差是模型预测值围绕自身期望的波动程度:
如果训练数据中存在随机噪声,记噪声方差为
这就是偏差-方差分解。它说明模型的泛化误差主要来自三部分:模型假设带来的系统误差、模型对训练数据变化的敏感性,以及数据本身无法消除的噪声。
可以用一个回归例子理解:
- 用直线拟合明显弯曲的数据,通常是高偏差。
- 用很高阶多项式穿过几乎所有训练点,通常是高方差。
| 问题 | 训练误差 | 验证误差 | 误差来源 | 常见处理 |
|---|---|---|---|---|
| 高偏差 | 高 | 高 | 模型表达能力不足 | 增加特征、提高模型复杂度、减小正则化、训练更久 |
| 高方差 | 低 | 高 | 模型对训练集过于敏感 | 增加数据、加强正则化、减少特征、降低模型复杂度 |
| 高偏差且高方差 | 高 | 更高 | 模型既没学好又不稳定 | 先检查数据和特征,再调整模型 |
模型太简单时,
增加训练数据通常能降低方差,因为模型见到更多真实变化后,不容易记住少量样本中的偶然噪声。但如果问题主要是高偏差,单纯增加数据往往帮助不大。
4.9 学习曲线
学习曲线观察训练样本数量变化时,训练误差和验证误差如何变化。
高偏差时,训练误差和验证误差通常都高,而且两者比较接近。继续增加数据帮助有限,应该优先考虑换更复杂的模型或改进特征。
高方差时,训练误差低,验证误差高,两者差距大。增加数据通常有帮助,正则化也可能有效。
学习曲线的作用是判断下一步该改数据、改特征、改模型,还是改正则化。
4.10 数据泄漏
数据泄漏指训练或评估过程中使用了不该提前知道的信息。
常见情况:
- 先用全量数据做标准化,再划分训练集和测试集。
- 特征中包含未来信息。
- 同一个用户的数据同时出现在训练集和测试集。
- 同一张图片的数据增强版本同时出现在训练集和测试集。
- 在交叉验证前先用全量数据做特征选择。
- 反复根据测试集表现调整模型。
原则:任何从数据中估计出来的处理步骤,都只能在训练集上拟合,再应用到验证集和测试集。交叉验证时,每一折也要遵守这个原则:预处理只能在该折的训练部分拟合,再应用到该折的验证部分。