贝叶斯优化python包_贝叶斯优化

2023-11-13

万壑松风知客来,摇扇抚琴待留声

1. 文起

本篇文章记录通过 Python 调用第三方库,从而调用使用了贝叶斯优化原理的 Hyperopt 方法来进行超参数的优化选择。具体贝叶斯优化原理与相关介绍将在下一次文章中做较为详细的描述,可以参考这里。

Hyperopt 是 Python 的几个贝叶斯优化库中的一个。它使用 Tree Parzen Estimator(TPE),其它 Python 库还包括了 Spearmint(高斯过程代理)和 SMAC(随机森林回归)。贝叶斯优化问题有四个部分:目标函数:使用的机器学习模型调用该组超参数在验证集上的损失。

域空间:类似于网格搜索,传入超参数的搜索范围。

参数搜索:构造替代函数并选择下一个超参数值进行评估的方法。

存储结果:最小化函数在评估每组测试后的最优超参数存储结果。

2. Hyperopt 简单样例说明:最简单的流程,实现以 XGBoost 作为调参模型,通过 hyperopt 完成上述贝叶斯优化的四个部分。

一:定义目标函数1

2

3

4

5

6

7

8

9

10train_X, test_X, train_y, test_y = train_test_split(df_scaler, df_y, test_size=0.3, random_state=999)

data_train =xgb.DMatrix(train_X, train_y, silent=False)

# 定义目标函数

def (params, n_folds=10):

cv_results =xgb.cv(params, data_train, num_boost_round=1000, nfold=n_folds, stratified=False, shuffle=True, metrics='mae', early_stopping_rounds=10)

mae = max(cv_results['test-mae-mean'])

loss = mae

return loss

objective() 是目标函数(黑盒函数),作用是返回一个损失值,Hyperopt 也是根据这个损失值来逐步选择超参数的。后续的 fmin() 函数会最小化这个损失,所以你可以根据是最大化还是最小化问题来改变这个返回值。此处的目标函数十分基础并没有做过多的调整,可根据实际情况来做修改目标函数。

二:设置域空间1

2

3

4

5

6

7

8

9from hyperopt import hp

space = {

'learning_rate': hp.loguniform('learning_rate',np.log(0.01),np.log(0.4)),

'max_depth': hp.choice('max_depth',range(1,8,1)),

'min_child_weight': hp.choice('min_child_weight',range(1,5,1)),

'reg_alpha': hp.uniform('reg_alpha',0.0,1.0),

'subsample': hp.uniform('subsample',0.5,1.0),

'colsample_bytree': hp.uniform('colsample_bytree',0.6,1.0)

}

域空间,也就是给定超参数搜索的范围。这个可以通过 hyperopt 的 hp 方法实现,hp 方法有很多个参数选择的方式如:hp.loguniform(对数空间搜索)、hp.lognormal(对数正态分布)、hp.normal(正态分布)、hp.choice(列表选项搜索)、hp.uniform(连续均匀分布搜索)、hp.quniform(连续均匀分布整数搜索)。

这里也只是简单的设置域空间,比如还可以通过 choice 方法构建列表从而实现对多个不同模型的筛选,这个在后续会有介绍。强调:如果使用参数名相同会报错 “hyperopt.exceptions.DuplicateLabel”,例如域空间中定义了 XGBoost、LightGBM 两种模型,由于它们的部分参数名相同所以如果使用同名参数将报错。解决方法:可以修改内层名称,这个在后续代码中会说明。

三:参数搜索1

2

3

4

5

6

7

8# 参数搜索算法

from hyperopt import tpe

tpe_algorithm = tpe.suggest

# 寻找目标函数的最小值

from hyperopt import fmin

MAX_EVALS = 500

best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=MAX_EVALS)

Hyperopt 中可以使用几种搜索算法:tpe(tpe.suggest)、随机 rand(rand.suggest)、模拟退火 anneal(anneal.suggest)。同时定义用来寻找目标函数返回最小损失值的 fmin() 函数,其中 max_evals 参数表示迭代次数。

四:存储结果1

2# 优化结果参数

print(best)

best 就是 Hyperopt 返回最佳结果的参数。

3. Hyperopt 可以变复杂

