青岛手机建站哪家好,如何制作app软件游戏,温州品牌网站设计,诸暨城乡与建设局网站文章目录 贝叶斯优化算法原理贝叶斯优化的实现#xff08;三种方法均有代码实现#xff09;基于Bayes_opt实现GP优化基于HyperOpt实现TPE优化基于Optuna实现多种贝叶斯优化 贝叶斯优化算法原理 在贝叶斯优化的数学过程当中#xff0c;我们主要执行以下几个步骤#xff1a; … 文章目录 贝叶斯优化算法原理贝叶斯优化的实现三种方法均有代码实现基于Bayes_opt实现GP优化基于HyperOpt实现TPE优化基于Optuna实现多种贝叶斯优化 贝叶斯优化算法原理 在贝叶斯优化的数学过程当中我们主要执行以下几个步骤 1 定义需要估计的 f ( x ) f(x) f(x)以及 x x x的定义域 2 取出有限的n个 x x x上的值求解出这些 x x x对应的 f ( x ) f(x) f(x)求解观测值 3 根据有限的观测值对函数进行估计该假设被称为贝叶斯优化中的先验知识得出该估计 f ∗ f^* f∗上的目标值最大值或最小值 4 定义某种规则以确定下一个需要计算的观测点
并持续在2-4步骤中进行循环直到假设分布上的目标值达到我们的标准或者所有计算资源被用完为止例如最多观测m次或最多允许运行t分钟。 以上流程又被称为序贯模型优化SMBO是最为经典的贝叶斯优化方法。在实际的运算过程当中尤其是超参数优化的过程当中有以下具体细节需要注意 当贝叶斯优化不被用于HPO时一般 f ( x ) f(x) f(x)可以是完全的黑盒函数black box function也译作黑箱函数即只知道 x x x与 f ( x ) f(x) f(x)的对应关系却丝毫不知道函数内部规律、同时也不能写出具体表达式的一类函数因此贝叶斯优化也被认为是可以作用于黑盒函数估计的一类经典方法。但在HPO过程当中需要定义的 f ( x ) f(x) f(x)一般是交叉验证的结果/损失函数的结果而我们往往非常清楚损失函数的表达式只是我们不了解损失函数内部的具体规律因此HPO中的 f ( x ) f(x) f(x)不能算是严格意义上的黑盒函数。 在HPO中自变量 x x x就是超参数空间。在上述二维图像表示中 x x x为一维的但在实际进行优化时超参数空间往往是高维且极度复杂的空间。 最初的观测值数量n、以及最终可以取到的最大观测数量m都是贝叶斯优化的超参数最大观测数量m也决定了整个贝叶斯优化的迭代次数。 在第3步中根据有限的观测值、对函数分布进行估计的工具被称为概率代理模型Probability Surrogate model毕竟在数学计算中我们并不能真的邀请数万人对我们的观测点进行连线。这些概率代理模型自带某些假设他们可以根据廖廖数个观测点估计出目标函数的分布 f ∗ f^* f∗包括 f ∗ f^* f∗上每个点的取值以及该点对应的置信度。在实际使用时概率代理模型往往是一些强大的算法最常见的比如高斯过程、高斯混合模型等等。传统数学推导中往往使用高斯过程但现在最普及的优化库中基本都默认使用基于高斯混合模型的TPE过程。 在第4步中用来确定下一个观测点的规则被称为采集函数Aquisition Function采集函数衡量观测点对拟合 f ∗ f^* f∗所产生的影响并选取影响最大的点执行下一步观测因此我们往往关注采集函数值最大的点。最常见的采集函数主要是概率增量PIProbability of improvement比如我们计算的频数、期望增量Expectation Improvement、置信度上界Upper Confidence Bound、信息熵Entropy等等。上方gif图像当中展示了PI、UCB以及EI。其中大部分优化库中默认使用期望增量。
在HPO中使用贝叶斯优化时我们常常会看见下面的图像这张图像表现了贝叶斯优化的全部基本元素我们的目标就是在采集函数指导下让 f ∗ f^* f∗尽量接近 f ( x ) f(x) f(x)。
贝叶斯优化的实现三种方法均有代码实现
贝叶斯优化是当今黑盒函数估计领域最为先进和经典的方法在同一套序贯模型下使用不同的代理模型以及采集函数、还可以发展出更多更先进的贝叶斯优化改进版算法因此贝叶斯优化的其算法本身就多如繁星实现各种不同种类的贝叶斯优化的库也是琳琅满目几乎任意一个专业用于超参数优化的工具库都会包含贝叶斯优化的内容。我们可以在以下页面找到大量可以实现贝叶斯优化方法的HPO库https://www.automl.org/automl/hpo-packages/ 其中大部分库都是由独立团队开发和维护因此不同的库之间之间的优劣、性格、功能都有很大的差异。在课程中我们将介绍如下三个可以实现贝叶斯优化的库bayesian-optimizationhyperoptoptuna。
HPO库优劣评价推荐指数bayes_opt✅实现基于高斯过程的贝叶斯优化✅当参数空间由大量连续型参数构成时⛔包含大量离散型参数时避免使用⛔算力/时间稀缺时避免使用⭐⭐hyperopt✅实现基于TPE的贝叶斯优化✅支持各类提效工具✅进度条清晰展示美观较少怪异警告或报错✅可推广/拓展至深度学习领域⛔不支持基于高斯过程的贝叶斯优化⛔代码限制多、较为复杂灵活性较差⭐⭐⭐⭐optuna✅可能需结合其他库实现基于各类算法的贝叶斯优化✅代码最简洁同时具备一定的灵活性✅可推广/拓展至深度学习领域⛔非关键性功能维护不佳有怪异警告与报错⭐⭐⭐⭐
导入库确认使用数据基于随机森林回归器进行优化
#基本工具
import numpy as np
import pandas as pd
import time
import os #修改环境设置#算法/损失/评估指标等
import sklearn
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.model_selection import KFold, cross_validate#优化器
from bayes_opt import BayesianOptimizationimport hyperopt
from hyperopt import hp, fmin, tpe, Trials, partial
from hyperopt.early_stop import no_progress_lossimport optuna#导入波士顿房价数据
data pd.read_csv(rD:\Pythonwork\datasets\House Price\train_encode.csv,index_col0)
#查看数据
data.head()
X data.iloc[:,:-1]
y data.iloc[:,-1]基于Bayes_opt实现GP优化
1 定义目标函数 目标函数的值即 f ( x ) f(x) f(x)的值。贝叶斯优化会计算 f ( x ) f(x) f(x)在不同 x x x上的观测值因此 f ( x ) f(x) f(x)的计算方式需要被明确。在HPO过程中我们希望能够筛选出令模型泛化能力最大的参数组合因此 f ( x ) f(x) f(x)应该是损失函数的交叉验证值或者某种评估指标的交叉验证值。需要注意的是bayes_opt库存在三个影响目标函数定义的规则 1 目标函数的输入必须是具体的超参数而不能是整个超参数空间更不能是数据、算法等超参数以外的元素因此在定义目标函数时我们需要让超参数作为目标函数的输入。 2 超参数的输入值只能是浮点数不支持整数与字符串。因此当算法的实际参数需要输入字符串时该参数不能使用bayes_opt进行调整当算法的实际参数需要输入整数时则需要在目标函数中规定参数的类型。 3 bayes_opt只支持寻找 f ( x ) f(x) f(x)的最大值不支持寻找最小值。因此当我们定义的目标函数是某种损失时目标函数的输出需要取负即如果使用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_state83,verboseFalse #可自行决定是否开启森林建树的verbose,n_jobs-1)#定义损失的输出5折交叉验证下的结果输出负根均方误差-RMSE#注意交叉验证需要使用数据但我们不能让数据X,y成为目标函数的输入cv KFold(n_splits5,shuffleTrue,random_state83)validation_loss cross_validate(reg,X,y,scoringneg_root_mean_squared_error,cvcv,verboseFalse,n_jobs-1,error_scoreraise#如果交叉验证中的算法执行报错则告诉我们错误的理由)#交叉验证输出的评估指标是负根均方误差因此本来就是负的损失#目标函数可直接输出该损失的均值return np.mean(validation_loss[test_score]) 2 定义参数空间
在任意超参数优化器中优化器会将参数空格中的超参数组合作为备选组合一组一组输入到算法中进行训练。在贝叶斯优化中超参数组合会被输入我们定义好的目标函数 f ( x ) f(x) f(x)中。
在bayes_opt中我们使用字典方式来定义参数空间其中参数的名称为键参数的取值范围为值。且任意参数的取值范围为双向闭区间以下方的空间为例在n_estimators的取值中80与100都可以被取到。
param_grid_simple {n_estimators: (80,100), max_depth:(10,25), max_features: (10,20), min_impurity_decrease:(0,1)}需要注意的是bayes_opt只支持填写参数空间的上界与下界不支持填写步长等参数且bayes_opt会将所有参数都当作连续型超参进行处理因此bayes_opt会直接取出闭区间中任意浮点数作为备选参数。例如取92.28作为n_estimators的值。
这也是为什么在目标函数中我们需要对整数型超参的取值都套上int函数。假设优化器取出92.28作为n_estimators的值实际传入随机森林算法的会是int(92.28) 92如此我们可以保证算法运行过程中不会因参数类型不符而报错。也因为bayes_opt的这个性质输入bayes_opt的参数空间天生会比其他贝叶斯优化库更大/更密因此需要的迭代次数也更多
3 定义优化目标函数的具体流程
在有了目标函数与参数空间之后我们就可以按bayes_opt的规则进行优化了。在任意贝叶斯优化算法的实践过程中一定都有涉及到随机性的过程——例如随机抽取点作为观测点随机抽样部分观测点进行采集函数的计算等等。在大部分优化库当中这种随机性是无法控制的即便允许我们填写随机数种子优化算法也不能固定下来。因此我们可以尝试填写随机数种子但需要记住优化算法每次运行时一定都会不一样。
虽然优化算法无法被复现但是优化算法得出的最佳超参数的结果却是可以被复现的。只要优化完毕之后可以从优化算法的实例化对象中取出最佳参数组合以及最佳分数该最佳参数组合被输入到交叉验证中后是一定可以复现其最佳分数的。如果没能复现最佳分数则是交叉验证过程的随机数种子设置存在问题或者优化算法的迭代流程存在问题。
def param_bayes_opt(init_points,n_iter):#定义优化器先实例化优化器opt BayesianOptimization(bayesopt_objective #需要优化的目标函数,param_grid_simple #备选参数空间,random_state83 #随机数种子虽然无法控制住)#使用优化器记住bayes_opt只支持最大化opt.maximize(init_points init_points #抽取多少个初始观测值, n_itern_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_best4 定义验证函数非必须
优化后的结果是可以复现的即我们可以对优化算法给出的最优参数进行再验证其中验证函数与目标函数高度相似输入参数或超参数空间、输出最终的损失函数结果。在使用sklearn中自带的优化算法时由于优化算法自己会执行分割数据、交叉验证的步骤因此优化算法得出的最优分数往往与我们自身验证的分数不同因为交叉验证时的数据分割不同。然而在贝叶斯优化过程中目标函数中的交叉验证即数据分割都是我们自己规定的因此原则上来说只要在目标函数中设置了随机数种子贝叶斯优化给出的最佳分数一定与我们验证后的分数相同所以当对优化过程的代码比较熟悉时可以不用进行二次验证。
# 即带入最优参数查看结果
def bayes_opt_validation(params_best):reg RFR(n_estimators int(params_best[n_estimators]) ,max_depth int(params_best[max_depth]),max_features int(params_best[max_features]),min_impurity_decrease params_best[min_impurity_decrease],random_state83,verboseFalse,n_jobs-1)cv KFold(n_splits5,shuffleTrue,random_state83)validation_loss cross_validate(reg,X,y,scoringneg_root_mean_squared_error,cvcv,verboseFalse,n_jobs-1)return np.mean(validation_loss[test_score])5 执行实际优化流程
start time.time()
params_best, score_best param_bayes_opt(20,280) #初始看20个观测值后面迭代280次
print(It takes %s minutes % ((time.time() -2 start)/60))
validation_score bayes_opt_validation(params_best)
print(\n,\n,validation_score: ,validation_score)可以查看最终结果
基于HyperOpt实现TPE优化
Hyperopt优化器是目前最为通用的贝叶斯优化器之一Hyperopt中集成了包括随机搜索、模拟退火和TPETree-structured Parzen Estimator Approach等多种优化算法。相比于Bayes_optHyperopt的是更先进、更现代、维护更好的优化器也是我们最常用来实现TPE方法的优化器。在实际使用中相比基于高斯过程的贝叶斯优化基于高斯混合模型的TPE在大多数情况下以更高效率获得更优结果该方法目前也被广泛应用于AutoML领域中。TPE算法原理可以参阅原论文Multiobjective tree-structured parzen estimator for computationally expensive optimization problems在这里我们将重点介绍关于Hyperopt中使用TPE进行超参数搜索的过程。
1 定义目标函数
在定义目标函数 f ( x ) f(x) f(x)时我们需要严格遵守需要使用的当下优化库的基本规则。与Bayes_opt一样Hyperopt也有一些特定的规则会限制我们的定义方式主要包括 1 目标函数的输入必须是符合hyperopt规定的字典不能是类似于sklearn的参数空间字典、不能是参数本身更不能是数据、算法等超参数以外的元素。因此在自定义目标函数时我们需要让超参数空间字典作为目标函数的输入。 2 Hyperopt只支持寻找 f ( x ) f(x) f(x)的最小值不支持寻找最大值因此当我们定义的目标函数是某种正面的评估指标时如准确率auc我们需要对该评估指标取负。如果我们定义的目标函数是负损失也需要对负损失取绝对值。当且仅当我们定义的目标函数是普通损失时我们才不需要改变输出。 def hyperopt_objective(params):#定义评估器#需要搜索的参数需要从输入的字典中索引出来#不需要搜索的参数可以是设置好的某个值#在需要整数的参数前调整参数类型reg RFR(n_estimators int(params[n_estimators]),max_depth int(params[max_depth]),max_features int(params[max_features]),min_impurity_decrease params[min_impurity_decrease],random_state83,verboseFalse,n_jobs-1)#交叉验证结果输出负根均方误差-RMSEcv KFold(n_splits5,shuffleTrue,random_state83)validation_loss cross_validate(reg,X,y,scoringneg_root_mean_squared_error,cvcv,verboseFalse,n_jobs-1,error_scoreraise)#最终输出结果由于只能取最小值所以必须对-RMSE求绝对值#以求解最小RMSE所对应的参数组合return np.mean(abs(validation_loss[test_score]))2 定义参数空间
在任意超参数优化器中优化器会将参数空格中的超参数组合作为备选组合一组一组输入到算法中进行训练。在贝叶斯优化中超参数组合会被输入我们定义好的目标函数 f ( x ) f(x) f(x)中。
在hyperopt中我们使用特殊的字典形式来定义参数空间其中键值对上的键可以任意设置只要与目标函数中索引参数的键一致即可键值对的值则是hyperopt独有的hp函数包括了 hp.quniform(“参数名称”, 下界, 上界, 步长) - 适用于均匀分布的浮点数 hp.uniform(“参数名称”,下界, 上界) - 适用于随机分布的浮点数 hp.randint(“参数名称”,上界) - 适用于[0,上界)的整数区间为前闭后开 hp.choice(“参数名称”,[“字符串1”,“字符串2”,…]) - 适用于字符串类型最优参数由索引表示 hp.choice(“参数名称”,[*range(下界上界步长)]) - 适用于整数型最优参数由索引表示 hp.choice(“参数名称”,[整数1,整数2,整数3,…]) - 适用于整数型最优参数由索引表示 hp.choice(“参数名称”,[“字符串1”,整数1,…]) - 适用于字符与整数混合最优参数由索引表示 在hyperopt的说明当中并未明确参数取值范围空间的开闭根据实验如无特殊说明hp中的参数空间定义方法应当都为前闭后开区间。我们依然使用在随机森林上获得最高分的随机搜索的参数空间
param_grid_simple {n_estimators: hp.quniform(n_estimators,80,100,1), max_depth: hp.quniform(max_depth,10,25,1), max_features: hp.quniform(max_features,10,20,1), min_impurity_decrease:hp.quniform(min_impurity_decrease,0,5,1)}由于hp.choice最终会返回最优参数的索引容易与数值型参数的具体值混淆而hp.randint又只能够支持从0开始进行计数因此我们常常会使用quniform获得均匀分布的浮点数来替代整数。对于需要取整数的参数值如果采用quniform方式构筑参数空间则需要在目标函数中使用int函数限定输入类型。例如在范围[0,5]中取值时可以取出[0.0, 1.0, 2.0, 3.0,…]这种均匀浮点数在输入目标函数时则必须确保参数值前存在int函数。当然如果使用hp.choice则不会存在该问题。
3 定义优化目标函数的具体流程
有了目标函数和参数空间接下来我们就可以进行优化了。在Hyperopt中我们用于优化的基础功能叫做fmin在fmin中我们可以自定义使用的代理模型参数algo一般来说我们有tpe.suggest以及rand.suggest两种选项前者指代TPE方法后者指代随机网格搜索方法。我们还可以通过partial功能来修改算法涉及到的具体参数包括模型具体使用了多少个初始观测值参数n_start_jobs以及在计算采集函数值时究竟考虑多少个样本参数n_EI_candidates。当然我们也可以不填写这些参数就使用默认的参数值。
除此之外Hyperopt当中还有两个值得注意的功能一个记录整个迭代过程的trials另一个是提前停止参数early_stop_fn。其中trials直译为“实验”或“测试”表示我们不断尝试的每一种参数组合这个参数中我们一般输入从hyperopt库中导入的方法Trials()当优化完成之后我们可以从保存好的trials中查看损失、参数等各种中间信息而提前停止参数early_stop_fn中我们一般输入从hyperopt库导入的方法no_progress_loss()这个方法中可以输入具体的数字n表示当损失连续n次没有下降时让算法提前停止。由于贝叶斯方法的随机性较高当样本量不足时需要多次迭代才能够找到最优解因此一般no_progress_loss()中的数值不会设置得太高。
def param_hyperopt(max_evals100):#保存迭代过程trials Trials()#设置提前停止early_stop_fn no_progress_loss(100)#定义代理模型#algo partial(tpe.suggest, n_startup_jobs20, n_EI_candidates50)params_best fmin(hyperopt_objective #目标函数, space param_grid_simple #参数空间, algo tpe.suggest #代理模型你要哪个呢#, algo algo, max_evals max_evals #允许的迭代次数, verboseTrue, trials trials, early_stop_fn early_stop_fn)#打印最优参数fmin会自动打印最佳分数print(\n,\n,best params: , params_best,\n)return params_best, trials4 定义验证函数非必要
def hyperopt_validation(params): reg RFR(n_estimators int(params[n_estimators]),max_depth int(params[max_depth]),max_features int(params[max_features]),min_impurity_decrease params[min_impurity_decrease],random_state83,verboseFalse,n_jobs-1)cv KFold(n_splits5,shuffleTrue,random_state83)validation_loss cross_validate(reg,X,y,scoringneg_root_mean_squared_error,cvcv,verboseFalse,n_jobs-1)return np.mean(abs(validation_loss[test_score]))5 执行实际优化流程
params_best, trials param_hyperopt(300) #10%的空间大小运行结果
#打印所有搜索相关的记录
trials.trials[0]由于具有提前停止功能因此基于TPE的hyperopt优化可能在我们设置的迭代次数被达到之前就停止也因此hyperopt迭代到实际最优值所需的迭代次数可能更少。同时TPE方法相比于高斯过程计算会更加迅速因此在运行277次迭代的情况下hyperopt只需要1分钟时间而运行300次迭代的bayes_opt却需要2.11分钟可见即便运行同样的迭代次数hyperopt也是更有优势的这或许是因为hyperopt的参数空间更加稀疏、在整数型参数搜索上更高效。
不过HyperOpt的缺点也很明显那就是代码精密度要求较高、灵活性较差略微的改动就可能让代码疯狂报错难以跑通。同时HyperOpt所支持的优化算法也不够多如果我们专注地使用TPE方法则掌握HyperOpt即可如果我们希望拥有丰富的HPO手段则可以更深入地接触Optuna库。
基于Optuna实现多种贝叶斯优化
Optuna是目前为止最为成熟、拓展性最强的超参数优化框架与古旧的bayes_opt相比Optuna明显是专门为机器学习和深度学习所设计。为了满足机器学习开发者的需求Optuna拥有强大且固定的API因此Optuna代码简单编写高度模块化是我们介绍的库中代码最为简练的库。Optuna的优势在于它可以无缝衔接到PyTorch、Tensorflow等深度学习框架上也可以与sklearn的优化库scikit-optimize结合使用因此Optuna可以被用于各种各样的优化场景。
1 定义目标函数与参数空间
Optuna的目标函数相当特别。在其他优化库中我们需要单独输入参数或参数空间优化器会在具体优化过程中将参数空间一一放入我们的目标函数进行优化但在Optuna中我们并不需要将参数或参数空间输入目标函数而是需要直接在目标函数中定义参数空间。特别的是Optuna优化器会生成一个指代备选参数的变量trial该变量无法被用户获取或打开但该变量在优化器中生存并被输入目标函数。在目标函数中我们可以通过变量trail所携带的方法来构造参数空间具体如下所示
def optuna_objective(trial):#定义参数空间n_estimators trial.suggest_int(n_estimators,80,100,1) #整数型(参数名称下界上界步长)max_depth trial.suggest_int(max_depth,10,25,1)max_features trial.suggest_int(max_features,10,20,1)#max_features trial.suggest_categorical(max_features,[log2,sqrt,auto]) #字符型min_impurity_decrease trial.suggest_int(min_impurity_decrease,0,5,1)#min_impurity_decrease trial.suggest_float(min_impurity_decrease,0,5,logFalse) #浮点型#定义评估器#需要优化的参数由上述参数空间决定#不需要优化的参数则直接填写具体值reg RFR(n_estimators n_estimators,max_depth max_depth,max_features max_features,min_impurity_decrease min_impurity_decrease,random_state83,verboseFalse,n_jobs-1)#交叉验证过程输出负均方根误差(-RMSE)#optuna同时支持最大化和最小化因此如果输出-RMSE则选择最大化#如果选择输出RMSE则选择最小化cv KFold(n_splits5,shuffleTrue,random_state83)validation_loss cross_validate(reg,X,y,scoringneg_root_mean_squared_error,cvcv #交叉验证模式,verboseFalse #是否打印进程,n_jobs-1 #线程数,error_scoreraise)#最终输出RMSEreturn np.mean(abs(validation_loss[test_score]))2 定义优化目标函数的具体流程
在HyperOpt当中我们可以调整参数algo来自定义用于执行贝叶斯优化的具体算法在Optuna中我们也可以。大部分备选的算法都集中在Optuna的模块sampler中包括我们熟悉的TPE优化、随机网格搜索以及其他各类更加高级的贝叶斯过程对于Optuna.sampler中调出的类我们也可以直接输入参数来设置初始观测值的数量、以及每次计算采集函数时所考虑的观测值量。在Optuna库中并没有集成实现高斯过程的方法但我们可以从scikit-optimize里面导入高斯过程来作为optuna中的algo设置而具体的高斯过程相关的参数则可以通过如下方法进行设置
def optimizer_optuna(n_trials, algo):#定义使用TPE或者GPif algo TPE:algo optuna.samplers.TPESampler(n_startup_trials 10, n_ei_candidates 24)elif algo GP:from optuna.integration import SkoptSamplerimport skoptalgo SkoptSampler(skopt_kwargs{base_estimator:GP, #选择高斯过程n_initial_points:10, #初始观测点10个acq_func:EI} #选择的采集函数为EI期望增量)#实际优化过程首先实例化优化器study optuna.create_study(sampler algo #要使用的具体算法, directionminimize #优化的方向可以填写minimize或maximize)#开始优化n_trials为允许的最大迭代次数#由于参数空间已经在目标函数中定义好因此不需要输入参数空间study.optimize(optuna_objective #目标函数, n_trialsn_trials #最大迭代次数包括最初的观测值的, show_progress_barTrue #要不要展示进度条呀)#可直接从优化好的对象study中调用优化的结果#打印最佳参数与最佳损失值print(\n,\n,best params: , study.best_trial.params,\n,\n,best score: , study.best_trial.values,\n)return study.best_trial.params, study.best_trial.values3 执行实际优化流程
best_params, best_score optimizer_optuna(300,TPE)best_params, best_score optimizer_optuna(300,GP)