使用 Python 进行贝叶斯优化

 

一、介绍

        贝叶斯优化是一种先进的技术,用于优化评估成本高昂的函数。该策略为全局优化提供了原则性策略,强调探索(尝试新领域)和开发(尝试看起来有前途的领域)之间的平衡。

二、什么是贝叶斯优化?

贝叶斯优化的核心是一种基于概率模型的优化技术。它利用过去的评估结果形成概率模型,预测最佳解决方案可能位于何处。这里的关键是探索未知领域(我们尚未评估的功能领域)和开发已知区域(我们已经评估过并且看起来有前途的领域)之间的平衡。

简而言之,贝叶斯优化将我们过去的知识(评估)与不确定性(我们尚未评估的地方)结合起来,以对最佳解决方案可能位于何处做出有根据的猜测。

三、贝叶斯优化的组成部分

  1. 目标函数:这是我们要优化的函数。在许多现实问题中,评估目标函数可能需要大量计算、耗时或资源密集型。对于我们的示例,我们的目标函数是使用给定的超参数训练模型并返回其性能。
  2. 概率模型:贝叶斯优化使用概率模型来估计函数。通常使用高斯过程 (GP),因为它们不仅提供每个点的平均预测,而且还量化该预测的不确定性(方差)。
  3. 采集功能:该功能指导优化过程。它使用 GP 提供的均值和方差来建议目标函数中要评估的下一个点。常见的获取函数包括预期改进 (EI)、改进概率 (PI) 和置信上限 (UCB)。对于我们的示例,我们使用了预期改进函数。
  4. 贝叶斯优化循环:这是一个迭代过程,其中模型使用目标函数中的新数据点进行更新,并且采集函数建议下一个要评估的点。

四、Python 分步指南

        在本指南中,我们将使用 UCI 机器学习存储库中的葡萄酒质量数据集。

1. 下载数据集

  • 数据集:葡萄酒品质数据集
  • 直接下载链接:葡萄酒质量数据

下载数据集并将其保存到本地计算机。

2. 搭建环境

import numpy as np
import pandas as pd
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
from scipy.optimize import minimize
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

3. 加载数据集

data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv', sep=';')
X = data.drop('quality', axis=1)
y = data['quality']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

4. 贝叶斯优化

我们将尝试使用贝叶斯优化来优化简单回归器的超参数。

首先,我们将定义目标函数,它将使用给定的超参数训练模型并返回负均方误差(因为我们希望最大化质量预测精度)。

def objective_function(params):kernel = C(params[0], (1e-3, 1e3)) * RBF(params[1], (1e-2, 1e2))gp = GaussianProcessRegressor(kernel=kernel)gp.fit(X_train, y_train)predictions = gp.predict(X_test)return -mean_squared_error(y_test, predictions)

def objective_function(params):

        这定义了一个名为 的函数objective_function,它采用单个参数params,该参数应该是包含参数的列表或类似数组的对象。

  kernel = C(params[0], (1e-3, 1e3)) * RBF(params[1], (1e-2, 1e2))

        这里,正在构建高斯过程内核。该内核是两个组件的组合:

  1. 常数核 ( C):该核表示常数值,通常在高斯过程中用于定义常数缩放因子。它使用一个值进行初始化params[0],范围在 1×10−31×10−3 和 1×1031×103 之间。
  2. 径向基函数核 ( RBF):这是高斯过程中最常用的核之一。它决定了函数的形状或平滑度。它使用一个值进行初始化params[1],范围在 1×10−21×10−2 和 1×1021×102 之间。

        最终的内核是这两个内核的乘积,这是高斯过程中结合多个内核的效果的常见做法。

  gp = GaussianProcessRegressor(kernel=kernel)

        在这里,来自 scikit-learn 库的高斯过程回归器模型正在使用先前定义的内核进行初始化。

  gp.fit(X_train, y_train)

        高斯过程回归器模型正在训练数据X_train和上进行训练y_train

        predictions = gp.predict(X_test)

