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

这篇具有很好参考价值的文章主要介绍了基于高斯过程的贝叶斯优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于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 执行实际优化流程

基于高斯过程的贝叶斯优化,机器学习,机器学习文章来源地址https://www.toymoban.com/news/detail-804449.html

到了这里,关于基于高斯过程的贝叶斯优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习-基于朴素贝叶斯的垃圾邮件分类

    概率论是许多机器学习算法的基础,此篇博客会给出一些使用概率论进行分类的方法。 首先从一个最简单的概率分类器开始,然后给出一些假设来学习朴素贝叶斯分类器。我们称之为“朴素”,是因为整个形式化过程只做最原始、最简单的假设。 我们还将构建另一个分类器

    2024年02月02日
    浏览(47)
  • 机器学习——基于朴素贝叶斯分类算法实现垃圾邮件分类

    贝叶斯定理: 贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:  ,在这里A和B都是事件, P(B)P(B)不为0。 在贝叶斯定理中: 1. P(A) 称为”先验概率”,即在B事件发生之前,我们对A事件概率的一个判断。如

    2024年02月04日
    浏览(51)
  • 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

    目录 一、简介和环境准备 简介: 环境: 二、实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入、分析 2.模型训练、预测  三、原理解析 朴素贝叶斯算法 优缺点: 朴素贝叶斯(Naive Bayes, NB) 是

    2023年04月19日
    浏览(92)
  • 【机器学习实战】-基于概率论的分类方法:朴素贝叶斯

    【机器学习实战】读书笔记 **朴素贝叶斯:**称为“ 朴素 ”的原因,整个形式化过程只做最原始、最简单的假设,特征之间没有关联,是统计意义上的独立。 **优点:**在数据较少的情况下仍然有效,可以处理多类别问题。 **缺点:**对于输入数据的准备方式较为敏感。 **适

    2024年03月25日
    浏览(51)
  • 【MATLAB第52期】#源码分享 | 基于MATLAB的高斯过程GPR超参数(sigma)自动优化算法 时间序列预测模型 五折交叉验证

    后台私信回复“52期”即可免费获取数据及代码。 1.数据 一列时间序列数据 ,滑动窗口尺寸为15。 2.思路 使用GPR自动优化函数,对sigma进行自动寻优。 适应度值log(1+loss)。 迭代次数默认30. 后台私信回复“52期”即可获取数据及代码下载链接。

    2024年02月12日
    浏览(64)
  • 机器学习实战3:基于朴素贝叶斯实现单词拼写修正器(附Python代码)

    机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。 🚀详情:机器学习强基计划(附几十种经典模型源码合集) 在

    2024年02月02日
    浏览(40)
  • 大数据分析案例-基于高斯朴素贝叶斯算法构建良恶性肿瘤识别器

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2024年02月04日
    浏览(44)
  • 基于R语言Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合方法与应用

     Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。R语言拥有完整有效的数据处理、统计分析

    2024年02月16日
    浏览(35)
  • 基于机器学习算法:朴素贝叶斯和SVM 分类-垃圾邮件识别分类系统(含Python工程全源码)

    本项目采用朴素贝叶斯和支持向量机(SVM)分类模型作为基础,通过对垃圾邮件和正常邮件的数据进行训练,旨在实现垃圾邮件的自动识别功能。 通过训练这两个分类模型,我们的目标是建立一个高效准确的垃圾邮件识别系统。当接收到新的邮件时,系统将对邮件文本进行预

    2024年02月09日
    浏览(49)
  • 基于传统机器学习模型算法的项目开发详细过程

    描述开发项目模型的一系列情境和因素,包括问题、需求、机会、市场环境、竞争情况等 传统机器学习在解决实际问题中主要分为两类: 有监督学习 :已知输入、输出之间的关系而进行的学习,从而产生一个能够对已知输入给出合适输出的模型。这些算法在图像分类、语音

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包