模型优化调参利器贝叶斯优化bayesian-optimization实践

news2025/2/23 21:21:56

早在之前很多项目尤其是预测类型的项目中,就已经比较广泛地在实用贝叶斯优化库了,这是一个非常出色的纯python实现的项目,地址在这里,如下所示:

写这篇文章主要有两个目的,一方面是觉得这个工具库挺不错的值得学习使用;另一方面是这段时间陆陆续续在使用的过程中出现了很多莫名的错误,虽然一部分在官方的issues中已经得到了解决,但是还是有几个问题依旧是无法解决,所以就想着一方面找时间看下官方的介绍说明看看有没有合适的办法,另一方面就是作为一个开放讨论的平台,欢迎有同样问题的朋友交流沟通。

安装方式很简单:

$ pip install bayesian-optimization

贝叶斯优化通过构造函数的后验分布(高斯过程)来工作,该后验分布最好地描述了要优化的函数。随着观测值数量的增加,后验分布得到改善,算法更加确定参数空间中哪些区域值得探索,哪些区域不值得探索,如下图所示。

当您反复迭代时,该算法会根据其对目标函数的了解来平衡其探索和开发需求。在每个步骤中,将高斯过程拟合到已知样本(先前探索的点),并使用后验分布结合探索策略(例如UCB(置信上限)或EI(预期改进)),以确定应探索的下一个点(动图gif)。

此过程旨在最小化找到接近最佳组合的参数组合所需的步骤数。为此,该方法使用了一个代理优化问题(寻找捕获函数的最大值),尽管这仍然是一个困难的问题,但成本较低(在计算意义上),并且可以使用通用工具。因此,贝叶斯优化是最适合的情况下采样的功能进行优化是一个非常昂贵的努力。

官方项目中提供了基础使用教程和进阶使用教程还有一些对应的开发实例。

基础使用教程

这是一个基于贝叶斯推理和高斯过程的约束全局优化包,它试图在尽可能少的迭代中找到未知函数的最大值。该技术特别适用于高成本函数的优化,在这种情况下,勘探和开发之间的平衡非常重要。贝叶斯优化通过构造函数的后验分布(高斯过程)来工作,该后验分布最好地描述了要优化的函数。随着观测值数量的增加,后验分布得到改善,算法更加确定参数空间中哪些区域值得探索,哪些区域不值得探索,如下图所示。
当您反复迭代时,该算法会根据其对目标函数的了解来平衡其探索和开发需求。在每个步骤中,将高斯过程拟合到已知样本(先前探索的点),并使用后验分布结合探索策略(例如UCB(置信上限)或EI(预期改进)),以确定应探索的下一个点(参见下面的gif)。
此过程旨在最小化找到接近最佳组合的参数组合所需的步骤数。为此,该方法使用了一个代理优化问题(寻找捕获函数的最大值),尽管这仍然是一个困难的问题,但成本较低(在计算意义上),并且可以使用通用工具。因此,贝叶斯优化是最适合的情况下采样的功能进行优化是一个非常昂贵的努力。

1、指定优化函数

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

2、实践应用

from bayes_opt import BayesianOptimization
# Bounded region of parameter space
pbounds = {'x': (2, 4), 'y': (-3, 3)}
optimizer = BayesianOptimization(
    f=black_box_function,
    pbounds=pbounds,
    verbose=2, # verbose = 1 prints only when a maximum is observed, verbose = 0 is silent
    random_state=1,
)
optimizer.maximize(
    init_points=2,
    n_iter=3,
)
print(optimizer.max)
for i, res in enumerate(optimizer.res):
    print("Iteration {}: \n\t{}".format(i, res))
#修改参数边界
optimizer.set_bounds(new_bounds={"x": (-2, 3)})
optimizer.maximize(
    init_points=0,
    n_iter=5,
)

3、优化

optimizer.probe(
    params={"x": 0.5, "y": 0.7},
    lazy=True,
)
print(optimizer.space.keys)
optimizer.probe(
    params=[-0.3, 0.1],
    lazy=True,
)
optimizer.maximize(init_points=0, n_iter=0)

4、存储、加载、继续

#Saving progress
from bayes_opt.logger import JSONLogger
from bayes_opt.event import Events

logger = JSONLogger(path="./logs.log")
optimizer.subscribe(Events.OPTIMIZATION_STEP, logger)
optimizer.maximize(
    init_points=2,
    n_iter=3,
)

#Loading progress
from bayes_opt.util import load_logs
new_optimizer = BayesianOptimization(
    f=black_box_function,
    pbounds={"x": (-2, 2), "y": (-2, 2)},
    verbose=2,
    random_state=7,
)
print(len(new_optimizer.space))

load_logs(new_optimizer, logs=["./logs.log"]);
print("New optimizer is now aware of {} points.".format(len(new_optimizer.space)))
new_optimizer.maximize(
    init_points=0,
    n_iter=10,
)

