基于高斯过程的贝叶斯优化

news2024/11/19 3:17:43

基于Bayes_opt实现GP优化

bayes-optimization是最早开源的贝叶斯优化库之一,也是为数不多至今依然保留着高斯过程优化的优化库。由于开源较早、代码简单,bayes-opt常常出现在论文、竞赛kernels或网络学习材料当中,因此理解Bayes_opt的代码是极其重要的课题。不过,bayes-opt对参数空间的处理方式较为原始,也缺乏相应的提效/监控功能,对算力的要求较高,因此它往往不是我们进行优化时的第一首选库。通常来说,当且仅当我们必须要实现基于高斯过程的贝叶斯优化,且算法的参数空间中带有大量连续型参数时,我们才会优先考虑Bayes_opt库。

pip install bayesian-optimization #安装Bayes_opt库
pip install hyperopt #安装Hyperopt库
import numpy as np
import pandas as pd
import time

#算法/损失/评估指标等
import sklearn
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.model_selection import KFold, cross_validate

#优化器
from bayes_opt import BayesianOptimization

import hyperopt
from hyperopt import hp, fmin, tpe, Trials, partial

生成数据集

import numpy as np
from sklearn.datasets import make_regression

# Generate a regression dataset
X, y = make_regression(n_samples=1000, n_features=10, random_state=1412)

1 定义目标函数

目标函数的值即𝑓(𝑥)的值。贝叶斯优化会计算𝑓(𝑥)在不同𝑥上的观测值,因此𝑓(𝑥)的计算方式需要被明确。在HPO过程中,我们希望能够筛选出令模型泛化能力最大的参数组合,因此𝑓(𝑥)应该是损失函数的交叉验证值或者某种评估指标的交叉验证值。

Notes:

  1. 在定义目标函数时,我们需要确保超参数作为输入,而不是整个超参数空间或其他元素,例如数据或算法超参数。因此,目标函数的输入必须是具体的超参数值。

  2. 当需要对算法的实际参数进行调整时,需要注意超参数的输入值只能是浮点数,不支持整数或字符串。如果算法参数需要是字符串,则无法使用bayes_opt进行调整;如果参数需要是整数,则需要在目标函数中规定参数的类型。

  3. bayes_opt只能寻找𝑓(𝑥)的最大值,而不能寻找最小值。因此,当目标函数代表某种损失时,输出需要取负值。例如,如果使用RMSE作为目标函数,则应该让目标函数输出负的RMSE,以便最大化负的RMSE,从而实现最小化真正的RMSE。对于准确率、AUC等指标作为目标函数的情况,则可以保持输出值不变。

def bayesopt_objective(n_estimators,max_depth,max_features,min_impurity_decrease):
    
    #定义评估器
    #需要调整的超参数等于目标函数的输入,不需要调整的超参数则直接等于固定值
    #默认参数输入一定是浮点数,因此需要套上int函数处理成整数
    reg = RFR(n_estimators = int(n_estimators)
              ,max_depth = int(max_depth)
              ,max_features = int(max_features)
              ,min_impurity_decrease = min_impurity_decrease
              ,random_state=1412
              ,verbose=False #可自行决定是否开启森林建树的verbose
              ,n_jobs=-1)
    
    #定义损失的输出,5折交叉验证下的结果,输出负根均方误差(-RMSE)
    #注意,交叉验证需要使用数据,但我们不能让数据X,y成为目标函数的输入
    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv
                                     ,verbose=False
                                     ,n_jobs=-1
                                     ,error_score='raise'
                                     #如果交叉验证中的算法执行报错,则告诉我们错误的理由
                                    )
    
    #交叉验证输出的评估指标是负根均方误差,因此本来就是负的损失
    #目标函数可直接输出该损失的均值
    return np.mean(validation_loss["test_score"])

2 定义参数空间

在bayes_opt中,我们使用字典方式来定义参数空间,其中参数的名称为键,参数的取值范围为值。且任意参数的取值范围为双向闭区间,以下方的空间为例,在n_estimators的取值中,80与100都可以被取到。

