跳转至

模型评估与选择

训练好一个模型只是开始,更重要的是如何评价模型好不好如何在多个模型中选出最优的,以及如何调整超参数。这一章解决的就是这些问题。


一、数据集划分

为什么不能用训练数据来评估?

核心原则

永远不要用训练数据来评估模型性能! 这就像考试前让学生看了答案,然后用同一套试卷来考他——成绩再高也没意义。

划分方式

最简单的方式:将数据按比例分成训练集和测试集(通常 7:3 或 8:2)。

全部数据:[████████████████████]
训练集:  [████████████████]  80%
测试集:              [████]  20%

三集划分(更推荐):

训练集(60-70%):训练模型参数
验证集(15-20%):调整超参数、选择模型
测试集(15-20%):最终评估,只用一次

将数据分为 K 份,轮流取 1 份做验证、其余做训练,取 K 次结果的平均:

第1折: [验证][训练][训练][训练][训练]
第2折: [训练][验证][训练][训练][训练]
第3折: [训练][训练][验证][训练][训练]
第4折: [训练][训练][训练][验证][训练]
第5折: [训练][训练][训练][训练][验证]

最终得分 = 5次得分的平均值

优点: 充分利用数据,评估更稳定
常用 K 值: K=5 或 K=10

K 折交叉验证的极端情况:K = 样本数 n。每次用 1 个样本做验证,n-1 个做训练。

优点: 几乎用了全部数据做训练,偏差最小
缺点: 计算量巨大(需要训练 n 次)


二、分类评估指标

混淆矩阵(Confusion Matrix)

这是分类评估的基础:

预测为正 预测为负
实际为正 TP(真正例) FN(假负例)
实际为负 FP(假正例) TN(真负例)

记忆技巧

第一个字母:T(预测对了)或 F(预测错了)
第二个字母:P(预测为正)或 N(预测为负)
例如 FP = False Positive = 预测为正但错了 = 实际是负例

常用指标

准确率(Accuracy)

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]

预测正确的样本占总样本的比例。但在类别不平衡时会产生误导!

准确率的陷阱

一个垃圾邮件数据集中 99% 是正常邮件、1% 是垃圾邮件。一个模型直接把所有邮件都判为"正常",准确率就有 99%——但它根本没有识别出任何垃圾邮件。

精确率(Precision)和召回率(Recall)

\[ \text{Precision} = \frac{TP}{TP + FP} \quad \text{(预测为正的里面,有多少是真的正)} \]
\[ \text{Recall} = \frac{TP}{TP + FN} \quad \text{(实际为正的里面,有多少被找出来了)} \]

精确率 vs 召回率的直觉

  • 精确率高 = 宁可漏掉,也不要误报(法律判决:宁可错放也不冤枉)
  • 召回率高 = 宁可误报,也不要漏掉(疾病筛查:宁可虚惊也不错过)

F1 Score:精确率和召回率的调和平均:

\[ F1 = 2 \cdot \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} \]

当精确率和召回率都高时,F1 才会高。是综合衡量模型好坏的常用指标。

ROC 曲线与 AUC

ROC 曲线(Receiver Operating Characteristic):

  • X 轴:假正率 FPR = \(\frac{FP}{FP + TN}\)(把负例错判为正的比例)
  • Y 轴:真正率 TPR = \(\frac{TP}{TP + FN}\)(即 Recall)
  • 通过调整分类阈值,得到不同的 (FPR, TPR) 点连成曲线

AUC(Area Under Curve):ROC 曲线下的面积。

AUC 值 含义
1.0 完美分类器
0.9 - 1.0 优秀
0.8 - 0.9 良好
0.7 - 0.8 一般
0.5 随机猜测(对角线)
< 0.5 比随机还差(模型反着来)

AUC 的优势

AUC 不受分类阈值的影响,也不受类别不平衡的影响,是比准确率更可靠的评价指标。


三、回归评估指标

指标 公式 说明
MAE(平均绝对误差) \(\frac{1}{n}\sum\|y_i - \hat{y}_i\|\) 直观,对异常值不敏感
MSE(均方误差) \(\frac{1}{n}\sum(y_i - \hat{y}_i)^2\) 放大大误差的影响
RMSE(均方根误差) \(\sqrt{\text{MSE}}\) 与数据同单位,更好解释
\(R^2\)(决定系数) \(1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}\) 越接近 1 越好,表示模型解释了多少方差

\(R^2\) 的直觉理解

\(R^2 = 0.85\) 意味着模型解释了数据中 85% 的变化。剩下 15% 是模型无法捕获的噪声或遗漏的特征。


四、超参数调优

模型参数 vs 超参数

  • 参数:模型自己学到的(如线性回归的权重 \(w\)
  • 超参数:需要人为设定的(如学习率 \(\eta\)、正则化系数 \(\lambda\)、SVM 的 \(C\)

穷举所有超参数组合,找到最优的一组:

# 示例:为 SVM 调参
param_grid = {
    'C': [0.1, 1, 10, 100],
    'kernel': ['rbf', 'linear'],
    'gamma': [0.001, 0.01, 0.1]
}
# 共需尝试 4 × 2 × 3 = 24 种组合

优点: 保证找到搜索范围内的最优解
缺点: 组合爆炸,参数多时计算量巨大

从参数空间中随机采样固定数量的组合:

优点: 比网格搜索高效,在高维参数空间中更容易找到好参数
研究表明: 在很多情况下,随机搜索用更少的计算量就能达到和网格搜索差不多的效果

贝叶斯优化(Bayesian Optimization)

利用前几次的评估结果来智能地选择下一组参数,而不是盲目搜索。

核心思想: 1. 用一个代理模型(通常是高斯过程)建模"参数→性能"的关系 2. 通过采集函数(Acquisition Function)选择最有希望的参数 3. 评估该参数的实际性能,更新代理模型 4. 重复迭代

优点: 在计算资源有限时,能更快找到好参数
工具: Optuna、Hyperopt、Scikit-Optimize


五、模型选择原则

奥卡姆剃刀(Occam's Razor)

如果两个模型效果差不多,优先选择更简单的那个。

简单的模型更容易解释、更不容易过拟合、更易于维护。

没有免费的午餐定理(No Free Lunch)

不存在一个在所有问题上都最好的算法。 每个算法都有适合它的场景。

所以实践中,你应该: 1. 先用简单模型(逻辑回归、决策树)建立基线 2. 逐步尝试更复杂的模型 3. 通过交叉验证比较,选择最适合当前数据的模型

学习曲线分析

画出训练集和验证集误差随数据量变化的曲线,可以诊断模型状态:

误差                          误差
│ ╲   训练误差                │         训练误差
│   ──────────                │  ╲   ─────────
│                             │    ╲ ╱
│   ──────────                │     ╳
│ ╱   验证误差                │    ╱ ╲─────── 验证误差
└──────────── 数据量          └──────────── 数据量
   高偏差(欠拟合)               高方差(过拟合)
   → 换更复杂的模型              → 增加数据量 / 正则化

速查:该看哪个指标?

场景 推荐指标
类别平衡的分类 准确率、F1
类别不平衡的分类 F1、AUC、PR 曲线
关注"不要误报"(如推荐系统) 精确率
关注"不要漏掉"(如疾病筛查) 召回率
回归问题 RMSE、\(R^2\)
回归中有异常值 MAE
模型比较 交叉验证 + 统计检验