7.5 模型调参与优化
本章学习目标:
- 理解欠拟合与过拟合的概念及识别方法
- 掌握交叉验证的原理和作用
- 了解网格搜索和随机搜索的基本思想
- 学会如何向AI描述调参需求
- 核心能力:知道模型效果不好时,应该往哪个方向调整
一、核心问题:模型效果不好怎么办?
1.1 三大问题
训练完一个模型,发现效果不理想。原因逃不出这三类:
| 问题 | 一句话定义 | 表现 |
|---|---|---|
| 欠拟合 | 模型太简单,没学到规律 | 训练集效果差,测试集效果也差 |
| 过拟合 | 模型太复杂,死记硬背 | 训练集效果很好,测试集效果差 |
| 数据问题 | 数据质量差或信息不足 | 无论怎么调参效果都不好 |
核心心法:先判断是欠拟合还是过拟合,再决定调参方向。
1.2 学习曲线 —— 诊断工具
学习曲线:横轴是训练数据量,纵轴是模型误差(或分数)。
误差
↑
│ 过拟合
│ ●━━━●
│ ●
│ ● ← 训练误差低,验证误差高
│ ●
│ 验证误差 ───●━━━●━━━●
│ ●
│ ●
│ ╱━━━━━━━━━━━━━━━━━━━━
│ ● 训练误差
│ ●
└──────────────────────────→ 数据量
误差
↑
│ 欠拟合
│ ●━━━●━━━●━━━●━━━●
│ 验证误差
│ ●━━━●━━━●━━━●━━━● 训练误差
│ 训练误差和验证误差都很高
│ 模型预测还不如平均值
│
└──────────────────────────→ 数据量
| 模式 | 诊断 | 解决方向 |
|---|---|---|
| 训练误差高,验证误差高 | 欠拟合 | 增加模型复杂度 |
| 训练误差低,验证误差高 | 过拟合 | 降低模型复杂度 / 增加数据 / 正则化 |
| 两者都低 | 理想状态 | 保持 |
| 两者都高但接近 | 数据问题 | 增加特征 / 改善数据质量 |
二、欠拟合与过拟合
2.1 欠拟合
定义:模型没有捕捉到数据中的规律,连训练数据都拟合不好。
类比:学生拿着课本也考不及格——根本没学会。
表现:
- 训练集误差高
- 验证集误差高
- 两者接近
常见原因与解决:
| 原因 | 解决方案 | 例子 |
|---|---|---|
| 模型太简单 | 换更复杂的模型 | 线性回归 → 随机森林 |
| 特征太少 | 增加特征 | 加入品牌、车型等特征 |
| 正则化太强 | 减弱正则化 | 减小L1/L2系数 |
| 未充分训练 | 增加迭代次数 | 决策树增大max_depth |
2.2 过拟合
定义:模型死记硬背了训练数据中的噪声,但对新数据预测很差。
类比:学生背下了所有练习题的答案,但考试换了个数字就不会了。
表现:
- 训练集误差很低(甚至为0)
- 验证集误差高
- 两者差距很大
常见原因与解决:
| 原因 | 解决方案 | 例子 |
|---|---|---|
| 模型太复杂 | 换简单模型或用正则化 | 决策树剪枝 |
| 训练数据太少 | 增加数据量 | 收集更多样本 |
| 特征太多 | 特征选择/降维 | 删除不重要特征 |
| 训练太久 | 早停 | 限制树深度 |
2.3 如何选择模型复杂度?
模型效果
↑
│ ╱─── 验证集
│ ╱
│ ╱ ← 最佳复杂度
│ ╱
│ ╱
│ ╱───╱
│ ╱
│ ╱ 训练集
└────────────────────────→ 模型复杂度
最佳点:训练集效果好,验证集也不差,两者差距不大。
三、交叉验证
3.1 为什么要用交叉验证?
问题:单次划分训练集/验证集,结果可能运气好或运气差。
类比:一次考试成绩不能代表真实水平,需要多次考试取平均。
3.2 K折交叉验证
核心思想:把数据分成K份,轮流用其中K-1份训练、1份验证,重复K次,取平均。
全部数据
┌─────────────────────────────────────┐
│ 折1 │ 折2 │ 折3 │ 折4 │ 折5 │
└─────────────────────────────────────┘
第1轮:训练 ████████ 验证 □ 平均分数
第2轮:训练 ████████ 验证 □
第3轮:训练 ████████ 验证 □ → 0.85
第4轮:训练 ████████ 验证 □
第5轮:训练 ████████ 验证 □
| 参数 | 含义 | 常用值 |
|---|---|---|
| K | 折数 | 5 或 10 |
K=5时:用80%数据训练,20%验证,重复5次,每次验证集不同。
3.3 交叉验证的作用
| 作用 | 说明 |
|---|---|
| 更稳定评估 | 减少单次划分的运气成分 |
| 更充分利用数据 | 每条数据都有机会做验证 |
| 辅助调参 | 用交叉验证分数判断参数好坏 |
| 发现过拟合 | K折分数差距大 → 可能过拟合 |
四、网格搜索
4.1 什么是网格搜索?
核心思想:穷举所有参数组合,找出最佳组合——设定参数候选值,尝试所有组合,选交叉验证分数最高的。
例子(随机森林调参):
| 参数 | 候选值 |
|---|---|
| n_estimators(树的数量) | [50, 100, 200] |
| max_depth(最大深度) | [5, 10, 15] |
| min_samples_split(最小分裂样本数) | [2, 5, 10] |
总组合数 = 3 × 3 × 3 = 27种。
4.2 网格搜索的工作流程
第1步:定义参数网格
↓
“n_estimators: [50, 100, 200], max_depth: [5, 10, 15]”
第2步:对每种组合进行K折交叉验证
↓
27种组合 × 5折 = 135次训练
第3步:找出最佳参数组合
↓
选交叉验证分数最高的
第4步:用最佳参数在全量训练集上训练
4.3 网格搜索的优缺点
| 优点 | 缺点 |
|---|---|
| 找到全局最优组合(在候选集内) | 计算量大(组合数爆炸) |
| 实现简单 | 参数多时不可行 |
| 结果可靠 | 需要合理设定候选范围 |
五、随机搜索
5.1 为什么需要随机搜索?
网格搜索的问题:参数组合太多时计算量爆炸。
| 参数 | 候选值 | 组合数 |
|---|---|---|
| 4个参数 | 各10个候选 | 10,000 |
| 6个参数 | 各10个候选 | 1,000,000 |
5.2 随机搜索的核心思想
不穷举,随机抽样——在参数空间中随机采样,用较少的尝试找到接近最优的组合。
类比:在一片区域找宝藏,网格搜索是每平方米都挖一遍;随机搜索是随机挖100个点。
5.3 网格搜索 vs 随机搜索
| 对比维度 | 网格搜索 | 随机搜索 |
|---|---|---|
| 搜索方式 | 穷举所有组合 | 随机采样 |
| 计算量 | 大 | 小 |
| 参数多时 | 不可行 | 可行 |
| 最优性 | 找到候选集内最优 | 可能错过最优点 |
经验法则:
- 参数少(≤3个)→ 网格搜索
- 参数多(≥4个)→ 随机搜索
- 先随机搜索粗调,再网格搜索精调
六、不同算法的调参方向
6.1 决策树
| 参数 | 作用 | 欠拟合方向 | 过拟合方向 |
|---|---|---|---|
max_depth |
最大深度 | ↑ 增大 | ↓ 减小 |
min_samples_split |
分裂所需最少样本数 | ↓ 减小 | ↑ 增大 |
min_samples_leaf |
叶子节点最少样本数 | ↓ 减小 | ↑ 增大 |
6.2 随机森林
| 参数 | 作用 | 欠拟合方向 | 过拟合方向 |
|---|---|---|---|
n_estimators |
树的数量 | ↑ 增大 | —(越大越稳定) |
max_depth |
树的最大深度 | ↑ 增大 | ↓ 减小 |
max_features |
每棵树用几个特征 | ↑ 增大 | ↓ 减小 |
min_samples_leaf |
叶子最少样本数 | ↓ 减小 | ↑ 增大 |
6.3 通用调试思路
| 现象 | 可能原因 | 尝试方向 |
|---|---|---|
| 欠拟合 | 模型太简单 | 增加复杂度、增加特征、减少正则化 |
| 过拟合 | 模型太复杂 | 降低复杂度、增加数据、增强正则化 |
| 训练慢 | 参数太大 | 减少树的数量、限制深度 |
| 效果抖动 | 随机性 | 固定random_state,增加树的数量 |
七、实战案例:随机森林调参
7.1 基线模型
| 参数 | 默认值 | 交叉验证R² |
|---|---|---|
| n_estimators=100, max_depth=None | 默认 | 0.62 |
训练集R²=0.91,验证集R²=0.62 → 过拟合(差距大)。
7.2 调参方向(降低复杂度)
| 步骤 | 调整 | 验证集R² | 训练集R² | 效果 |
|---|---|---|---|---|
| 基线 | 默认 | 0.62 | 0.91 | 过拟合严重 |
| 1 | max_depth=10 | 0.67 | 0.79 | 过拟合改善 |
| 2 | max_depth=8 | 0.69 | 0.74 | 更稳定 |
| 3 | + min_samples_leaf=5 | 0.70 | 0.72 | 差距缩小 |
| 4 | + n_estimators=200 | 0.71 | 0.73 | 微提升 |
最终参数:max_depth=8, min_samples_leaf=5, n_estimators=200
7.3 特征筛选
根据随机森林的特征重要性,删除不重要的特征:
| 特征 | 重要性 | 操作 |
|---|---|---|
| 车龄 | 0.38 | 保留 |
| 里程 | 0.25 | 保留 |
| 品牌 | 0.18 | 保留 |
| 功率 | 0.10 | 保留 |
| 变速箱 | 0.06 | 可选 |
| 燃油类型 | 0.03 | 删除 |
| 车身类型 | 0.02 | 删除 |
删除低重要性特征后:训练更快,效果基本不变(R²≈0.70)。
八、如何向AI描述调参需求
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 诊断问题 | “帮我判断模型是欠拟合还是过拟合” |
| 画学习曲线 | “画学习曲线,横轴是训练数据量,纵轴是误差” |
| 交叉验证 | “用5折交叉验证评估模型” |
| 网格搜索 | “用网格搜索调优随机森林,参数:n_estimators=[50,100,200],max_depth=[5,10,15]” |
| 随机搜索 | “用随机搜索调参,迭代20次” |
| 特征重要性 | “输出特征重要性,删掉重要性低于0.01的特征” |
九、本章总结
调参核心概念速记
| 概念 | 一句话 |
|---|---|
| 欠拟合 | 训练差,验证差 → 模型太简单 |
| 过拟合 | 训练好,验证差 → 模型太复杂 |
| 交叉验证 | K次训练取平均,评估更稳定 |
| 网格搜索 | 穷举所有参数组合 |
| 随机搜索 | 随机采样参数组合 |
| 学习曲线 | 诊断欠拟合/过拟合的工具 |
调参方向速记
| 问题 | 欠拟合 | 过拟合 |
|---|---|---|
| 模型复杂度 | ↑ 增加 | ↓ 降低 |
| 特征数量 | ↑ 增加 | ↓ 减少 |
| 正则化 | ↓ 减弱 | ↑ 增强 |
| 训练数据 | ↑ 增加 | ↑ 增加 |
搜索方法选择
| 参数数量 | 推荐方法 |
|---|---|
| ≤3个 | 网格搜索 |
| ≥4个 | 随机搜索 |
核心心法
“不要随机调参。先画学习曲线诊断问题,再针对性地选择调参方向。每次都记录结果,对比验证。”
十、思考题
-
训练集R²=0.99,验证集R²=0.52。这是欠拟合还是过拟合?应该增大还是减小max_depth?
-
为什么不能用测试集来调参?用测试集调参会有什么后果?
-
网格搜索和随机搜索,在什么情况下网格搜索明显优于随机搜索?什么情况下相反?
-
5折交叉验证和3折交叉验证,哪个更稳定?哪个计算量更大?为什么?
-
你花了3小时跑完网格搜索,找到的最佳参数组合R²=0.71。你用这个参数在全量数据上重新训练,测试集R²=0.70。你发现有个参数组合没搜到,想加上再跑一次。你会怎么做?
下一节预告:第七部分收尾——特征工程进阶:如何创造更好的特征来提升模型效果?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)