模型评估与选择¶
训练好一个模型只是开始,更重要的是如何评价模型好不好、如何在多个模型中选出最优的,以及如何调整超参数。这一章解决的就是这些问题。
一、数据集划分¶
为什么不能用训练数据来评估?¶
核心原则
永远不要用训练数据来评估模型性能! 这就像考试前让学生看了答案,然后用同一套试卷来考他——成绩再高也没意义。
划分方式¶
最简单的方式:将数据按比例分成训练集和测试集(通常 7:3 或 8:2)。
三集划分(更推荐):
将数据分为 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):
预测正确的样本占总样本的比例。但在类别不平衡时会产生误导!
准确率的陷阱
一个垃圾邮件数据集中 99% 是正常邮件、1% 是垃圾邮件。一个模型直接把所有邮件都判为"正常",准确率就有 99%——但它根本没有识别出任何垃圾邮件。
精确率(Precision)和召回率(Recall):
精确率 vs 召回率的直觉
- 精确率高 = 宁可漏掉,也不要误报(法律判决:宁可错放也不冤枉)
- 召回率高 = 宁可误报,也不要漏掉(疾病筛查:宁可虚惊也不错过)
F1 Score:精确率和召回率的调和平均:
当精确率和召回率都高时,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\))
网格搜索(Grid Search)¶
穷举所有超参数组合,找到最优的一组:
# 示例:为 SVM 调参
param_grid = {
'C': [0.1, 1, 10, 100],
'kernel': ['rbf', 'linear'],
'gamma': [0.001, 0.01, 0.1]
}
# 共需尝试 4 × 2 × 3 = 24 种组合
优点: 保证找到搜索范围内的最优解
缺点: 组合爆炸,参数多时计算量巨大
随机搜索(Random Search)¶
从参数空间中随机采样固定数量的组合:
优点: 比网格搜索高效,在高维参数空间中更容易找到好参数
研究表明: 在很多情况下,随机搜索用更少的计算量就能达到和网格搜索差不多的效果
贝叶斯优化(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 |
| 模型比较 | 交叉验证 + 统计检验 |