Notes:

  1. bayes_opt只支持填写参数空间的上界与下界,不支持填写步长等参数;
  2. bayes_opt会将所有参数都当作连续型超参进行处理,因此bayes_opt会直接取出闭区间中任意浮点数作为备选参数。例如,取92.28作为n_estimators的值;
  3. 输入bayes_opt的参数空间天生会比其他贝叶斯优化库更大/更密,因此需要的迭代次数也更多
param_grid_simple = {'n_estimators': (80,100)
                     , 'max_depth':(10,25)
                     , "max_features": (10,20)
                     , "min_impurity_decrease":(0,1)
                    }

3 定义优化目标函数的具体流程

  1. 一旦我们确定了目标函数和参数空间,就可以按照bayes_opt的规则进行优化了。在任何贝叶斯优化算法的实践过程中,都会涉及到一定程度的随机性,比如随机抽取点作为观测点,随机抽样部分观测点进行采集函数的计算等。在大多数优化库中,这种随机性是无法被控制的,即使允许我们填写随机数种子,优化算法也无法被固定下来。因此,尽管我们可以尝试填写随机数种子,但需要记住每次运行优化算法时都会产生不同的结果。

  2. 尽管优化算法无法被精确复现,但是得出的最佳超参数结果却是可以被复现的。一旦优化完成,可以从优化算法的实例化对象中获取最佳参数组合和最佳分数,然后将最佳参数组合输入到交叉验证中,这样一定可以复现其最佳分数。如果未能复现最佳分数,那么可能是由于交叉验证过程中的随机数种子设置存在问题,或者优化算法的迭代流程存在问题。

def param_bayes_opt(init_points,n_iter):
    
    #定义优化器,先实例化优化器
    opt = BayesianOptimization(bayesopt_objective #需要优化的目标函数
                               ,param_grid_simple #备选参数空间
                               ,random_state=1412 #随机数种子,虽然无法控制住
                              )
    
    #使用优化器,记住bayes_opt只支持最大化
    opt.maximize(init_points = init_points #抽取多少个初始观测值
                 , n_iter=n_iter #一共观测/迭代多少次
                )
    
    #优化完成,取出最佳参数与最佳分数
    params_best = opt.max["params"]
    score_best = opt.max["target"]
    
    #打印最佳参数与最佳分数
    print("\n","\n","best params: ", params_best,
          "\n","\n","best cvscore: ", score_best)
    
    #返回最佳参数与最佳分数
    return params_best, score_best

5 执行实际优化流程

在这里插入图片描述

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

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

相关文章

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…

重磅发布!基于百度飞桨的《人工智能基础及应用》书籍正式上线

科技日新月异的今天,人工智能已经成为引领未来的核心驱动力。为了帮助大家更好地深入理解人工智能的理论和技术,为未来发展做好准备,百度飞桨教材编写组联合北京交通大学王方石教授、北京邮电大学杨煜清特聘副研究员共同撰写推出了《人工智能…

大语言模型漏洞缓解指南

虽然大语言模型(LLM)应用正在全球快速普及,但企业对大语言模型的威胁态势仍然缺乏全面了解。面对大语言模型风险的不确定性,企业希望在保障其安全性的基础上加快应用脚步,用人工智能提升企业核心竞争力,这意味着企业的CISO面临着理…

用 Python 制作可视化 GUI 界面,一键实现证件照背景颜色的替换

今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用。关于界面的大致模样其实和先前的相差不大,大家应该都看过上一篇的内容 界面大体的样子…

C#MQTT编程08--MQTT服务器和客户端(cmd版)

1、前言 前面完成了winform版,wpf版,为什么要搞个cmd版,因为前面介绍了mqtt的报文结构,重点分析了【连接报文】,【订阅报文】,【发布报文】,这节就要就看看实际报文是怎么组装的,这…

问题解决:No module named ‘apex‘,apex安装

最近Git了一个别人的程序,跑的过程中遇到了报错: No module named apex 关于Apex,官方介绍是:该资源库包含英伟达维护的实用程序,用于简化 Pytorch 中的混合精度和分布式训练。这里的部分代码最终将被纳入 Pytorch …

WINCC读写EXCEL-VBS

