模型评估与选择核心20 分钟kp-024#调参#超参数#贝叶斯优化

超参数调优:网格、随机与贝叶斯搜索

进度

一句话定义

超参数调优在「配置 → 交叉验证评分」的搜索空间上寻找最优配置:网格搜索穷举所有组合、随机搜索按分布采样(常以更少预算找到同样好的配置)、贝叶斯优化用代理模型引导采样。

为什么重要

超参数(正则强度、学习率、树深、核宽 γ……)不由训练决定却深刻影响性能,「调参」是模型交付前的必修工序;预算有限时选对搜索策略、写对搜索空间,比换更花哨的模型常常更见效。它也是「计算换性能」思路的最直接体现。

前置知识

交叉验证与数据划分策略 的 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 上报告。

公式与推导

调优的优化目标(嵌套结构):

ĥ = argminh ∈ ℋ   R̂cv(h),      R̂cv(h) = 1k∑j=1k R̂Fj(𝒜(h, Dtrain ∖ Fj))

外层在配置空间选 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. 为什么随机搜索常胜过同预算网格?

- 要点:低有效维度下,随机采样给重要超参数更多独立取值,网格则把预算浪费在平缓维的格点上。

  1. 为什么 λ、γ、学习率要用对数均匀分布?

- 要点:敏感度跨数量级,均匀分布几乎采不到 <1 的关键区间;对数采样保证每个量级均匀覆盖。

  1. 贝叶斯优化适合什么场景?两个组件是什么?

- 要点:单次评估贵、维度低;代理模型拟合分数曲面 + 采集函数(如 EI)平衡开发与探索地选下一个点。

延伸阅读

Bergstra & Bengio, Random Search for Hyper-Parameter Optimization(JMLR, 2012);Frazier, A Tutorial on Bayesian Optimization(arXiv:1707.01338,概念梳理可按需核对)。