模型经过训练后,将用于对测试数据进行预测X_test。结果存储在变量中predictions

        return -mean_squared_error(y_test, predictions)

  y_test该函数最终返回真实测试值和预测值之间的负均方误差predictions。返回负值的原因是贝叶斯优化通常设置为最大化目标函数。通过返回负均方误差,优化过程将尝试找到给出最小误差(或最大负误差)的参数。

        本质上,这objective_function是为了评估具有给定内核配置的高斯过程回归器的性能(均方误差)。目标是找到最小化该误差的内核参数,并且该函数将用作贝叶斯优化过程的目标。

        现在,我们将定义获取函数:

def acquisition_function(x):# Expected Improvement acquisition functionmu, sigma = gp.predict(x, return_std=True)return -(mu + 1.96 * sigma)

def acquisition_function(x):

这定义了一个名为 的函数acquisition_function,它采用单个参数x,它代表我们要评估采集函数的数据点(或点集)。

mu, sigma = gp.predict(x, return_std=True)

此处,高斯过程模型gp用于预测给定数据点 的平均值 ( mu) 和标准差 ( ) 。该参数确保该方法返回预测的标准差,该标准差量化了模型对该预测的不确定性。sigmaxreturn_std=True

在贝叶斯优化的背景下:

  • mu表示模型对 点 处目标函数值的最佳猜测x
  • sigma代表模型对该猜测的不确定性。越大sigma表示不确定性越高。

return -(mu + 1.96 * sigma)

mu该行返回和 1.96×1.96× σ之和的负数。

术语 1.96×1.96× σ本质上捕获高斯分布 95% 置信区间的上限。值 1.96 是 z 分数,对应于标准正态分布的第 97.5 个百分位(假设它是对称的)。

在获取函数的上下文中,这行代码可以解释如下:

  1. 探索与利用:获取函数在探索(高不确定性区域)和利用(低预测目标函数值区域)之间取得平衡。通过考虑mu(预测值)和sigma(不确定性),获取函数旨在探索有希望(低mu)或不确定(高sigma)的领域。
  2. 最大化框架:负号确保我们为最大化问题做好准备。预测值较低(负mu)或不确定性较高(正 1.96×1.96× σ)的区域将具有较高(负值较小)的采集函数值,使它们在贝叶斯优化的下一次迭代中更有吸引力。
  3. 95% 置信区间:因子 1.96 表明该函数将目标函数的值考虑到其 95% 置信区间的上限。这意味着采集函数在其探索中考虑“最坏情况”场景,查看目标函数的真实值可能高达 的点mu + 1.96 * sigma

本质上,acquisition_function量化了在 点评估目标函数的潜在收益x。它在模型不确定的探索点和模型预测低目标函数值的利用点之间取得平衡(假设我们正在处理最小化问题,如负号所示)。

最后,运行贝叶斯优化循环:

best_params = [1, 1]  # initial guess
for iteration in range(10):  # 10 iterations for demonstration purposesres = minimize(fun=objective_function, x0=best_params, bounds=[(1e-3, 1e3), (1e-2, 1e2)])best_params = res.x

best_params = [1, 1] # initial guess

此行初始化一个以两个值命名的列表best_params,均设置为 1。此列表表示我们要优化的参数的初始猜测。在前面讨论的上下文中,这些参数可能与高斯过程的内核相关,但它们通常可以是我们想要优化的任何参数。

for iteration in range(10): # 10 iterations for demonstration purposes

该行启动一个将运行 10 次的 for 循环。该循环的每次迭代都代表着寻找更好的参数集的优化尝试。

res = minimize(fun=objective_function, x0=best_params, bounds=[(1e-3, 1e3), (1e-2, 1e2)])