进阶使用教程

1.、Suggest-Evaluate-Register Paradigm

# Let's start by defining our function, bounds, and instantiating an optimization object.
def black_box_function(x, y):
    return -x ** 2 - (y - 1) ** 2 + 1


optimizer = BayesianOptimization(
    f=None,
    pbounds={'x': (-2, 2), 'y': (-3, 3)},
    verbose=2,
    random_state=1,
)


from bayes_opt import UtilityFunction

utility = UtilityFunction(kind="ucb", kappa=2.5, xi=0.0)

next_point_to_probe = optimizer.suggest(utility)
print("Next point to probe is:", next_point_to_probe)

target = black_box_function(**next_point_to_probe)
print("Found the target value to be:", target)

optimizer.register(
    params=next_point_to_probe,
    target=target,
)


#The maximize loop
for _ in range(5):
    next_point = optimizer.suggest(utility)
    target = black_box_function(**next_point)
    optimizer.register(params=next_point, target=target)

    print(target, next_point)
print(optimizer.max)





2、Dealing with discrete parameters

def func_with_discrete_params(x, y, d):
    # Simulate necessity of having d being discrete.
    assert type(d) == int

    return ((x + y + d) // (1 + d)) / (1 + (x + y) ** 2)
def function_to_be_optimized(x, y, w):
    d = int(w)
    return func_with_discrete_params(x, y, d)
optimizer = BayesianOptimization(
    f=function_to_be_optimized,
    pbounds={'x': (-10, 10), 'y': (-10, 10), 'w': (0, 5)},
    verbose=2,
    random_state=1,
)
optimizer.set_gp_params(alpha=1e-3)
optimizer.maximize()

3、Tuning the underlying Gaussian Process

optimizer = BayesianOptimization(
    f=black_box_function,
    pbounds={'x': (-2, 2), 'y': (-3, 3)},
    verbose=2,
    random_state=1,
)
optimizer.set_gp_params(alpha=1e-3, n_restarts_optimizer=5)
optimizer.maximize(
    init_points=1,
    n_iter=5
)


from bayes_opt.event import DEFAULT_EVENTS, Events
optimizer = BayesianOptimization(
    f=black_box_function,
    pbounds={'x': (-2, 2), 'y': (-3, 3)},
    verbose=2,
    random_state=1,
)
class BasicObserver:
    def update(self, event, instance):
        """Does whatever you want with the event and `BayesianOptimization` instance."""
        print("Event `{}` was observed".format(event))
my_observer = BasicObserver()

optimizer.subscribe(
    event=Events.OPTIMIZATION_STEP,
    subscriber=my_observer,
    callback=None, # Will use the `update` method as callback
)


def my_callback(event, instance):
    print("Go nuts here!")

optimizer.subscribe(
    event=Events.OPTIMIZATION_START,
    subscriber="Any hashable object",
    callback=my_callback,
)
optimizer.maximize(init_points=1, n_iter=2)

进一步的详情可以自行了解官方教程即可。

简单的实践介绍就到这里,下面说两个还记得的报错问题。

1、StopIteration: Queue is empty error in optimizer.maximize()

关于这个问题,官方论坛和stackoverflow论坛里面都有很多讨论,也有给出一些对应的解决办法,但是都没有能解决我的问题。

2、"ValueError: array must not contain infs or NaNs" happens after self.suggest().

这个问题与上面问题往往是交替或者是同时出现的。

目前依旧在研究文档,不知道是不是自己哪里理解有误导致的,也欢迎有同样问题的朋友一起沟通交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1899287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不花钱如何让网站启用HTTPS访问

在互联网的世界里,数据安全已经成为了每个网站和用户都不得不面对的问题。近期,网络信息泄露事件频发,让越来越多的网站开始重视起用户数据的安全性,因此启用HTTPS访问成为了一个网站必须要部署的。 HTTPS协议,作为HT…

Docker:Docker网络

Docker Network 是 Docker 平台中的一项功能,允许容器相互通信以及与外界通信。它提供了一种在 Docker 环境中创建和管理虚拟网络的方法。Docker 网络使容器能够连接到一个或多个网络,从而使它们能够安全地共享信息和资源。 预备知识 推荐先看视频先有…

算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 更多内容,见微*公号往期文章,阅读人数已破 10, 000:协方差、方差、标准…

windows下使用编译opencv在qt中使用

记录一下:在windows下qt使用opencv 1、涉及需要下载的软件 CMake 下载地址opecnv下载地址mingw(需要配置环境变量) 这个在下载qt的时候可以直接安装一般在qt的安装路径下的tool里比如我的安装路径 (C:\zz\ProgramFiles\QT5.12\Tools\mingw730_64) 2、在安装好CMake…

植物大战僵尸杂交版2.2手机安装方法以及全屏方法

大家好,我是坤坤黑科技。大家期待了很久的植物大战僵尸2.2版本也在昨天更新了,今天给大家分享最新的植物大战僵尸杂交版2.2版本手机的安装方法以及全屏方法~ 植物大战僵尸杂交版2.2(安卓) 1.首先我们需要先下载好Winlator模拟器~…

Vue iview-ui 被tooltip包裹的标题,点击跳转后,提示框不消失

tooltip包裹的标题,点击跳转后,提示框不消失 就会有这种显示问题 下面这种错误方法不可行,解决办法往下翻 css写得没错,问题出在Javascript当中的 getElementsByClassName(“xxabc”), 这个方法得到的是一个由class&q…

Facebook社群对于个人和品牌的价值探讨

Facebook社群作为连接兴趣和人群的重要平台,不仅为个人提供了交流互动的空间,也成为品牌建立和发展的重要途径。本文将深入探讨Facebook社群在个人和品牌发展中的多重价值,以及如何有效利用这些社群来实现个人和品牌的目标。 1. 社群对个人的…

使用 docker buildx 构建跨平台镜像

buildx是Docker官方提供的一个构建工具,它可以帮助用户快速、高效地构建Docker镜像,并支持多种平台的构建。使用buildx,用户可以在单个命令中构建多种架构的镜像,例如x86和arm架构,而无需手工操作多个构建命令。此外bu…

Python从入门到放弃——整数类型变量

变量 前言 上一篇文章中我们学习了Print函数,并且深入的理解了Print函数的各个参数。明确了应该如何利用各种参数来实现我们想输出的效果。那么现在让我们来学习一下变量这一个知识点。 什么是变量 变量,作为编程中的核心概念之一,其重要性…

计算机的错误计算(二十二)

摘要 计算机的错误计算(十九)展示了计算机的一个错误计算:本应该为 0的算式的结果不为0. 那么,增加计算精度,能确定是0吗?不一定。 计算机的错误计算(十九)展示了计算机对 的错误计…

74. 搜索二维矩阵【二分法】【C++】

题目描述 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则&…

海外金融机构银行保险证券数字化转型营销销售数字化成功案例讲师培训师讲授开户销售营销客户AI人工智能创新思维

金融机构需要数字营销的主要原因 数字银行、直接存款和移动网络的兴起让客户无需前往当地分行即可轻松办理银行业务。这些举措不仅提升了用户体验,也迫使银行向数字化世界迈进。 金融服务公司需要在数字营销渠道上保持稳固的地位,以免落后于大型机构。…

字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析

在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它&#…

磁盘分区工具 -- 傲梅分区助手 v10.4.1 技术员版

软件简介 傲梅分区助手是一款功能强大的磁盘分区工具,它专为Windows系统设计,帮助用户更高效地管理他们的硬盘。该软件支持多种分区操作,包括创建、格式化、调整大小、移动、合并和分割分区。此外,它还提供了复制硬盘和分区的功能…

【手机取证】如何使用360加固助手给apk加固

文章关键词:手机取证、电子数据取证、数据恢复 一、前言 APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换,包括不限于隐藏,混淆,加密等操作,进一步保护软件的利益不受损坏,下面给…

TK养号工具开发会用上的源代码科普!

在当今数字化时代,社交媒体平台的崛起使得网络账号的维护与管理变得日益重要,其中,TK作为一款备受欢迎的社交媒体平台,吸引了大量用户。 在TK上进行账号养护,即通过各种方式提升账号权重、增加曝光量,已成…

光伏仿真系统不可忽视的功能:建模与仿真!

光伏仿真系统具备多种功能,能够支持对光伏发电系统进行深入研究和优化。为什么说建模与仿真功能是最不可忽视的呢?我们先来看看建模功能。 光伏仿真系统可以通过光伏插件或扩展程序,创建精确的光伏组件模型,包括光伏板、支架、逆变…

MyBatis入门程序详解

目录 一、MyBatis概述 二、编写MyBatis入门程序 三、配置SQL提示 四、传统jdbc的劣势 一、MyBatis概述 MyBatis是一个基于Java的持久层框架,它内部封装了JDBC操作,使得开发人员可以更专注于SQL语句本身而非繁琐的JDBC操作细节。在MyBatis中&#xff0…

软件测试面试1000问(含答案)

1、自动化代码中,用到了哪些设计模式? 单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化…

AI工具集盘点!2024年必备的AI软件都在这,一文全部拿下!

AI工具哪款好,有哪些值得推荐? 不可否认,当下各式各样的AI工具层出不穷,面对不断涌现的AI工具,各位在选用时是否无从下手,或是抽不出时间,逐一体验对比不同AI工具的差异…… 这也是现如今许多…