原创 RENHQ WINCC 关于VBS操作EXCEL的文档不管在论坛上还是在网上,相关的脚本已经很多,但是依然有很多人在问这个问题,于是把我以前在论坛上发的一个集合帖子的脚本拿来,重新开个帖子,如果再有人问的话,可…

Debezium发布历史107

原文地址: https://debezium.io/blog/2021/08/02/debezium-1-7-alpha1-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 1.7.0.Alpha1 Released August 2, 2021 by Jiri Pechanec …

使用xbindkeys设置鼠标侧键

1.安装如下包 sudo apt install xbindkeys xautomation 2.生成配置文件 xbindkeys --defaults > $HOME/.xbindkeysrc 3.确定侧键键号 在终端执行下面的代码: xev | grep button 此时会出现如下窗口,将鼠标指针移动到这个窗口上: 单…

三大3D引擎对比,直观感受AMRT3D渲染能力

作为当前热门的内容呈现形式,3D已经成为了广大开发者、设计师工作里不可或缺的一部分。 用户对于3D的热衷,源于其带来的【沉浸式体验】和【超仿真视觉效果】。借此我们从用户重点关注的四个3D视觉呈现内容: 材质- 呈现多元化内容水效果- 展…

k8s的对外服务ingress

1、service的作用体现在两个方面 (1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制 (2)集群外部:类似于负载均衡器&#xff…

经典目标检测YOLO系列(二)YOLOV2的复现(2)正样本的匹配、损失函数的实现及模型训练

经典目标检测YOLO系列(二)YOLOV2的复现(2)正样本的匹配、损失函数的实现及模型训练 我们在之前实现YOLOv1的基础上,加入了先验框机制,快速的实现了YOLOv2的网络架构,并且实现了前向推理过程。 经典目标检测YOLO系列(二)YOLOV2的复现(1)总体…

C#开源跨平台的多功能Steam工具箱GitHub加速神器

前言 作为一名程序员你是否会经常会遇到GitHub无法访问(如下无法访问图片),或者是访问和下载源码时十分缓慢就像乌龟爬行一般。今天分享一款C#开源的、跨平台的多功能Steam工具箱和GitHub加速神器:Watt Toolkit。 项目功能 网络加速、账号切换、库存游…

C++的命名空间域

一、域作用限定符 :: 即是域作用限定符,它的作用是指明一个标识符(变量、函数或类)来自哪一个作用域范围 二、编译器搜索变量、函数等的原则 1.先搜索局部变量,2.再搜索全局变量,3.最后搜索指定的命名空间域 三、…

uni-app小程序 uni.showToast字数超过两行自动省略显示不全问题

在实际开发过程中如果用户提交某些文件时,如果缺少某些条件我们要提醒用户缺少那些条件才能提交,但是如果我们用uni.showToast提醒的次数超过7个字的时候就会导致文字显示不全,达不到提醒的效果,这种时候我们就需要使用uni.showMo…

C++后端笔记

C后端笔记 资源整理一、高级语言程序设计1.1 进制1.2 程序结构基本知识1.3 数据类型ASCII码命名规则变量间的赋值浮点型变量的作用字符变量常变量 const运算符 二、高级语言程序设计(荣) 资源整理 C后端开发学习路线及推荐学习时间 C基础知识大全 C那…

聚类模型评估指标

聚类模型评估指标-轮廓系数 计算样本i到同簇其它样本到平均距离ai,ai越小,说明样本i越应该被聚类到该簇(将ai称为样本i到簇内不相似度);计算样本i到其它某簇Cj的所有样本的平均距离bij,称为样本i与簇Cj的…

SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functi…

docker:Java通过nginx获取客户端的真实ip地址

问题现象 我们的平台使用Spring Cloud微服务架构,使用Spring Boot构建Java服务,使用google的jib插件打成docker镜像包我们使用docker虚拟化部署,使用docker-compose统一管理所有服务,包括Java服务和nginx等组件我们前后端分离&am…

【JVM】并发的可达性分析详细解释

​ 🍎个人博客:个人主页 🏆个人专栏:JVM ⛳️ 功不唐捐,玉汝于成 ​ 目录 前言 正文 可达性分析的基本原理: 根集合(Root Set): 对象引用关系: 标记…