模型评估与选择
模型评估是机器学习工作流中的关键环节。选择合适的评估指标和验证策略,直接决定了我们能否正确判断模型的泛化能力。
模型评估概述
模型评估的核心问题是:训练好的模型在未见过的数据上表现如何?
我们需要回答以下问题:
- 用什么指标衡量模型好坏?
- 如何可靠地估计泛化性能?
- 如何在多个候选模型中做出选择?
- 如何高效地搜索超参数?
交叉验证
交叉验证是评估模型泛化性能的标准方法,通过在训练数据的不同子集上反复训练和验证来获得更可靠的性能估计。
K-Fold 交叉验证
将数据集随机分为 \(K\) 个大小相等的子集(折)。每次用 \(K-1\) 个折训练,剩余 1 个折验证。重复 \(K\) 次,每个折恰好被用作验证集一次。
常用 \(K = 5\) 或 \(K = 10\)。
优点:充分利用数据,方差较低。
缺点:计算量为单次训练的 \(K\) 倍。
Stratified K-Fold
在分层 K 折交叉验证中,每一折的类别比例与整体数据集保持一致。
适用场景:分类任务,尤其是类别不平衡时(如欺诈检测中正样本仅占 1%)。如果不分层,某些折中可能完全没有少数类样本。
Leave-One-Out(LOO)
LOO 是 K-Fold 的极端情况:\(K = n\)(样本数)。每次留一个样本做验证,其余 \(n-1\) 个样本做训练。
优点:几乎无偏的泛化误差估计。
缺点:计算成本极高(需训练 \(n\) 个模型);方差较高(各折训练集高度重叠)。
时间序列分割
对于时间序列数据,不能使用随机分割,因为未来数据不应影响过去的预测。
滚动窗口验证(Rolling Window / Walk-Forward):
折 1: [训练: t1-t3] [验证: t4]
折 2: [训练: t1-t4] [验证: t5]
折 3: [训练: t1-t5] [验证: t6]
扩展窗口验证(Expanding Window): 训练集不断扩大。
固定窗口验证(Sliding Window): 训练集大小固定,窗口向前滑动。
分类指标
混淆矩阵
| 预测正 | 预测负 | |
|---|---|---|
| 实际正 | TP(真阳性) | FN(假阴性) |
| 实际负 | FP(假阳性) | TN(真阴性) |
基本指标
准确率(Accuracy):
在类别不平衡时,准确率可能具有误导性。例如,如果 99% 的样本为负类,一个永远预测负类的模型也有 99% 的准确率。
精确率(Precision):
"在所有被预测为正的样本中,有多少确实是正的?" 关注假阳性的代价。
召回率(Recall / Sensitivity / TPR):
"在所有实际为正的样本中,有多少被正确识别?" 关注假阴性的代价。
F1 分数:
精确率和召回率的调和平均:
更一般地,\(F_\beta\) 分数允许调节精确率和召回率的相对重要性:
\(\beta > 1\) 时更侧重召回率,\(\beta < 1\) 时更侧重精确率。
AUC-ROC 曲线
ROC 曲线以假阳性率(FPR)为横轴、真阳性率(TPR)为纵轴绘制:
通过变化分类阈值,得到 ROC 曲线上的一系列点。
AUC(Area Under the ROC Curve):
AUC 的概率解释:随机抽取一个正样本和一个负样本,模型将正样本排在负样本前面的概率。
| AUC 范围 | 模型质量 |
|---|---|
| 0.5 | 随机猜测 |
| 0.5 - 0.7 | 较差 |
| 0.7 - 0.8 | 一般 |
| 0.8 - 0.9 | 较好 |
| 0.9 - 1.0 | 优秀 |
PR 曲线(Precision-Recall Curve)
以召回率为横轴、精确率为纵轴。在类别严重不平衡时,PR 曲线比 ROC 曲线更具信息量。
AUPRC(Area Under the PR Curve) 是 PR 曲线下的面积,也称为 Average Precision(AP)。
Log Loss(对数损失)
Log Loss 不仅关注预测的类别是否正确,还关注预测的概率校准。置信度高但预测错误的样本会受到严重惩罚。
回归指标
MSE(均方误差)
对大误差惩罚更重(平方项)。MSE 的单位是目标变量单位的平方。
RMSE(均方根误差)
与目标变量同单位,更容易解释。
MAE(平均绝对误差)
对异常值更鲁棒(线性惩罚 vs 平方惩罚)。
\(R^2\)(决定系数)
\(R^2 = 1\) 表示完美拟合,\(R^2 = 0\) 表示模型不比预测均值好。\(R^2\) 可以为负(模型比均值预测还差)。
MAPE(平均绝对百分比误差)
以百分比表示误差,便于业务理解。注意:当 \(y_i\) 接近 0 时,MAPE 会趋向无穷大。
回归指标对比
| 指标 | 对异常值敏感 | 可解释性 | 是否有界 | 适用场景 |
|---|---|---|---|---|
| MSE | 非常敏感 | 差(平方单位) | \([0, +\infty)\) | 优化目标、理论分析 |
| RMSE | 敏感 | 好(原始单位) | \([0, +\infty)\) | 通用评估 |
| MAE | 较鲁棒 | 好(原始单位) | \([0, +\infty)\) | 含异常值 |
| \(R^2\) | 敏感 | 好(比例) | \((-\infty, 1]\) | 模型解释能力 |
| MAPE | 较鲁棒 | 好(百分比) | \([0, +\infty)\) | 业务报告 |
学习曲线与验证曲线
学习曲线
学习曲线绘制训练集大小与训练/验证误差的关系:
- 高偏差(欠拟合):训练误差和验证误差都很高,且随训练集增大几乎不变 → 增加模型复杂度
- 高方差(过拟合):训练误差低但验证误差高,两者之间有大间隙 → 增加训练数据或正则化
验证曲线
验证曲线绘制某个超参数与训练/验证误差的关系:
- 帮助判断超参数的最优范围
- 超参数过小:欠拟合(高偏差)
- 超参数过大:过拟合(高方差)
超参数搜索
Grid Search(网格搜索)
穷举所有超参数组合:
- 对于每个超参数指定候选值列表
- 评估所有组合的交叉验证性能
优点:保证找到搜索空间内的最优值。
缺点:维度灾难。如果有 \(m\) 个超参数,每个有 \(k\) 个候选值,需要评估 \(k^m\) 种组合。
Random Search(随机搜索)
在超参数空间中随机采样固定次数:
Bergstra & Bengio (2012) 证明了随机搜索通常比网格搜索更高效。原因在于:
- 某些超参数比其他超参数重要得多
- 网格搜索在不重要维度上浪费了大量评估
- 随机搜索在每个维度上都有更好的覆盖
贝叶斯优化
贝叶斯优化使用代理模型(通常是高斯过程)来建模超参数与性能之间的关系,利用采集函数(如 Expected Improvement)来智能地选择下一组超参数。
基本流程:
- 初始化:随机评估若干超参数组合
- 拟合代理模型 \(\hat{f}(\theta)\) 来近似真实目标函数
- 通过最大化采集函数选择下一组超参数:
其中 \(f^+\) 为当前最优值。
- 评估新的超参数并更新代理模型
- 重复步骤 2-4
常用工具:
- Optuna:支持剪枝(Pruning)、多种采样器(TPE、CMA-ES)
- Hyperopt:基于 TPE(Tree-structured Parzen Estimator)
- Bayesian Optimization:基于高斯过程
| 方法 | 效率 | 并行化 | 适用场景 |
|---|---|---|---|
| Grid Search | 低 | 容易 | 超参数少、搜索空间小 |
| Random Search | 中 | 容易 | 通用、超参数较多 |
| 贝叶斯优化 | 高 | 较难 | 评估成本高、超参数多 |
模型选择
偏差-方差权衡
偏差(Bias):模型对真实关系的系统性偏离。高偏差模型过于简单(欠拟合)。
方差(Variance):模型对训练数据波动的敏感度。高方差模型过于复杂(过拟合)。
对于回归问题,泛化误差可以分解为:
其中 \(\sigma^2_\epsilon\) 为不可约噪声。
模型复杂度的影响:
- 模型过简单:高偏差、低方差 → 欠拟合
- 模型过复杂:低偏差、高方差 → 过拟合
- 最优复杂度:偏差和方差之和最小
No Free Lunch 定理
没有一个模型在所有问题上都是最优的。 对于所有可能的数据生成分布的平均,任何两个算法的期望性能相同。
这意味着:
- 必须针对具体问题选择合适的模型
- 先验知识和数据特点决定了最佳模型选择
- 不存在"万能"算法
统计检验
当比较两个或多个模型的性能时,仅看平均分数是不够的。我们需要统计检验来判断性能差异是否显著。
t 检验
检验两个模型在 \(K\) 折交叉验证中的平均性能是否有显著差异。
假设:\(H_0\): 两个模型的性能无差异。
检验统计量:
其中 \(d_k = \text{Score}_k^{A} - \text{Score}_k^{B}\),\(\bar{d}\) 为差值均值,\(s_d\) 为差值标准差。
自由度 \(df = K - 1\),查 t 分布表判断是否拒绝 \(H_0\)。
配对 t 检验
修正的重复 K 折交叉验证 t 检验(Corrected Resampled t-test)考虑了训练集和测试集的重叠:
其中 \(R\) 为重复次数,\(n_{\text{test}}\) 和 \(n_{\text{train}}\) 分别为每折的测试和训练样本数。
McNemar 检验
McNemar 检验适用于比较两个分类器在同一测试集上的表现,不需要交叉验证。
构造列联表:
| 模型 B 正确 | 模型 B 错误 | |
|---|---|---|
| 模型 A 正确 | \(n_{00}\) | \(n_{01}\) |
| 模型 A 错误 | \(n_{10}\) | \(n_{11}\) |
检验统计量(带连续性修正):
在 \(H_0\) 下,\(\chi^2\) 服从自由度为 1 的卡方分布。
统计检验选择指南
| 场景 | 推荐检验 |
|---|---|
| 两个模型,同一数据集,K-Fold CV | 配对 t 检验 |
| 两个模型,同一测试集 | McNemar 检验 |
| 多个模型,同一数据集 | Friedman 检验 + Nemenyi 事后检验 |
| 两个模型,多个数据集 | Wilcoxon 符号秩检验 |
| 多个模型,多个数据集 | Friedman 检验 |