多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

BayesianOptimization 实战指南:基于高斯过程的 Python 全局优化库从原理到应用

BayesianOptimization 实战指南:基于高斯过程的 Python 全局优化库从原理到应用 机器学习【免费下载链接】BayesianOptimizationA Python implementation of global optimization with gaussian processes.项目地址https://gitcode.com/gh_mirrors/ba/BayesianOptimization点击查看免费下载本指南以 README.md 为骨架结合 bayes_opt 源码如 bayesian_optimization.py、acquisition.py、target_space.py、parameter.py及 tests 测试展开帮助读者掌握安装方法、核心概念、入门流程与进阶能力。简介BayesianOptimization 是一个纯 Python 实现的带约束全局优化包构建于贝叶斯推断和高斯过程Gaussian Processes, GP之上旨在以尽可能少的函数求值次数找到未知函数的最大值。它尤其适合目标函数求值成本高昂的场景以及需要**平衡探索exploration与利用exploitation**的优化问题。读完后你将掌握从安装、定义目标函数与参数边界到调用maximize完成优化、读取optimizer.max/optimizer.res结果再到利用predict、probe、set_bounds等 API 解决真实调参任务的完整能力。项目概况与定位本项目是一个 Pure Python implementation of bayesian global optimization with gaussian processes见 bayes_opt/init.py其核心目标是This is a constrained global optimization package built upon bayesian inference and gaussian processes, that attempts to find the maximum value of an unknown function in as few iterations as possible.即在参数空间的有界区域内用尽量少的采样次数逼近未知函数的最大值。该技术特别适合高成本函数求值和探索/利用平衡重要的场景。从源码结构看bayes_opt 包对外暴露的核心组件包括见init.pyBayesianOptimization优化器主类负责调度整个优化循环TargetSpace管理优化域参数边界并存储已评估的点ConstraintModel约束建模SequentialDomainReductionTransformer序列域缩减变换器ScreenLogger屏幕日志acquisition采集函数模块UCB / EI / POI / ConstantLiar / GPHedge 等。当前仓库版本为 3.4.0见 pyproject.toml要求 Python 3.9核心依赖包括numpy、scipy、scikit-learn高斯过程回归器即来自 sklearn。安装README 提供了两种安装方式方式一pip通过 PyPI$ pip install bayesian-optimization方式二Conda通过 conda-forge$ conda install -c conda-forge bayesian-optimization安装后即可通过from bayes_opt import BayesianOptimization使用。开发相关依赖如 pytest、jupyter、sphinx、ruff 等可在pyproject.toml的[project.optional-dependencies].dev中找到可选用pip install -e .[dev]安装以便运行测试与文档构建。工作原理贝叶斯优化如何用尽可能少的步骤找到最大值贝叶斯优化的核心思想是构造一个关于目标函数的后验分布高斯过程并基于后验不断决定下一个采样点。工作流程可以概括为构造先验/后验用高斯过程GP作为目标函数的概率代理模型。随着观测已采样的点增多后验分布逐步改善算法对参数空间中哪些区域值得探索、哪些不值得的把握越来越精确。拟合 GP每一步将当前已知样本此前探索过的点拟合进高斯过程回归器本项目内部使用sklearn.gaussian_process.GaussianProcessRegressor默认核为Matern(nu2.5)见 bayesian_optimization.py。选择下一个点将后验分布与一种**探索策略采集函数**结合例如 UCBUpper Confidence Bound置信上界或 EIExpected Improvement期望改进来确定下一个值得探索的点。代理优化通过求解采集函数的最大值一个比原始问题便宜得多的代理优化问题来选取下一个采样点。常用工具即可完成这一步。迭代收敛重复上述过程逐步逼近全局最优。上图展示了这一过程的核心可视化上方面板中深蓝实线为待优化的真实目标函数黑色虚线为高斯过程后验预测红色菱形为已观测点青绿色区域为 95% 置信区间——置信区间在观测点附近很窄、随距离增大而变宽直观体现了已知区域利用、未知区域探索的权衡下方面板的效用函数紫色实线用于指导下一个采样位置黄色五角星即下一个最优猜测点对应效用函数的最大值点。反复迭代时算法会根据对目标函数的已有认知不断平衡探索与利用的需求。这一过程的设计目标就是最小化逼近最优参数组合所需的步骤数。因此贝叶斯优化最适用于采样被优化函数非常昂贵的场景。项目处于活跃开发中若遇到问题、发现 bug 或需要修正的地方可以通过提交 issue 反馈见 README.md。快速上手一个完整的入门示例1. 定义要被优化的函数优化包的第一步且最重要的一步就是定义待优化的函数。README 中的示例函数如下def black_box_function(x, y): Function with unknown internals we wish to maximize. This is just serving as an example, for all intents and purposes think of the internals of this function, i.e.: the process which generates its output values, as unknown. return -x ** 2 - (y - 1) ** 2 1注意README 声明我们在这个例子里恰好知道函数输出如何依赖参数。真实场景中你并不需要知道——只要有一个函数f它接受一组已知参数并输出一个实数即可使用本包。2. 实例化优化器实例化BayesianOptimization指定待优化函数f和带边界的参数空间pbounds。这是一项有约束的优化技术因此必须为每个参数指定可探测的最小值和最大值from bayes_opt import BayesianOptimization # Bounded region of parameter space pbounds {x: (2, 4), y: (-3, 3)} optimizer BayesianOptimization( fblack_box_function, pboundspbounds, random_state1, )BayesianOptimization对象开箱即用无需太多调参。其主要构造参数对应 bayesian_optimization.py 中__init__的签名包括参数默认值说明f必填待最大化的目标函数pbounds必填字典键为参数名值为 (最小值, 最大值) 元组acquisition_functionNone采集函数为 None 时无约束问题默认UpperConfidenceBound(kappa2.576)有约束问题默认ExpectedImprovement(xi0.01)constraintNonescipy.optimize.NonlinearConstraint约束函数参数名须与f一致random_stateNone传入 int 作为种子或传入numpy.random.RandomStateNone 时生成未设定种子的随机状态verbose2日志详细程度bounds_transformerNone若提供DomainTransformer将作用于搜索边界allow_duplicate_pointsFalse为 True 时允许注册重复点适合高噪声场景否则重复点会触发NotUniqueError3. 调用 maximize 执行优化需要重点了解的核心方法是maximize。它有两个最重要的参数n_iter执行多少步贝叶斯优化。步数越多越有可能找到好的最大值。init_points执行多少步随机探索。随机探索可以通过多样化探索空间来帮助优化。optimizer.maximize( init_points2, n_iter3, )运行后屏幕会输出类似下面的迭代日志README 示例| iter | target | x | y | ------------------------------------------------- | 1 | -7.135 | 2.834 | 1.322 | | 2 | -7.78 | 2.0 | -1.186 | | 3 | -19.0 | 4.0 | 3.0 | | 4 | -16.3 | 2.378 | -2.413 | | 5 | -4.441 | 2.105 | -0.005822 | 从源码看maximize的默认参数为init_points5, n_iter25见 bayesian_optimization.py。其执行逻辑是先用随机点预热队列_prime_queue随后循环——若队列非空则从队列取出探测点由probe(lazyTrue)预先放入否则调用suggest()让采集函数给出下一个建议点若配置了bounds_transformer则在真正的迭代轮次之后调用set_bounds更新边界详见 maximize 实现。4. 读取优化结果找到的最佳参数组合与目标值通过属性optimizer.max访问print(optimizer.max) {target: -4.441293113411222, params: {y: -0.005822117636089974, x: 2.104665051994087}}所有被探测的参数及对应的目标值通过属性optimizer.res访问for i, res in enumerate(optimizer.res): print(Iteration {}: \n\t{}.format(i, res)) Iteration 0: {target: -7.135455292718879, params: {y: 1.3219469606529488, x: 2.8340440094051482}} Iteration 1: {target: -7.779531005607566, params: {y: -1.1860045642089614, x: 2.0002287496346898}} Iteration 2: {target: -19.0, params: {y: 3.0, x: 4.0}} Iteration 3: {target: -16.29839645063864, params: {y: -2.412527795983739, x: 2.3776144540856503}} Iteration 4: {target: -4.441293113411222, params: {y: -0.005822117636089974, x: 2.104665051994087}}max与res最终都委托给TargetSpace见 target_space.pymax()返回{target: ..., params: {...}}字典在有约束时还会附带constraint键res()返回每条记录的字典列表有约束时每条记录还会包含constraint与allowed字段。进阶 API从黑盒自动优化走向可控的优化流程除maximize外BayesianOptimization还提供若干可组合的底层 API均见 bayesian_optimization.pyregister(params, target, constraint_valueNone)直接注册一个已知目标值的观测点不调用目标函数。测试用例 test_register 对其进行了覆盖。probe(params, lazyTrue)在给定点评估函数。lazyTrue时点被放入队列待调用maximize()时评估lazyFalse时立即评估。对应测试见 test_probe_lazy 与 test_probe_eager。suggest()让采集函数建议下一个值得探测的点无观测时退化为随机采样可配合probe实现自定义优化循环。predict(params, return_stdFalse, return_covFalse, fit_gpTrue)在给定参数处预测目标函数值可返回预测标准差/协方差return_std与return_cov不能同时为 Truefit_gpTrue时预测前会重新拟合内部 GP观测数为 0 时会抛出RuntimeError可设置fit_gpFalse使用 GP 先验进行预测。set_bounds(new_bounds)修改搜索空间的边界字典参数名 → 新边界。set_gp_params(**params)设置内部GaussianProcessRegressor的参数若传kernel会自动用wrap_kernel包装以兼容参数类型变换见 parameter.py。random_sample(n1)从目标空间随机采样参数。save_state(path)/load_state(path)将优化器完整状态保存为 JSON 或从中恢复便于断点续跑状态涵盖 pbounds、已注册点、目标值、约束值、GP 参数、随机状态、采集函数参数等见 保存/加载实现。提示源码说明maximize循环只在基于采集函数建议新点时拟合 GP因此循环结束时 GP 可能并未在所有已注册点上完成拟合。若打算在优化结束后使用 GP 模型请记得调用predict(..., fit_gpTrue)显式拟合见 maximize 的 Warning 说明。参数类型不只有浮点数pbounds不仅支持连续浮点参数。从 parameter.py 与 target_space.py 的make_params逻辑可以看出参数被解析为三类浮点参数FloatParameterpbounds中给出二元数值元组或(min, max, float)三元组在浮点空间中连续采样核变换为恒等。整数参数IntParameter(min, max, int)三元组采样用randintkernel_transform会四舍五入取整。类别参数CategoricalParameterpbounds中直接给出候选值列表如[red, blue, green]内部以 one-hot 编码参与 GP 计算采样时随机选取类别见 CategoricalParameter。源码在检测到非浮点参数时会发出警告Non-float parameters are experimental and may not work as expected.提示该类参数属于实验性功能。整数与类别参数的优化方法见 README 中的引用文献 Garrido-Merchán Hernández-Lobato 的工作。采集函数调节探索与利用的天平采集函数Acquisition Function是决定下一步探测哪里的核心。模块位于 acquisition.pyREADME 明确提及 UCB 与 EI 两种完整实现还包括 POI、ConstantLiar、GPHedge。基础采集函数UpperConfidenceBoundUCBUCB(x) μ(x) κ·σ(x)。参数kappa默认 2.576控制探索/利用权衡越小越倾向利用exploitation越大越倾向探索exploration。还支持exploration_decay衰减率默认 None 不衰减与exploration_decay_delay延迟轮数实现 kappa 的逐步衰减decay_exploration。无约束问题默认使用它。ProbabilityOfImprovementPOIPOI(x) Φ((μ(x) - y_max - ξ)/σ(x))其中 Φ 为标准正态 CDFξ 控制探索/利用权衡越小越倾向利用。ExpectedImprovementEI在 POI 基础上还考虑改进幅度EI(x) (μ(x)-y_max-ξ)·Φ(...) σ(x)·φ(...)φ 为正态 PDF。有约束问题默认使用它默认xi0.01。元采集函数Meta Acquisition FunctionsConstantLiar用于异步/并行优化。它在目标空间的副本上注册假想点dummy points取值可为固定浮点数或min/mean/max策略从而降低 GP 在已被建议但尚未评估的点附近的方差避免多个 worker 重复建议同一点详见 ConstantLiar 实现。GPHedge一个元采集函数维护多个基础采集函数的累积收益gains每一步用 softmax 加权从各基础采集函数的建议中选出一个候选点基于 Brochu 等人的 portfolio allocation 思想详见 GPHedge。每个采集函数均可通过BayesianOptimization(acquisition_function...)传入。AcquisitionFunction是基类你可以通过继承它实现自定义采集函数。建议点的求解随机采样 智能优化suggest()使用随机采样廉价 智能优化昂贵但更准两段式策略见 acquisition.py 的_acq_min在参数空间随机采样n_random默认 10,000个点计算采集函数值取最优者同时选出n_smart默认 10个最优样本作为智能优化器的起点。若所有参数都是连续型用 L-BFGS-B 从这些起点出发做局部优化若存在离散参数则改用差分进化differential evolution并配合连续维度的确定性搜索细化结果。带约束的优化本项目定位是constrained global optimization。在构造优化器时可通过scipy.optimize.NonlinearConstraint传入约束约束函数参数名须与目标函数一致from scipy.optimize import NonlinearConstraint # 示例要求 x y 不小于 0约束函数与目标函数同名参数 def constraint_function(x, y): return x y optimizer BayesianOptimization( fblack_box_function, pboundspbounds, constraintNonlinearConstraint(constraint_function, lb0, ubnp.inf), )从 constraint.py 看约束由ConstraintModel用独立的 GP 建模对每个约束分别拟合 GP计算约束满足概率p Pr{c_low ≤ c̃(x) ≤ c_up}多个约束时假设条件独立联合概率为各概率之积。在建议新点时采集函数会乘以约束满足概率从而偏向满足约束的区域TargetSpace.max()也只返回满足约束与边界条件的最优点见 target_space.py 的mask逻辑。注意 UCB 与 ConstantLiar 不支持约束会抛ConstraintNotSupportedError有约束时默认改用 EI。README 中提供了约束优化的引用文献 Gardner et al. (2014) Bayesian optimization with inequality constraints。域缩减SequentialDomainReductionTransformer对于高维或边界设计空间大的问题可使用SequentialDomainReductionTransformer见 domain_reduction.py逐步收缩搜索窗口加速收敛。用法from bayes_opt import BayesianOptimization, SequentialDomainReductionTransformer bounds_transformer SequentialDomainReductionTransformer() optimizer BayesianOptimization( fblack_box_function, pboundspbounds, random_state1, bounds_transformerbounds_transformer, )其核心参数README 引用 Stander Craig (2002) 的域缩减方案gamma_osc默认 0.7用于缩放通常是抑制振荡的参数gamma_pan默认 1.0用于缩放通常为单位化平移的参数eta默认 0.9缩放参数用于收缩关注区域minimum_window默认 0.0每个参数的最小窗口宽度可为标量、数组或按参数名的字典。从源码看其每次变换以当前最优点为中心、以收缩率缩放后的窗口半径构造新边界并通过_trim确保新边界不超出全局边界、不小于最小窗口超出部分会被重置并给出警告见 domain_reduction.py。注意域缩减仅支持全浮点参数若存在非 FloatParameter 会抛出 ValueError见initialize。README 提供了对应的引用文献。输出与日志BayesianOptimization默认使用ScreenLoggerverbose 级别 2在控制台输出迭代表格。ScreenLogger同样由bayes_opt.logger导出见init.py并支持自定义 logger 以对接自己的日志体系。引用若在你的研究中使用了本包请按如下格式引用详见 README.mdMisc{, author {Fernando Nogueira}, title {{Bayesian Optimization}: Open source constrained global optimization tool for {Python}}, year {2014--}, url https://github.com/bayesian-optimization/BayesianOptimization }若使用了以下高级功能请额外引用相应文献SequentialDomainTransformerStander, Nielen and Craig, Kenneth (2002). On the robustness of a simple domain reduction scheme for simulation-based optimization. Engineering Computations, 19.约束优化Gardner, Jacob R et al. (2014). Bayesian optimization with inequality constraints. ICML 2014, pp. 937–945.非浮点参数优化Garrido-Merchán, Eduardo C and Hernández-Lobato, Daniel (2020). Dealing with categorical and integer-valued variables in bayesian optimization with gaussian processes. Neurocomputing, 380, pp. 20–35.进一步探索本仓库提供了丰富的示例与测试可继续深入Notebook 示例见 examples 目录包括 basic-tour.ipynb入门、advanced-tour.ipynb进阶、acquisition_functions.ipynb采集函数、constraints.ipynb约束、domain_reduction.ipynb域缩减、parameter_types.ipynb参数类型、async_optimization.py异步优化等。脚本示例如 sklearn_example.py配合 scikit-learn 的超参调优、typed_hyperparameter_tuning.py、duplicate_point.py重复点处理。测试用例见 tests如 test_bayesian_optimization.py、test_acquisition.py、test_constraint.py、test_target_space.py、test_seq_domain_red.py可用于验证各 API 行为与边界条件。文档源码见 docsrcSphinx 文档其中 reference 提供了各模块的 API 参考。结语BayesianOptimization 用高斯过程代理模型 采集函数的组合把昂贵函数的全局最大化压缩到极少的求值次数内。掌握maximize、probe、suggest、predict这套 API再配合采集函数选择、约束建模与域缩减你就能在机器学习超参调优、仿真优化等高成本场景中快速落地这套贝叶斯优化流程。赞分享机器学习【免费下载链接】BayesianOptimizationA Python implementation of global optimization with gaussian processes.项目地址https://gitcode.com/gh_mirrors/ba/BayesianOptimization点击查看免费下载相关推荐BayesianOptimization基于高斯过程的全局优化神器BayesianOptimization基于高斯过程的全局优化神器 BayesianOptimization 是一个基于贝叶斯推断和高斯过程的全局优化库专为机器学习BayesianOptimization基于高斯过程的贝叶斯全局优化库全面解析BayesianOptimization基于高斯过程的贝叶斯全局优化库全面解析 BayesianOptimization 是一个基于 Python 的纯实现贝机器学习BayesianOptimization 技术指南基于高斯过程的 Python 全局优化工具解析与实践BayesianOptimization 技术指南基于高斯过程的 Python 全局优化工具解析与实践 BayesianOptimization 是一个用纯机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表