Skip to content

第 4 章 模型评估

训练误差只能说明模型在训练集上的表现,不能说明模型在新数据上的表现。模型评估要回答的问题是:这个模型离开训练集以后还可靠吗?

模型评估围绕一个问题展开:模型在未见过的数据上是否可靠。本章依次讨论数据划分、交叉验证、评估指标、ROC 曲线、模型选择、欠拟合、过拟合、偏差、方差、学习曲线和数据泄漏。

4.1 数据划分

建模时通常把数据分成训练集、验证集和测试集。

数据集作用
训练集拟合模型参数
验证集选择模型和调超参数
测试集最终评估模型效果

训练集用于学习参数。例如线性回归中的权重、神经网络中的连接权重,都是通过训练集得到的。

验证集用于比较不同模型或不同超参数。例如多项式阶数、学习率、正则化系数、网络层数,都应该根据验证集表现来选。

测试集只在最后使用一次。如果反复根据测试集结果修改模型,测试集就参与了模型选择,最终评估会偏乐观。

数据量较大时,可以直接划分训练集、验证集和测试集。数据量较小时,如果只划出一份验证集,评估结果可能受划分方式影响很大,这时可以使用交叉验证。

4.2 交叉验证

交叉验证的核心思想是:不要只依赖一次训练集和验证集划分,而是让不同样本轮流做验证集,再把多次验证结果平均。

最常见的是 K 折交叉验证。把训练数据分成 K 份,每次取其中 1 份做验证集,其余 K1 份做训练集,重复 K 次。

text
第 1 次:第 1 折验证,其余训练
第 2 次:第 2 折验证,其余训练
...
第 K 次:第 K 折验证,其余训练

最后得到 K 个验证分数,取平均作为模型或超参数的估计表现:

CV=1Kk=1KScorek

其中 CV 是交叉验证平均分数,Scorek 是第 k 折的验证分数。

交叉验证常用于:

  • 数据量不大,希望评估更稳定。
  • 比较不同模型。
  • 选择正则化系数、树深度、核函数参数等超参数。

交叉验证通常只在训练集内部进行。测试集仍然保留到最后一次性使用。

如果任务是分类,并且类别比例不平衡,应该使用分层交叉验证,让每一折中的类别比例尽量接近整体数据。否则某些折里正类太少,评估结果会不稳定。

时间序列数据不能随意打乱后做普通 K 折交叉验证。因为未来数据不能参与过去模型的训练,否则会造成信息泄漏。时间序列更适合按时间顺序做滚动验证。

4.3 评估指标

评估指标要和任务目标一致。

回归任务常用:

指标含义特点
MSE平方误差的平均值对大误差更敏感
MAE绝对误差的平均值更容易解释
RMSEMSE 的平方根量纲和原始标签一致
R2模型解释方差的比例用来衡量拟合程度

分类任务常用:

指标含义
Accuracy预测正确的比例
Precision预测为正类的样本中,有多少是真的正类
Recall真实正类中,有多少被找出来
F1Precision 和 Recall 的综合
ROC-AUCROC 曲线下面积,从排序角度衡量二分类模型区分能力

如果类别很不平衡,只看准确率容易误判。例如异常检测、欺诈识别、疾病筛查中,正类样本很少,模型全预测为负类也可能有很高准确率,但没有实际价值。

4.4 Precision、Recall 和 F1

二分类结果可以分成四类:

名称含义
TP(True Positive)真实为正,预测为正
FP(False Positive)真实为负,预测为正
TN(True Negative)真实为负,预测为负
FN(False Negative)真实为正,预测为负

Precision:

Precision=TPTP+FP

Recall:

Recall=TPTP+FN

F1:

F1=2PRP+R

其中 P 表示 Precision,R 表示 Recall。

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:

TPR=TPTP+FN

FPR 表示真实负类中被误判为正类的比例:

FPR=FPFP+TN

当阈值从高到低变化时,模型会把越来越多样本判为正类。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 模型选择

模型选择是从多个候选模型中选一个。

例如多项式回归中,可以选择:

h(x)=θ0+θ1xh(x)=θ0+θ1x+θ2x2h(x)=θ0+θ1x+θ2x2+θ3x3

如果只看训练误差,高阶模型通常更占优势,因为它表达能力更强。但训练误差低不代表新数据表现好。

基本流程:

  1. 用训练集训练多个候选模型。
  2. 用验证集或交叉验证比较模型表现。
  3. 选择验证表现最好的模型。
  4. 用测试集做最终评估。

测试集不能参与第 2 步,否则测试集就不再独立。

4.7 欠拟合和过拟合

欠拟合:模型太简单,连训练集规律都没有学好。

过拟合:模型太复杂,把训练集中的噪声也学进去了。

根据训练误差和验证误差可以初步判断:

情况训练误差验证误差常见原因
欠拟合模型太简单、特征不足、训练不充分
合适拟合模型复杂度和数据规律匹配
过拟合很低模型太复杂、数据太少、正则化不足

欠拟合通常需要提高模型表达能力,例如加入有效特征、使用更复杂模型、训练更充分。过拟合通常需要提高泛化能力,例如增加数据、加强正则化、减少无效特征或降低模型复杂度。

4.8 偏差和方差

偏差是模型预测的期望值与真实函数之间的差距。设真实规律为 f(x),用不同训练集训练得到的模型为 f^(x),则在点 x 处偏差定义为:

Bias[f^(x)]=E[f^(x)]f(x)

偏差的平方为:

Bias2[f^(x)]=(E[f^(x)]f(x))2

方差是模型预测值围绕自身期望的波动程度:

Var[f^(x)]=E[(f^(x)E[f^(x)])2]

如果训练数据中存在随机噪声,记噪声方差为 σ2,平方误差的期望可以分解为:

E[(yf^(x))2]=Bias2[f^(x)]+Var[f^(x)]+σ2

这就是偏差-方差分解。它说明模型的泛化误差主要来自三部分:模型假设带来的系统误差、模型对训练数据变化的敏感性,以及数据本身无法消除的噪声。

可以用一个回归例子理解:

  • 用直线拟合明显弯曲的数据,通常是高偏差。
  • 用很高阶多项式穿过几乎所有训练点,通常是高方差。
问题训练误差验证误差误差来源常见处理
高偏差模型表达能力不足增加特征、提高模型复杂度、减小正则化、训练更久
高方差模型对训练集过于敏感增加数据、加强正则化、减少特征、降低模型复杂度
高偏差且高方差更高模型既没学好又不稳定先检查数据和特征,再调整模型

模型太简单时,E[f^(x)] 本身就偏离 f(x),偏差大;模型太复杂时,不同训练集会得到差异很大的 f^(x),方差大。

增加训练数据通常能降低方差,因为模型见到更多真实变化后,不容易记住少量样本中的偶然噪声。但如果问题主要是高偏差,单纯增加数据往往帮助不大。

4.9 学习曲线

学习曲线观察训练样本数量变化时,训练误差和验证误差如何变化。

高偏差时,训练误差和验证误差通常都高,而且两者比较接近。继续增加数据帮助有限,应该优先考虑换更复杂的模型或改进特征。

高方差时,训练误差低,验证误差高,两者差距大。增加数据通常有帮助,正则化也可能有效。

学习曲线的作用是判断下一步该改数据、改特征、改模型,还是改正则化。

4.10 数据泄漏

数据泄漏指训练或评估过程中使用了不该提前知道的信息。

常见情况:

  • 先用全量数据做标准化,再划分训练集和测试集。
  • 特征中包含未来信息。
  • 同一个用户的数据同时出现在训练集和测试集。
  • 同一张图片的数据增强版本同时出现在训练集和测试集。
  • 在交叉验证前先用全量数据做特征选择。
  • 反复根据测试集表现调整模型。

原则:任何从数据中估计出来的处理步骤,都只能在训练集上拟合,再应用到验证集和测试集。交叉验证时,每一折也要遵守这个原则:预处理只能在该折的训练部分拟合,再应用到该折的验证部分。

Powered by VitePress