上面使用几处简单的代码,实现了 Python 中调用 Hyperopt 来完成超参数选择的功能。任何方法都可以变得复杂,更何况 Hyperopt ,所以在上面代码的基础上稍加改变,实现一种稍微复杂点的 Hyperopt,从而完成较为强大的功能。说明:以下代码将实现,从 SVM、XGBoost、LightGBM、KNN、Linear 等多个不同模型中选择超参数,最终找到 Hyperopt 认为的最优参数。其中损失值为偏离度,并可以查看黑盒函数中的运行过程。

一:定义目标函数1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66import pandas as pd

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

from sklearn.model_selection import cross_val_score

from sklearn.metrics import mean_absolute_error

from sklearn.svm import SVR

import xgboost as xgb

import lightgbm as lgb

from sklearn.neighbors import KNeighborsRegressor

from sklearn.linear_model import LinearRegression

from hyperopt import STATUS_OK

import warnings

warnings.filterwarnings('ignore')

df = pd.read_csv('data.csv')

features = df.iloc[:,:-1]

target = df.iloc[:,-1]

scaler = StandardScaler()

features = scaler.fit_transform(features)

train_X, test_X, train_y, test_y = train_test_split(features, target, test_size=0.25, random_state=999)

# 计算偏离度

def dod(real_values, pred_values):

dod_result = np.around((np.absolute(real_values - pred_values) / real_values).mean(), 4)

return dod_result

# 计算传入模型的损失

def (params):

model_name = params['model_name']

del params['model_name']

if model_name == 'svm':

clf = SVR(**params)

elif model_name == 'xgboost':

clf = xgb.XGBRegressor(**params)

elif model_name == 'lightgbm':

clf = lgb.LGBMRegressor(**params)

elif model_name == 'knn':

clf = KNeighborsRegressor(**params)

elif model_name == 'linear':

clf = LinearRegression(**params)

else:

return 0

clf.fit(train_X, train_y)

pred = clf.predict(test_X)

loss = dod(test_y, pred)

# 偏离度是自己定义的方法,当然可以返回交叉验证的结果(loss是负值需要注意)

# loss = cross_val_score(clf, train_X, train_y, cv=10, scoring='neg_mean_absolute_error').mean()

return {'loss':loss, 'params':params, 'status':STATUS_OK}

# 定义总的目标函数

count = 0

best_score = np.inf

model_name = None

def fn(params):

global model_name, best_score, count

count +=1

score = objective(params.copy())

loss = score['loss']

if loss < best_score:

best_score = loss

model_name = params['model_name']

if count % 50 == 0:

print('iters:{0}, score:{1}'.format(count, score))

return loss

二:设置域空间说明:两个树模型有相同的参数名,所以在设置参数时需要区别参数名。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42from hyperopt import hp

# 设置域空间

space = hp.choice('regressor_type',[

{

'model_name': 'svm',

'C': hp.uniform('C',0, 10.0),

'kernel': hp.choice('kernel', ['linear', 'rbf']),

'gamma': hp.uniform('gamma', 0, 20.0)

},

{

'model_name': 'xgboost',

'n_estimators': hp.choice('xgb_n_estimators', range(50,501,2)),

'learning_rate': hp.uniform('xgb_learning_rate', 0.01, 0.3),

'max_depth': hp.choice('xgb_max_depth', range(2,8,1)),

'min_child_weight': hp.choice('xgb_min_child_weight', range(1,5,1)),

'reg_alpha': hp.uniform('xgb_reg_alpha', 0, 1.0),

'subsample': hp.uniform('xgb_subsample', 0.5, 1.0),

'colsample_bytree': hp.uniform('xgb_colsample_bytree', 0.6, 1.0)

},

{

'model_name': 'lightgbm',

'n_estimators': hp.choice('lgb_n_estimators', range(50,501,2)),

'learning_rate': hp.uniform('lgb_learning_rate', 0.01, 0.3),

'max_depth': hp.choice('lgb_max_depth', range(2,8,1)),

'num_leaves': hp.choice('lgb_num_leaves', range(20, 50, 1)),

'min_child_weight': hp.choice('lgb_min_child_weight', [0.001,0.005,0.01,0.05,0.1]),

'min_child_samples': hp.choice('lgb_min_child_samples', range(5,51,5)),

'subsample': hp.uniform('lgb_subsample', 0.5, 1.0),

'colsample_bytree': hp.uniform('lgb_colsample_bytree', 0.6, 1.0),

'reg_alpha': hp.uniform('lgb_reg_alpha', 0, 1.0)

},

{

'model_name': 'knn',

'n_neighbors': hp.choice('n_neighbors', range(2,11)),

'algorithm': hp.choice('algorithm', ['auto','ball_tree','kd_tree','brute'])

},

{

'model_name': 'linear',

'normalize': hp.choice('normalize', [False, True])

}

])

