超参数调优:网格、随机与贝叶斯搜索
一句话定义
超参数调优在「配置 → 交叉验证评分」的搜索空间上寻找最优配置:网格搜索穷举所有组合、随机搜索按分布采样(常以更少预算找到同样好的配置)、贝叶斯优化用代理模型引导采样。
为什么重要
超参数(正则强度、学习率、树深、核宽 γ……)不由训练决定却深刻影响性能,「调参」是模型交付前的必修工序;预算有限时选对搜索策略、写对搜索空间,比换更花哨的模型常常更见效。它也是「计算换性能」思路的最直接体现。
前置知识
交叉验证与数据划分策略 的 CV 评分协议(一切搜索的标尺)。
核心概念
- 超参数 vs 参数:调优搜索的配置 vs 训练学出的权重。
- 搜索空间:每个超参数的候选分布(对数均匀刻度对 λ、γ、学习率是标配)。
- 网格搜索:笛卡尔积全扫,N1 × N2 × ⋯ 组合数爆炸。
- 随机搜索:按分布抽 n 组;重要的超参数每维都被充分探索。
- 贝叶斯优化:代理模型(常用 TPE/高斯过程)拟合「配置 → 分数」,按采集函数(EI/UCB)权衡开发与探索。
- Halving(逐层减半):先用极少数据/极多候选,逐轮淘汰,适合大网格。
- 过拟合验证集:搜索次数过多时 CV 分数也被「用坏」,需嵌套评估或保留测试集。
直观类比
找餐厅:网格搜索是把地图画成等距格子每格必吃——预算爆炸;随机搜索是按你常出没的概率分布随机挑店——总有一些好店被撞上;贝叶斯优化是先记住「哪家好吃/难吃」,再在「看起来有戏」(期望提升大)与「信息少」(探索)之间挑下一家。低有效维度的品味问题(只有 1~2 个超参数真正重要)里,随机采样命中率天然高——这正是 Bergstra & Bengio 的核心论证。
原理与机制
对数空间的重要性:λ 的好区间可能是 [10-4, 10],均匀采样大概率全落在 [1, 10];loguniform 采样保证每个数量级被均匀覆盖。随机胜网格的机制:设只有 2 个超参数重要、其余平缓,网格把预算浪费在平缓维的精细格点上,随机搜索在重要维上取到任意多不同值——「格子对不齐」反而成了优势。贝叶斯优化的循环:初始随机采样 → 拟合代理 → 采集函数选下一个点(期望改进 EI 最大处)→ 评估入池 → 循环;对「评估贵、维度低(< 20)」的调参场景是标准升级。工程铁律:搜索内层用 CV 评分,全部流程包进 Pipeline(防 kp-025 泄漏),最终在外层测试集/嵌套 CV 上报告。
公式与推导
调优的优化目标(嵌套结构):
外层在配置空间选 h,内层对每个 h 做完整训练与验证——这是双层优化的「内层近似解」性质,也是必须嵌套评估的原因。期望改进采集函数:EI(h) = 𝔼[max(f^* - f(h), 0)](f^* 为当前最优分数),在均值高或方差大处都取正值,自动实现开发/探索平衡。
图示
重要维度 λ(对数轴) 平缓维度 m
网格 4×4: 随机 16 点:
λ: ▲ ▲ ▲ ▲(仅4个取值) λ: ▲▲▲▲▲▲▲▲▲▲…(16个取值)
m: ▲▲▲▲▲▲▲▲▲▲▲▲(16列) m: ▲▲▲ ▲ ▲▲ (随意撒)
→ 平缓维上浪费 12 列 → 重要维充分探索
(★=好区域,随机法命中机会更大)实例或案例
SVM 的 (C, γ) 随机搜索(对数空间):
from sklearn.datasets import load_digits
from sklearn.svm import SVC
from sklearn.model_selection import RandomizedSearchCV, train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from scipy.stats import loguniform # scikit-learn 的既有依赖,无需额外安装
X, y = load_digits(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, stratify=y, random_state=0)
search = RandomizedSearchCV(
make_pipeline(StandardScaler(), SVC()),
param_distributions={"svc__C": loguniform(1e-1, 1e3),
"svc__gamma": loguniform(1e-4, 1e0)},
n_iter=40, cv=5, n_jobs=-1, random_state=0)
search.fit(X_tr, y_tr)
print("最优参数:", search.best_params_)
print("CV 分数:", round(search.best_score_, 4), " 测试集:", round(search.score(X_te, y_te), 4))常见误区
- 网格均匀刻度扫正则强度/学习率:有效分辨率极低,必须对数刻度。
- 搜索空间写太窄:最优值可能贴边,看到最优参数在边界上就该外扩空间重搜。
- 搜索轮数过多后拿 CV 分数当性能报告:选择偏差累积;报告必须来自未参与搜索的测试集或嵌套 CV。
- 无预算意识:先粗(随机 20 点)后细(在最优点附近网格),比一步到位的巨型网格省一个量级。
与其他知识点的关系
交叉验证与数据划分策略 的 CV 是评分引擎,本节是其上的外层循环;正则化:岭回归、Lasso 与弹性网/核技巧与常用核函数/梯度提升树 GBDT 与 XGBoost 各自的关键超参数(λ、(C, γ)、学习率×树深)是常见搜索对象;数据泄漏与常见评估陷阱 的 Pipeline 包裹是搜索不泄漏的前提。
自测题
- 为什么随机搜索常胜过同预算网格?
- 要点:低有效维度下,随机采样给重要超参数更多独立取值,网格则把预算浪费在平缓维的格点上。
- 为什么 λ、γ、学习率要用对数均匀分布?
- 要点:敏感度跨数量级,均匀分布几乎采不到 <1 的关键区间;对数采样保证每个量级均匀覆盖。
- 贝叶斯优化适合什么场景?两个组件是什么?
- 要点:单次评估贵、维度低;代理模型拟合分数曲面 + 采集函数(如 EI)平衡开发与探索地选下一个点。
延伸阅读
Bergstra & Bengio, Random Search for Hyper-Parameter Optimization(JMLR, 2012);Frazier, A Tutorial on Bayesian Optimization(arXiv:1707.01338,概念梳理可按需核对)。