文章

机器学习超参数搜索策略与贝叶斯优化简介

机器学习超参数搜索策略与贝叶斯优化简介

机器学习超参数搜索策略与贝叶斯优化简介

训练机器学习模型时,除算法选型外,超参数(树深度、学习率、正则系数等)往往决定最终效果。本文归纳常见超参数搜索策略——从固定配置、网格/随机搜索,到贝叶斯优化与 sklearn 内置 CV 估计器;说明各自原理、适用场景、落地成本与选型建议。不涉及特定业务系统,以表格分类与 scikit-learn 生态为主。


目录


1. 超参数与搜索策略是什么

概念说明
超参数(Hyperparameter)训练之前由人设定的配置,不由梯度下降直接学习,如 max_depthClearning_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 搜索。


做法:对离散化的超参列表做穷举组合,每组用交叉验证打分,取最优。

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 维通常改用随机搜索或贝叶斯优化。


做法:从超参分布中随机抽样固定次数(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 常见实现

代理模型 / 采样器特点
OptunaTPE(Tree-structured Parzen Estimator)等生态活跃,与 XGBoost/LightGBM 集成多
HyperoptTPE、随机等老牌贝叶斯优化库
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线性模型常用
ElasticNetCValpha + l1_ratioL1/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~303 维以上、含连续超参
贝叶斯优化代理模型指导下一组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
类别不平衡二分类StratifiedKFoldscoring='f1' 或业务选定指标
Kaggle / 大规模 GBDT 调参Optuna TPE,trial 30~100+
仅调正则 CLogisticRegressionCV,不必上贝叶斯
统一 AutoML 平台、多算法多超参贝叶斯优化 + 试验管理(落盘、剪枝、并行)

9. 落地成本与工程注意点

维度sklearn 网格/随机贝叶斯优化(Optuna)
新依赖需安装 Optuna / Hyperopt 等
代码量小(param_grid + GridSearchCV中(objectivestudy、回调)
与 Pipeline 集成Pipeline + GridSearchCV,参数名 clf__max_depthobjective 内构建 Pipeline,注意预处理只在训练折 fit
数据泄漏CV 必须在训练折内 fit 预处理器同上;禁止在全量数据上 fit 再 CV
小样本 + 少超参足够性价比偏低
可解释性网格结果一目了然需导出 study.trials_dataframe()
复现random_statesampler 种子 + n_trials 固定

交叉验证通用建议

  • 分类:StratifiedKFoldn_splits=35(样本极少时用 3)
  • 评分:f1roc_auc 等按任务选择,与业务指标对齐
  • 搜索应包在 Pipeline 内,使缩放、编码与模型在同一 CV 折内拟合

10. 实践配置示例

以下为通用模式(非特定项目配置):多算法并行时,可对每种算法只搜 1~2 个最关键超参,控制搜索空间。

算法建议自动搜索的超参推荐策略
逻辑回归CLogisticRegressionCV 或小网格 Cs=[0.01, 0.1, 1, 10]
随机森林max_depthmin_samples_leafGridSearchCV(3×3)或 RandomizedSearchCV(n_iter≤12)
XGBoost / LightGBMmax_depthlearning_rateRandomizedSearchCV 或 Optuna(trial 多时再上贝叶斯)
SVMCgamma小网格或随机搜索(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 少时更高效
是否最近很通用工业界/竞赛常见;小空间少超参时优势不明显
零依赖首选GridSearchCVRandomizedSearchCV*CV 内置估计器
何时上 Optuna超参维度高、trial 成本高、需要试验管理与剪枝
工程底线Pipeline + CV 防泄漏;random_state 保复现

12. 参考与来源

资源链接
scikit-learn Model selectionhttps://scikit-learn.org/stable/model_selection.html
GridSearchCVhttps://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
RandomizedSearchCVhttps://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html
LogisticRegressionCVhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegressionCV.html
Optuna 文档https://optuna.readthedocs.io/
Bergstra & Bengio, Random Search for Hyper-Parameter Optimizationhttps://jmlr.org/papers/v13/bergstra12a.html
本文由作者按照 CC BY 4.0 进行授权