三:参数搜索1

2

3

4

5

6

7

8

9

10

11

12# 设定搜索算法

from hyperopt import tpe

# 如果有有必要,可以设置查看黑盒函数fn中的搜索情况(每次选择参数等)

from hyperopt import Trials

trials = Trials()

# 定义搜索目标函数最小值函数

from hyperopt import fmin

MAX_EVALS = 1500

best_params = fmin(fn=fn, space=space, algo=tpe.suggest, max_evals=MAX_EVALS,trials=trials)

print('model_name: {0}, best_score: {1}'.format(model_name, best_score))

四:存储结果1

2

3

4

5# 最佳参数

print(best_params)

# 查看黑盒函数中的变化

print(trials)# 可以通过循环依次打印结果

4. 文末

Hyperopt 通过不同的设置可以变得更加完善和准确,从而在搜索参数上取得进一步成功。

你需要注意一点,Hyperopt 并不是一个完全没有缺陷的方法,它也可能从一开始就陷入局部最优,所以相比于暴力的网格搜索它只是一种具有数学理论支撑的高级暴力搜索方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贝叶斯优化python包_贝叶斯优化 的相关文章

  • ROS导航小车3 odom里程计标定(仅作个人记录)

    检测机器人是否需要标定参考链接 1 打开一个新的terminal 运行rviz rviz窗口打开后 将fixed frame选择为odom 关闭其他所有勾选 只保留grid和tf 如没有grid 左下角add新增 打开tf 下拉出来fram
  • 遗传算法解TSP问题(java实现)

    遗传算法解TSP问题 java实现 TSP问题简介 旅行商问题 最短路径问题 英语 travelling salesman problem TSP 是这样一个问题 给定一系列城市和每对城市之间的距离 求解访问每一座城市一次并回到起始城市的最
  • IDEA打不开(找不到)RunDashBoard问题

    我的IDEA版本是2022版 最近学习微服务发现打不开RunDashBoard 可能是更改了名称叫做Services 点击下方的Services 再点击加号 选择Run Configuration Type 之后选择springboot 就
  • vulnhub靶机Me-and-My-Girlfriend-1打靶记录

    准备环境 kali linux ip 172 16 10 149 Me and My Girlfriend 1 虚拟机n 渗透工具 kali虚拟机 nmap 端口扫描工具 pker后台扫描工具 谷歌xff伪造插件 X Forwarded F
  • 基于SpringBoot+微信小程序的失物招领小程序

    基于SpringBoot 微信小程序的失物招领小程序 全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战
  • uiautomator2实例

    from pytestreport import TestRunner import uiautomator2 as u2 import email import os import smtplib import random import
  • 以太坊燃烧第一个24小时,中文社区在关心什么?

    8月5日 在区块高度 12965000 北京时间8月5日20 33 备受瞩目的以太坊伦敦升级完成 伦敦升级涉及众多提案 其中最令人关注的是EIP 1559 该提案引入销毁机制 让链上费用更合理 同时也一定程度缓解了以太坊的通胀 截至8月6日
  • JDK Self-Extracting Installation for Linux (64-bit)

    http www oracle com technetwork java javase install linux 64 self extracting 142068 html JDK Documentation System Requir
  • nodejs剪切视频,提取音频,上传播放

    简单说说实现方案 首先要有演唱会的链接 使用ibili 这个库下载视频 也可以自己抓取视频链接请求下载 这里有很多方法 将视频保存在本地后 整理出每一首歌曲对应的时分秒 我找的这个视频在某站评论中已经有人整理过了 所以我用 ibili 这个
  • netty在xxl-job中的使用分析

    xxl job版本 2 3 0 netty版本 netty all 4 1 63 final 一 基于spring容器 客户端启动流程 客户端如springboot应用引入xxl core的jar包后 启动springboot过程中会调用x
  • Mysql8.0 安装手册(linux)

    目录 添加Mysql的 yum 仓库 安装mysql 开启远程访问 添加Mysql的 yum 仓库 访问 https dev mysql com downloads repo yum 下载 yum 源 点击 download 复制下载链接使
  • 00.JavaScript基础

    0o 参考资料 js https codeofli github io 2019 11 js note javaScript javaScript vue https codeofli github io 2019 11 js note v
  • @ConfigurationProperties灵活的映射配置信息

    介绍 在用 ConfigurationProperties最常用的功能是用此注解对类进行修饰 设置好prefix前缀 这样在springboot的配置文件中 配置信息的key和value就会对应的配置到类中的属性上 以设置eureka信息为
  • nas挂载windows_【群晖系统】群晖下直接挂载WINDOWS的NTFS格式硬盘

    群晖的硬盘格式是EXT4 相对于WINDOWS下的NTFS格式 大家较不熟悉 在数据管理 使用 恢复等都不如NTFS方便 如果群晖能支持NTFS格式就好了 相信每一位装黑群晖的朋友当时都会有这样的想法 其实 群晖是支持外部设备的NTFS格式
  • c++实现引用计数

    概述 当有指针指向同一块内存空间时 计数器加1 没增加一个指向该内存空间的指针 计数器加1 同理 当原本指向该内存空间的指针指向另一块内存 计数器减1 被指向的另一个内存的计数器加1 下面是一个引用计数的一种实现 示例 直接上代码 总共分为
  • uni-app项目中如何使用scss less

    前言 由于公司业务调整 特意学习下uni项目框架 其实根据官方api就是实现很多功能 其实都是一些小坑要走 下面来说一下uni项目中如何使用scss vue编写中我们可以直接使用下面这样方法 多方便
  • Eclispse中Run on Server窗口让选择Server,但已经存在的选择不了

    对于这种问题 通常是因为版本不匹配造成的 jdk版本 Dynamic Web Modules版本 只要改到相应版本就好了 jdk7 时Dynamic Web Modules应设为2 5 如果无法修改 可以新建一个工程 在新建工程时选择Dyn
  • 记忆深处有尘埃——Memory Compiler

    Memory是大家Floorplan中经常使用到一个器件 而且需要花费不少时间去摆放它 Memory的种类很多 各种类型还分别具有不同的参数 那大家有没有想过 对一个设计来说 我们是如何去选择合适的memory类型 不同的类型有什么区别 在
  • 作为一名程序员,如何开展自己的副业?月赚三万的真实故事

    作为一名程序员 除了敲代码之外还应该有一些副业 我们都是程序员 大多数都是普通人 都在替别人打工 虽然收入在别人眼中挺高 但是连个首付都付不起 这时 首先得要发展副业 与其拿着死工资 还不如做些啥 今天 我所说的不是教大家如何去挣很多钱 而

