library(tidymodels) # 加载 tidymodels 包
library(bestNormalize)
tidymodels_prefer()34 过拟合
34.1 模型的复杂度与过拟合
各类模型均包含一类用于定义模型结构、无法通过数据直接估计的调优参数,即超参数。调大该类参数取值会提升模型潜在结构复杂度。模型复杂度提升后,可更灵活地拟合训练数据内各类特征模式。针对非线性数据集,不含多项式项的线性回归仅能拟合直线,拟合效果较差;适度提升模型复杂度可有效改善模型对训练集数据的贴合程度。
但是,模型复杂度提升同样存在潜在风险。模型精准捕捉训练数据内细微变化规律的优势,仅在该规律具备泛化能力时才能体现。对于许多复杂的模型,其复杂度可以通过一个或多个调优参数进行调节,这些参数会检测训练数据中无关紧要的模式。问题在于,它们可能过度优化模型拟合,导致过拟合。
如 图 34.1 所示,随着模型复杂度的提升,模型对训练数据的拟合程度不断增强,但在测试数据上的表现却逐渐下降。过拟合的模型在训练集上表现良好,但在新数据上表现不佳,无法有效泛化。如 34.1
重要
通常,我们的研究目标目标是找到一个适度复杂的模型(即确定最优调参取值),这个模型能够在训练数据上表现良好,同时在测试数据上也能保持较好的泛化能力。
34.2 产生过拟合的原因及解决的方向
| 原因类别 | 解决方向 |
|---|---|
| 模型复杂度过高 | 简化模型、限制树的深度、减少多项式次数、使用基展开 + 正则化 |
| 样本不够 | 收集更多数据、数据增强(合理范围内) |
| 特征过多 | 特征选择(step_select_*)、PCA 降维、L1 正则化自动选特征 |
| 噪声 / 错误标签 | 清洗数据、对抗标签噪声的方法 |
| 缺乏正则化 | 添加 L1/L2 惩罚、dropout(神经网络)、提前停止 |
| 迭代过久 | 验证集监控,早停法 |
| 数据泄漏 | 严格遵守预处理仅拟合训练集,再 bake () 到测试集 |
| 缺少验证 | 使用交叉验证(rsample::vfold_cv + tune)评估模型稳定性 |
- 永远不要使用测试集来构建模型。
- 在模型开发过程中,始终使用重采样或验证集来评估模型的性能。在 章节 35 中,我们将详细介绍如何使用重采样方法来评估模型性能。
- 通过超参数调优来选择模型复杂度。我们将在 章节 36 和 章节 37 中分别详细介绍如何使用 tidymodels 进行超参数调优(前者为网格搜索,后者为迭代搜索)。
注记
通常,我们采用的全部优化方法均以调优参数的合理取值范围已知为前提。
- 部分参数存在天然取值边界,主成分分析(PCA)的主成分数量即为典型示例;
- 若无天然边界,则研究人员可结合已有机器学习研究经验逐步掌握参数合理区间;
- 这里给出若干基础参数取值范围作为参考,以学习率为例,该参数取值须大于 0,而 0.1 左右的经验上限是多次试验总结形成的通用标准。