在这里,minimize函数(通常来自像 之类的库scipy.optimize)用于尝试找到最小化给定 的参数objective_function

  • fun=objective_function:这表明我们试图最小化的函数是objective_function
  • x0=best_params:这将优化的起点设置为我们当前对参数的最佳猜测。在第一次迭代中,这将是 [1, 1],但在后续迭代中,它将是上一次迭代中找到的最佳参数。
  • bounds=[(1e-3, 1e3), (1e-2, 1e2)]:这对参数可以采用的值设置限制。第一个参数被限制在 1×10−31×10−3 和 1×1031×103 之间,第二个参数被限制在 1×10−21×10−2 和 1×1021×102 之间。
  • 在这些迭代结束时,best_params应该包含葡萄酒质量数据集上高斯过程模型的优化超参数。

五、使用优化参数

一旦我们通过贝叶斯优化找到了优化参数,我们现在就可以将它们用于未来的预测。以下是如何加载具有优化超参数的模型并进行预测:

# Load the model with optimized parameters
optimized_kernel = C(best_params[0], (1e-3, 1e3)) * RBF(best_params[1], (1e-2, 1e2))
optimized_gp = GaussianProcessRegressor(kernel=optimized_kernel)
optimized_gp.fit(X_train, y_train)# Making predictions
predictions = optimized_gp.predict(X_test)

结论

贝叶斯优化提供了一种结构化且有效的方法,通过从过去的评估中学习来找到问题的最佳解决方案。通过平衡探索和利用,它确保搜索既广泛(涵盖各种可能性)又深入(扩大到有希望的领域)。借助 Python 强大的库,该技术的实现变得简单直观。

参考

  • UCI 机器学习存储库:葡萄酒质量数据集
  • Scikit-learn 的高斯过程
  • 贝叶斯优化入门

六、附录

对于那些寻求更简化方法的人来说,该bayesian-optimization库提供了一种运行贝叶斯优化的简单方法,而无需涉及复杂的高斯过程或采集函数。

1. 安装

首先,使用 pip 安装库:

!pip install bayesian-optimization

2. 搭建环境

from bayes_opt import BayesianOptimization
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C

3. 加载数据集

data = pd.read_csv('winequality-red.csv', sep=';')
X = data.drop('quality', axis=1)
y = data['quality']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

4. 目标函数

该库需要参数的范围作为输入。它将在这些范围内自动探索和利用。

def objective_function(C, RBF_length_scale):kernel = C * RBF(RBF_length_scale)gp = GaussianProcessRegressor(kernel=kernel)gp.fit(X_train, y_train)predictions = gp.predict(X_test)return -mean_squared_error(y_test, predictions)

5. 运行贝叶斯优化

# Defining bounds for the hyperparameters
pbounds = {'C': (1e-3, 1e3),'RBF_length_scale': (1e-2, 1e2)
}optimizer = BayesianOptimization(f=objective_function,pbounds=pbounds,random_state=42
)optimizer.maximize(init_points=2,  # Random exploratory stepsn_iter=10       # Steps of Bayesian Optimization
)

.maximize函数将运行优化,完成后,可以使用以下方法检索最佳参数:

best_params = optimizer.max['params']

6. 使用优化参数

# Load the model with optimized parameters
optimized_kernel = C(best_params['C']) * RBF(best_params['RBF_length_scale'])
optimized_gp = GaussianProcessRegressor(kernel=optimized_kernel)
optimized_gp.fit(X_train, y_train)# Making predictions
predictions = optimized_gp.predict(X_test)

七、结论

        该bayesian-optimization库提供了一种快速有效的方法来执行贝叶斯优化,而无需深入研究其复杂的数学知识。通过抽象复杂性,它使优化过程更易于访问和用户友好。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日Sound 声学论文速览 第三十七期】Tue, 31 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 31 Oct 2023 Totally 11 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers DCHT: Deep Complex Hybrid Transformer for Speech Enhancement Authors Jialu Li, Junhui Li, Pu Wang, Youshan Zhang当前大多数基于深…

云卷云舒:【实战篇】Redis迁移