随机推荐

  • mavon-editor 页面回显使用turndown将HTML转为markdown

    1 安装npm install turndown npm install turndown 2页面使用 v model markdowntext
  • 后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案

    前言 性能优化 是前端绕过不去的一道门槛 甚是重要 最近一年 也很少有机会在项目中进行前端性能优化 一直在忙于业务开发 最近终于是来了机会 遇到了这样的场景 心里也甚是激动 写个随笔记录下性能优化的过程及逻辑 有需要的可以参考下 场景 后端
  • 机器学习实战笔记8(kmeans)

    前面的7次笔记介绍的都是分类问题 本次开始介绍聚类问题 分类和聚类的区别在于前者属于监督学习算法 已知样本的标签 后者属于无监督的学习 不知道样本的标签 下面我们来讲解最常用的kmeans算法 1 kmeans算法 算法过程 Kmeans中
  • Spring核心思想 IOC 、 AOP

    Spring核心思想 IOC AOP IOC 1 什么是IOC 2 IOC解决了什么问题 IoC解决对象之间的耦合问题 3 IOC和DI的区别 AOP 1 什么是AOP 2 AOP在解决什么问题 3 为什么叫切面编程 内容就不展示了 里面已
  • Python自动检查哪位学生未提交作业

    最近期未需要对学生提交的作业进行统计 给平时成绩 总共交了8次作业 每个作业都有2个班 数量太多 于是就利用Python写了一个程序来自动实现 思想 获取指定路径下的所有文件名 如果文件名中包含了学生的名字 因为提交作业的时候以学号 名字进
  • 基于TMF SID的高可扩展性数据模型

    基于TMF SID的高可扩展性数据模型 前言 此文根据TMF SID规范撰写 欢迎大家提出建议和意见 TMF文档版权信息 Copyright TeleManagement Forum 2013 All Rights Reserved Thi
  • Flutter Windows应用开发环境配置

    为什么要入Flutter开发的坑 首先在当今Windows开发已经逐渐成为一个偏小众的领域 不仅要涉及的知识面广 还对开发人员的要求不低 界面的精美也成为一个重要因素 目前已知的Windows 客户端主要分成以下几种 开发语言 Qt C C
  • Android登录 之 Twitter登录

    作为Android登录 之 GooglePlay登录的姊妹篇 这俩篇主要是对接国外平台登录的文章 作者文笔并不好 但是 管他呢 实现功能不就得了嘛 Twitter官网 兄弟们自带梯子啊 然后按照流程 创建申请什么的 也就不多说了 接下来就是
  • Google C++风格指南 阅读笔记

    这个Google C 风格指南出得太好了 有很多C 的问题 其实通过阅读这份文档就可以了 相信读完后 可以在简历上加上一句 具有良好的编码风格 哈哈 下面记录一下我的读书笔记吧 整份文档的中文版本我已经上传到了资源里面 1 头文件 1 1头
  • 在vue使用jsx来解决template中复杂的逻辑处理

    1 首先安装依赖 npm install postcss loader autoprefixer babel loader babel core 2 在 babelrc文件中修改 把 presets env stage 2 plugins
  • 【Python】Windows如何在cmd中切换python版本

    相信很多小伙伴都会有像我一样经历 在windows中装了很多python版本 那么如果我们正式使用的时候应该如何切换呢 方法一 从环境变量中切换python 第一步 打开环境变量 第二步 打开系统变量中Path变量 第三步 将你想使用的Py
  • spring 多个切面的执行顺序及原理

    最近和同事聊起来了springAOP的话题 说了到多个切面的时候程序是怎么执行的 我们常用的spring事务本身也是一个切面 使用的AOP原理 本人从网上找了一些资料 然后根据这些资料进行一下总结 资料地址 1 https blog csd
  • CodeLlama本地部署的实战方案

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • C++:没有与参数列表匹配的构造函数

    报错 E0289 没有与参数列表匹配的构造函数 sales data sales data 实例 初始化一个实例对象 类内定义的构造函数 报错原因 构造函数中第二个参数的类型为 unsigned 而引用只能是引用一个对象 实例化对象时 括号
  • 神经网络(十四)Pytorch完整模型训练和调用GPU加速

    一 模型的训练 Step1 准备数据集 import torchvision train data torchvision dataset CIFAR10 data train True transform torchvision ToTe
  • 微信投屏服务器出错,微信发布7.0.21版本,修复异常问题,增加超实用新功能

    原标题 微信发布7 0 21版本 修复异常问题 增加超实用新功能 iOS微信又更新了 今天发布v7 0 21版本 距离上次更新才两个礼拜的时间 以往微信的更新频率是比较慢的 这次之所以如此之快地发布新版本 感觉是与问题修复有关 因为之前有一
  • UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息

    UNIX系统口令文件 POSIX 1称其为用户数据库 包含以下字段 这些字段也包含在头文件pwd h中定义的passwd结构中 由于历史原因 口令文件 etc passwd是一个ASCII文件 其中的每行都包含以上各字段 字段之间用冒号分隔
  • 无法使用@RequestBody或无法直接使用对象类型获取前端的传递的对象数据

    一 问题概述 当前端发送请求时 传递的参数是一个对象类型 例如 searchForm name 1 age 18 这种格式时 会习惯性使用 RequestBody在后端进行接收 但会发现无法接收到数据 如果你使用的请求方式是get 用的还是
  • 学好ES6/ES2015-核心部分(上)

    ECMAScript 6 以下简称ES6 是JavaScript语言的下一代标准 因为当前版本的ES6是在2015年发布的 所以又称ECMAScript 2015 也就是说 ES6就是ES2015 虽然目前并不是所有浏览器都能兼容ES6全部
  • 贝叶斯优化python包_贝叶斯优化

    万壑松风知客来 摇扇抚琴待留声 1 文起 本篇文章记录通过 Python 调用第三方库 从而调用使用了贝叶斯优化原理的 Hyperopt 方法来进行超参数的优化选择 具体贝叶斯优化原理与相关介绍将在下一次文章中做较为详细的描述 可以参考这里