机器学习超参数搜索策略与贝叶斯优化简介
训练机器学习模型时,除算法选型外,超参数(树深度、学习率、正则系数等)往往决定最终效果。本文归纳常见超参数搜索策略——从固定配置、网格/随机搜索,到贝叶斯优化与 sklearn 内置 CV 估计器;说明各自原理、适用场景、落地成本与选型建议。不涉及特定业务系统,以表格分类与 scikit-learn 生态为主。
目录
1. 超参数与搜索策略是什么
| 概念 | 说明 |
|---|
| 超参数(Hyperparameter) | 训练之前由人设定的配置,不由梯度下降直接学习,如 max_depth、C、learning_rate |
| 模型参数(Parameter) | 训练过程中学到的权重、分裂点等,如逻辑回归系数、树节点阈值 |
| 超参数搜索 | 在候选组合中,用验证集或交叉验证指标选出较优超参的一套流程 |
| 搜索策略 | 如何生成、评估、筛选候选超参组合的方法(网格、随机、贝叶斯等) |
贝叶斯优化是超参数搜索的一种策略,不是新的算法类型;与网格搜索、随机搜索并列,解决「下一组该试什么参数」的问题。
2. 固定超参:人工配置基线
做法:在配置文件或代码中写死一组超参,训练时直接 fit,不做自动搜索。
1
2
3
4
5
6
7
8
| from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(
max_depth=8,
min_samples_leaf=5,
random_state=42,
)
clf.fit(X_train, y_train)
|
| 优点 | 缺点 |
|---|
| 零搜索成本,可复现性最好 | 未必接近最优,换数据集易失效 |
| 无额外依赖,调试简单 | 调参全靠经验,难以量化「还差多少」 |
适用:快速原型、基线对比、搜索空间极小且已有成熟默认值时。工程上常作为第一版;效果稳定后再考虑 CV 搜索。
3. 网格搜索 Grid Search
做法:对离散化的超参列表做穷举组合,每组用交叉验证打分,取最优。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
param_grid = {
"max_depth": [4, 8, 12],
"min_samples_leaf": [2, 5, 10],
}
search = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid,
cv=3,
scoring="f1",
n_jobs=-1,
)
search.fit(X_train, y_train)
print(search.best_params_, search.best_score_)
|
| 优点 | 缺点 |
|---|
| 简单、可复现、结果可解释 | 维度一多组合数指数爆炸 |
sklearn 原生 GridSearchCV | 连续超参需先离散化,粒度难兼顾 |
经验:单算法 2~3 个超参、每维 3~5 个候选时仍可控;超过 5 维通常改用随机搜索或贝叶斯优化。
4. 随机搜索 Random Search
做法:从超参分布中随机抽样固定次数(n_iter),每组做 CV 评估。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint, uniform
param_dist = {
"max_depth": randint(4, 16),
"min_samples_leaf": randint(2, 20),
"max_features": uniform(0.3, 0.7),
}
search = RandomizedSearchCV(
RandomForestClassifier(random_state=42),
param_dist,
n_iter=12,
cv=3,
scoring="f1",
random_state=42,
n_jobs=-1,
)
search.fit(X_train, y_train)
|
| 优点 | 缺点 |
|---|
| 高维时往往不比网格差(Bergstra & Bengio, 2012) | 不保证覆盖边界组合 |
| 易对连续超参采样 | 试验次数少时方差较大 |
| 实现简单,仍属 sklearn 生态 | 无「利用历史 trial 智能选下一组」 |
经验:搜索空间 3 维以上或含连续超参时,n_iter=10~30 + 3~5 折 CV 是工业界常见起点;小样本场景 n_iter=6~12 往往已够用。
5. 贝叶斯优化 Bayesian Optimization
做法:根据已有 trial 的观测结果,用代理模型(Surrogate Model)估计「哪组超参更可能更好」,再智能选择下一组试验点,在有限 trial 预算下尽量少试、多赚。
1
2
3
4
5
6
7
| 初始化若干随机 trial
↓
用 CV 指标评估 → 更新代理模型(如高斯过程、TPE)
↓
代理模型推荐下一组超参
↓
重复直至 trial 预算用尽 → 输出 best params
|
5.1 常见实现
| 库 | 代理模型 / 采样器 | 特点 |
|---|
| Optuna | TPE(Tree-structured Parzen Estimator)等 | 生态活跃,与 XGBoost/LightGBM 集成多 |
| Hyperopt | TPE、随机等 | 老牌贝叶斯优化库 |
| scikit-optimize | 高斯过程(GP) | 与 sklearn 风格接近,小维度表现好 |
| Ray Tune | 多种 scheduler | 分布式、大规模 trial |
Optuna 最小示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| import optuna
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
def objective(trial):
params = {
"max_depth": trial.suggest_int("max_depth", 4, 16),
"min_samples_leaf": trial.suggest_int("min_samples_leaf", 2, 20),
}
clf = RandomForestClassifier(**params, random_state=42)
cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
scores = cross_val_score(clf, X_train, y_train, cv=cv, scoring="f1")
return scores.mean()
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=30)
print(study.best_params, study.best_value)
|
5.2 优势与局限
| 优势 | 局限 |
|---|
| trial 预算有限时,通常比纯随机更高效 | 需额外依赖(Optuna 等) |
| 适合 5 个以上超参、单次 trial 较贵(大模型训练) | 要编写 objective、处理超时与落盘 |
| Kaggle、AutoML 平台常见 | 小搜索空间 + 少超参时性价比偏低 |
| | trial 轨迹可解释性弱于网格,需额外记录 |
是不是「最近很通用」? 在工业界、竞赛、大规模 AutoML 中,贝叶斯优化 / Optuna 确实很常见;但在小样本、每模型只调 1~2 个超参、搜索空间很小的场景,随机搜索或小网格 + 3 折 CV 往往更简单、更稳,贝叶斯优势不明显。
6. sklearn 内置自动选参
部分估计器在单一或少数超参上提供解析解或内置 CV,无需外层 GridSearchCV:
| 估计器 | 自动选择的量 | 说明 |
|---|
LogisticRegressionCV | 正则 C(及 l1_ratio) | 沿 C 网格做 CV,零额外库 |
RidgeCV / LassoCV / ElasticNetCV | 正则强度 alpha | 线性模型常用 |
ElasticNetCV | alpha + l1_ratio | L1/L2 混合 |
GammaRegressor 等 GLM | 部分正则路径 | 视版本与族而定 |
示例——逻辑回归只调 C:
1
2
3
4
5
6
7
8
9
10
11
| from sklearn.linear_model import LogisticRegressionCV
clf = LogisticRegressionCV(
Cs=10,
cv=3,
scoring="f1",
max_iter=1000,
random_state=42,
)
clf.fit(X_train, y_train)
print(clf.C_) # 每个类别或 OvR 下的最优 C
|
适用:超参维度极低(尤其线性模型正则项)时,优先用内置 CV,代码量小、无新依赖。
7. 策略总览与对比
| 策略 | 做法 | 新依赖 | 典型 trial 数 | 最适合 |
|---|
| 固定超参 | 人工写死 | 无 | 1 | 基线、默认值已验证 |
| 网格搜索 | 穷举离散组合 | 无(sklearn) | 各维候选数之积 | 2~3 维、候选少 |
| 随机搜索 | 随机抽样 n_iter 组 | 无(sklearn) | 10~30 | 3 维以上、含连续超参 |
| 贝叶斯优化 | 代理模型指导下一组 | Optuna 等 | 20~100+ | 5 维以上、trial 贵 |
| 内置 CV 估计器 | 估计器内部沿路径搜 | 无 | 内置网格 | 只调 C/alpha 等 |
8. 何时用哪种策略
1
2
3
4
5
6
7
8
9
10
11
| 超参几个?样本多大?trial 贵不贵?
│
├─ 0 个要搜(用默认)──────→ 固定超参
│
├─ 1 个(如 LR 的 C)──────→ LogisticRegressionCV 等内置 CV
│
├─ 2~3 个,离散候选少 ────→ GridSearchCV 或小网格
│
├─ 3 个以上 / 含连续分布 ──→ RandomizedSearchCV(n_iter=6~30)
│
└─ 5 个以上 / 单次训练很慢 ─→ Optuna 等贝叶斯优化
|
| 场景 | 推荐策略 |
|---|
| 表格小样本(数百级)、每算法 1~2 个超参 | 小网格或 RandomizedSearchCV(n_iter=6~12) + 3 折 CV |
| 类别不平衡二分类 | StratifiedKFold,scoring='f1' 或业务选定指标 |
| Kaggle / 大规模 GBDT 调参 | Optuna TPE,trial 30~100+ |
仅调正则 C | LogisticRegressionCV,不必上贝叶斯 |
| 统一 AutoML 平台、多算法多超参 | 贝叶斯优化 + 试验管理(落盘、剪枝、并行) |
9. 落地成本与工程注意点
| 维度 | sklearn 网格/随机 | 贝叶斯优化(Optuna) |
|---|
| 新依赖 | 无 | 需安装 Optuna / Hyperopt 等 |
| 代码量 | 小(param_grid + GridSearchCV) | 中(objective、study、回调) |
| 与 Pipeline 集成 | Pipeline + GridSearchCV,参数名 clf__max_depth | 在 objective 内构建 Pipeline,注意预处理只在训练折 fit |
| 数据泄漏 | CV 必须在训练折内 fit 预处理器 | 同上;禁止在全量数据上 fit 再 CV |
| 小样本 + 少超参 | 足够 | 性价比偏低 |
| 可解释性 | 网格结果一目了然 | 需导出 study.trials_dataframe() |
| 复现 | random_state | sampler 种子 + n_trials 固定 |
交叉验证通用建议:
- 分类:
StratifiedKFold,n_splits=3 或 5(样本极少时用 3) - 评分:
f1、roc_auc 等按任务选择,与业务指标对齐 - 搜索应包在 Pipeline 内,使缩放、编码与模型在同一 CV 折内拟合
10. 实践配置示例
以下为通用模式(非特定项目配置):多算法并行时,可对每种算法只搜 1~2 个最关键超参,控制搜索空间。
| 算法 | 建议自动搜索的超参 | 推荐策略 |
|---|
| 逻辑回归 | C | LogisticRegressionCV 或小网格 Cs=[0.01, 0.1, 1, 10] |
| 随机森林 | max_depth、min_samples_leaf | GridSearchCV(3×3)或 RandomizedSearchCV(n_iter≤12) |
| XGBoost / LightGBM | max_depth、learning_rate | RandomizedSearchCV 或 Optuna(trial 多时再上贝叶斯) |
| SVM | C、gamma | 小网格或随机搜索(gamma 常用 scale/auto 或 log 采样) |
统一 CV 配置示例:
1
2
3
4
| from sklearn.model_selection import StratifiedKFold
cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
# scoring="f1" # 二分类不平衡时常用
|
综合选型结论(讨论归纳):
- 搜索空间小、每模型 1~2 个超参:不必上贝叶斯;
sklearn 内置 CV / 小网格 / RandomizedSearchCV 更简单、够用。 - 仅
sklearn 即可覆盖多数表格学习场景,零新依赖。 - 待扩展到每算法 5 个以上超参或统一 AutoML 平台时,再引入 Optuna 等贝叶斯优化不迟。
11. 小结
| 要点 | 结论 |
|---|
| 贝叶斯优化是什么 | 一种超参数搜索策略,用历史 trial 建代理模型、智能选下一组参数 |
| 与网格/随机的差 | 网格穷举、随机无记忆;贝叶斯利用历史、trial 少时更高效 |
| 是否最近很通用 | 工业界/竞赛常见;小空间少超参时优势不明显 |
| 零依赖首选 | GridSearchCV、RandomizedSearchCV、*CV 内置估计器 |
| 何时上 Optuna | 超参维度高、trial 成本高、需要试验管理与剪枝 |
| 工程底线 | Pipeline + CV 防泄漏;random_state 保复现 |
12. 参考与来源
| 资源 | 链接 |
|---|
| scikit-learn Model selection | https://scikit-learn.org/stable/model_selection.html |
| GridSearchCV | https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html |
| RandomizedSearchCV | https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html |
| LogisticRegressionCV | https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegressionCV.html |
| Optuna 文档 | https://optuna.readthedocs.io/ |
| Bergstra & Bengio, Random Search for Hyper-Parameter Optimization | https://jmlr.org/papers/v13/bergstra12a.html |