1. 简介 Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统,是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 2. 迁移原理 redis-sh…

【管理篇 / 恢复】❀ 08. 文件权限对macOS下用命令刷新固件的影响 ❀ FortiGate 防火墙

【简介】虽然上篇文章中成功的在macOS下刷新了固件,但是很多小伙伴在实际操作中碰到了无法成功的状况,我们来看看最常见的一种。 在/private/tftpboot目录拷贝另一个版本的固件文件,具体拷贝过程不再详述。 打开终端,输入命令 sud…

JVM加载class文件的原理机制

1、JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从“Hello World ”开始的,然后会写个复杂点class ,然后再找一些开源框架,比如Spring ,Hibernate 等等,再然后就开发…

Unity添加所有场景到BuildSettings

Unity添加所有场景到BuildSettings using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.IO; public class Tools : Editor {[MenuItem("Tools/添加所有场景到BuildSettings")]static void CheckSceneSetting(){List<string&…

C语言编译器(C语言编程软件)完全攻略(第三十部分:Xcode简明教程(使用Xcode编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 三十、Xcode简明教程&#xff08;使用Xcode编写C语言程序&#xff09; 在 Mac OS X 下学习C语言使用 Xcode。Xcode 是由Apple官方开发的IDE&#xff0c;支持C、C、Objective-C、Swift等&#xff0c;可以用来开发 Mac OS X 和 iOS 上…

Idea连接Docker在本地(Windows)开发SpringBoot

文章目录 1. 新建运行配置2. 修改运行目标3. 设置新目标Docker4. 选择运行主类5. 运行 当一些需要的服务在docker容器中运行时&#xff0c;因为docker网络等种种原因&#xff0c;不得不把在idea开发的springboot项目放到docker容器中才能做测试或者运行。 1. 新建运行配置 2. …

CSS 实现两个圆圈重叠部分颜色不同

这是期望实现的效果&#xff0c;由图可知&#xff0c;圆圈底图透明度是0.4&#xff0c;左侧要求重叠部分透明度是0.7&#xff0c;所以不能通过简单的透明度叠加来实现最右侧的效果。 这就需要另外新建一个图层来叠加在两个圆圈重叠上方。 直接看代码 .circle_hight {width: 1…

【数据库原理】(10)数据定义功能

SQL 数据定义功能包括定义模式、定义表、定义索引和定义视图,其语句如表所示。 一.创建、删除模式 1.创建模式 (Create Schema) 用途&#xff1a;创建模式是为了在数据库中定义一个新的命名空间&#xff0c;它可以包含多个数据库对象。 语法&#xff1a; CREATE SCHEMA &…

leetcode:908. 最小差值 I

一、题目 二、函数原型 int smallestRangeI(int* nums, int numsSize, int k) 三、思路 本题题目有些绕口&#xff0c;但是无伤大雅。本质就是可以对数组中的每个元素进行加/减 k 的操作&#xff0c;然后求数组中的最大、最小元素的最小差值。 分为几种情况&#xff1a; …

SwiftUI之深入解析如何使用accessibilityChartDescriptor视图修饰符为视图构建音频图表

一、DataPoint 结构体 在 SwiftUI 中构建一个简单的条形图视图开始&#xff0c;该视图使用垂直条形显示一组数据点。如下所示&#xff0c;有一个 DataPoint 结构&#xff0c;用于描述条形图视图中的条形&#xff0c;它具有 id、标签、数值和填充颜色&#xff1a; struct Data…

Notepad++ v7.7.1 安装及添加插件

1、notepad_v7.7.1.zip npp.7.7.1.Installer.x64.exe npp.7.7.1.Installer.x86.exe notepad_v7.7.1.ziphttps://www.123pan.com/s/VTMXjv-X6H6v.html 2、notepad插件包_64bit_4.zip ComparePlugin ---->文件对比插件 ComparePlugin.dllNppFTP ---->FTP、FTPES和SFTP …