使用贝叶斯优化工具实践XGBoost回归模型调参

更新时间:2023-05-15 07:46:43 阅读: 评论:0

半妖司藤小说使⽤贝叶斯优化⼯具实践XGBoost 回归模型调参
0. 关于调参
0.1. 超参数
在机器学习的上下⽂中,超参数(hyper parameters)是在开始学习过程之前设置值的参数,⽽不是通过训练得到的参数数据。通常情况下,需要对超参数进⾏优化,给学习机选择⼀组最优超参数,以提⾼学习的性能和效果。
例如深度学习中的学习率、批次⼤⼩(batch_size)、优化器(optimizer)等,XGBoost算法中的最⼤的树深度(max_depth)、⼦样本⽐例(subsample)、⼦节点最⼩权重和(min_child_weight)等。
0.2. 调参⽅法超参数设置通常调参⽅法如下:随机搜索 (RandomSearch),搜索超参数的值不是固定,是在⼀定范围内随机的值;
⽹格搜索(GridSearch ),给定超参和取值范围,遍历所有组合得到最优参数。⾸先你要给定⼀个先验的取值,不能取得太多,否则组合太多,耗时太长,可以启发式的尝试;
贝叶斯优化(Bayesian optimization),采⽤⾼斯过程迭代式的寻找最优参数,每次迭代都是在上⼀次迭代基础上拟合⾼斯函数上,寻找⽐上⼀次迭代更优的参数。
本⽂主要是分享贝叶斯优化调参⽅法,其他略。
1. 贝叶斯优化理论
贝叶斯优化是⼀种逼近思想,当计算⾮常复杂、迭代次数较⾼时能起到很好的效果,多⽤于超参数确定。
贝叶斯优化算法主要包含两个核⼼部分——概率代理模型(probabilistic surrogate model)和采集函数(acquisition function)。
概率代理模型包含先验概率模型和观测模型:先验概率模;观测模型描述观测数据⽣成的机
制,即似然分布。更新概率代理模型意味着根据公式 (1)得到包含更多数据信息的后验概率分布。
采集函数是根据后验概率分布(⾼斯过程)构造的,通过最⼤化采集函数来选择下⼀个最有 “潜 ⼒”的评估点。同时 ,有效的采集函数能够保证选择的评估点序列使得总损失(loss)最⼩.损失有 时表⽰为regret:
或者累计表⽰为:
其中,表⽰当前最优解。掌握贝叶斯优化调参,须要从三个部分讲起:贝叶斯定理⾼斯过程,⽤以拟合优化⽬标函数贝叶斯优化,包括了“开采”和“勘探”,⽤以花最少的代价找到最优值
1.1. 贝叶斯定理
p (f )p (D ∣f )p (f ∣D )i r =n ∣y −∗y ∣
n R =
i i =1∑n
y ∗
贝叶斯优化名称的由来是因为参数优化中使⽤了贝叶斯定理。
其中,表⽰未知⽬标函数(或者标识参数模型中的参数):
表⽰已观测集合,表⽰决策向量,表⽰观测值误差;
表⽰的似然分布;
表⽰先验概率分布,对未知⽬标函数的假设;
表⽰边际化的边际似然分布或者“证据”,由于该边际似然存在概率密度函数的乘积和积 分,通 常难以得到明确的解析式,该边际似然在贝叶斯优化中主要⽤于优化超参数(hyper-parameter);
表⽰的后验概率分布,后验概率分布描述通过⼰观测数据集对先验进⾏修正后未知⽬标函数的置信度。
贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的⼀则定理。其中P(A|B)是在B发⽣的情况下A发⽣的可能性。
1.2. ⾼斯过程(Gaussian Process )
⾼斯过程(GP)全称是⾼斯分布随机过程,是⼀个可以被⽤来表⽰函数的分布情况的模型。当前,机器学习的常见做法是把函数参数化,然后⽤产⽣的参数建模来规避分布表⽰(如线性回归的权重)。但GP不同,它直接对函数建模⽣成⾮参数模型。由此产⽣的⼀个突出优势就是它不仅能模拟任何⿊盒函数,还能模拟不确定性。这种对不确定性的量化是⼗分重要的,如当我们被允许请求更多数据时,依靠⾼斯过程,我们能探索最不可能实现⾼效训练的数据区域。这也是贝叶斯优化背后的主要思想。
那么⾼斯分布是如何计算的呢?
假设,对于⾼斯过程,其中为均值,为协⽅差核。所以预测也是服从正态分布的,即有。
当随机变量的维度上升到有限的时候,称之为⾼维⾼斯分布,。
对于⼀个维的⾼斯分布⽽⾔,决定它的分布是两个参数:
维均值向量,表⽰维⾼斯分布中各个维度随机变量的期望;
的协⽅差矩阵,表⽰⾼维分布中,各个维度⾃⾝的⽅差,以及不同维度间的协⽅差。
核函数(协⽅差函数)
赤胆忠心
核函数是⼀个⾼斯过程的核⼼,核函数决定了⼀个⾼斯过程的性质。核函数在⾼斯过程中起⽣成⼀个协⽅差矩阵(相关系数矩阵)来衡量任意两个点之间的“距离”。不同的核函数有不同的衡量⽅法,得到的⾼斯过程的性质也不⼀样。最常⽤的⼀个核函数为⾼斯核函数,也成为径向基函数 RBF。其基本形式如下。
其中和是⾼斯核的超参数。
本⽂使⽤的BayesianOptimization的源代码中,⾼斯过程使⽤了sklearn.gaussian_process,如下截部分取代码所⽰。
p (f ∣D )=i (1)
p (D )i p (D ∣f )p (f )
i f D =i (x ,y ),(x ,y ),...,(x ,y )1122n n x i y =i f (x )+i εi p (D ∣f )i y p (f )f p (D )i f p (f ∣D )i f f ∼GP (μ,K )GP μK p (y ∣x ,D )=N (,)y ^σ^2n p (x )=N (μ,)∑n ×n n n μn n n ×n ∑n ×n K (x ,x )=i j σexp (−)22l 2
∣∣x −x ∣∣i j 2
2σl
from  sklearn .gaussian_process .kernels import  Matern
from  sklearn .gaussian_process import  GaussianProcessRegressor
......
lf ._random_state = ensure_rng (random_state )
# Data structure containing the function to be optimized, the bounds of
瓤豆腐# its domain, and a record of the evaluations we have done so far
lf ._space = TargetSpace (f , pbounds , random_state )
# queue
lf ._queue = Queue ()
# Internal GP regressor
lf ._gp = GaussianProcessRegressor (
kernel =Matern (nu =2.5),
alpha =1e -6,
normalize_y =True ,
n_restarts_optimizer =5,
random_state =lf ._random_state ,
)
lf ._verbo = verbo
lf ._bounds_transformer = bounds_transformer
if  lf ._bounds_transformer :
lf ._bounds_transformer .initialize (lf ._space )
super (BayesianOptimization , lf ).__init__(events =DEFAULT_EVENTS )
最火铃声>我不过低配的人生1.3. 贝叶斯优化
参数优化基本思想是基于数据使⽤贝叶斯定理估计⽬标函数的后验分布,然后再根据分布选择下⼀个采样的超参数组合。它充分利⽤了前⼀个采样点的信息,其优化的⼯作⽅式是通过对⽬标函数形状的学习,并找到使结果向全局最⼤提升的参数。
假设⼀组超参数组合是(表⽰某⼀个超参数的值),不同超参数会得到不同效果,贝叶斯优化假设超参数与最后模型需要优化的损失函数存在⼀个函数关系。
⾼斯过程⽤贝叶斯优化中对⽬标函数建模,得到其后验分布。
⽽⽬前机器学习其实是⼀个可见输⼊与输出的⿊盒⼦(black box),所以很难确直接定存在什么样的函
数关系,所以我们需要将注意⼒转移到⼀个我们可以解决的函数上去,下⾯开始正式介绍贝叶斯优化。
贝叶斯优化的⼤体思路如下:
假设我们有⼀个函数,我们需要在内找到:
注意上⾯的表⽰的是超参数。以XGBoost分类任务为例,可以是eta(学习率),max_depth(最⼤的树深度)等超参数的设置。⽽为了避免全⽂符号太多,所以将输⼊数据隐去了。
当是凸函数且定义域也是凸的时候,我们可以通过已被⼴泛研究的凸优化来处理,但是并不⼀定是凸的,⽽且在机器学习中通常是expensive black-box function,即计算⼀次需要花费⼤量资源。那么贝叶斯优化是如何处理这⼀问题的呢?
贝叶斯优化把搜索的模型空间假设为⾼斯分布,利⽤⾼斯过程,按迭代的⽅式每次计算得到⽐当前最优参数期望提升的新的最优参数。
X =x ,x ,...x 12n x n f :x →R x ⊆X x =∗f (x )(2)
x ∈X argmin x x f X f f
距离的英语例如详细算法,Sequential model-bad optimization (SMBO) 是贝叶斯优化的最简形式,其算法思路如下:Input(输⼊):是模型(所谓⿊盒⼦),即输⼊⼀组超参数,得到⼀个输出值;是超参数搜索空间等;
是表⽰⼀个由若⼲对数据组成的数据集,每⼀对数组表⽰为,是⼀组超参数,表⽰该组超参数对应的结果(如精确率等);是参数选择算法Acquisition Function;
是对数据集进⾏拟合得到的模型,可以⽤来假设的模型有随机森林、Tree Parzen Estimators、⾼斯模型等。本⽂实践是⾼斯拟合函数。
这⼀步骤就是初始化获取数据集,其中,这些都是已知的。
循环迭代参数次
因为每次选出参数后都需要计算,⽽正如前⾯介绍的每计算⼀次函数,都会消耗⼤量资源,所以⼀般需要固定选参次数(或者是函数评估次数)。
⾸先,预先假设了模型服从⾼斯分布,且已知了数据集,所以可以通过计算得出具体的模型具体函数表⽰。
通过⾼斯过程建模之后,我们尝试抽样进⾏样本计算,⽽贝叶斯优化很容易在局部最优解上不断采样,这就涉及到了开发和探索之间的权衡。开发 (exploitation): 根据后验分布,在最可能出现全局最优解的区域进⾏采样, 开发⾼意味着均值⾼
探索 (exploration): 在还未取样的区域获取采样点, 探索⾼意味着⽅差⾼
⽽如何⾼效的采样,即开发和探索,我们需要⽤到 Acquisition Function, 它是⽤来寻找下⼀个 x 的函数。
⼀般形式的Acquisition Funtion是关于x的函数,映射到实数空间R,表⽰改点的⽬标函数值能够⽐当
前最优值⼤多少的概率,⽬前主要有以下⼏种主流的Acquisition Function:POI Expected Improvement
Confidence bound criteria
2. XBoost 回归算法使⽤贝叶斯优化调参
2.1. ⾼斯过程全局优化的Python 实现
⽬前可以做贝叶斯优化的第三⽅python包很多,常⽤的有BayesianOptimization、bayesopt、skopt等等。本⽂使⽤
BayesianOptimization为例,利⽤XGBoost的回归模型进⾏趋势预测。
安装第三⽅包:bayesian-optimization
f X D (x ,y )x y S M D InitSamples (f ,x )→D
D =(x ,y ),...,(x ,y )11n n y =i f (x )i T x f (x )f p (y ∣x ,D )←FITMODEL (M ,D )
M D
pip install bayesian-optimization
包的依赖:
Numpy
Scipy
Scikit-learn
2.2. XGBoost参数调优实践案例
f
我们需要开始的就是实例化⼀个BayesianOptimization对象,指定要优化的函数,代码中的 _xgb_evaluate以及它的参数及其相应的边界。这是⼀种受约束的优化技术,因此必须为每个参数指定可以探测的最⼩值和最⼤值,才能使其⼯作,例如XGBoost训练参数的边界参数:
{'max_depth': (5, 11),
'gamma': (0, 1),
'colsample_bytree': (0.5, 0.9),
'min_child_weight': (5, 300)}
核⼼⽰例代码如下:
import pandas as pd
import numpy as np
del_lection import train_test_split
import xgboost as xgb
from xgboost import plot_importance
import matplotlib.pyplot as plt
ics import mean_squared_error
from sklearn.preprocessing import StandardScaler
ics import r2_score
from bayes_opt import BayesianOptimization
class ChurnDayModel(object):
def__init__(lf, df, model_filename):
lf.df = df
def evaluate(lf):
dtrain = xgb.DMatrix(lf.x_train, label=lf.y_train)
def_xgb_evaluate(max_depth, gamma, colsample_bytree, min_child_weight):
params ={'eval_metric':'rm',
'max_depth':int(max_depth),
'subsample':0.8,
'eta':0.3,
小米6什么时候上市的
'gamma': gamma,
'colsample_bytree': colsample_bytree,
'min_child_weight': min_child_weight}
# Ud around 1000 boosting rounds in the full model
cv_result = xgb.cv(params, dtrain, num_boost_round=100, nfold=3)# nfold 分三组交叉验证
# Bayesian optimization only knows how to maximize, not minimize, so return the negative RMSE
return-1.0* cv_result['test-rm-mean'].iloc[-1]
xgb_bo = BayesianOptimization(_xgb_evaluate,{'max_depth':(5,11),
'gamma':(0,1),
'colsample_bytree':(0.5,0.9),
'min_child_weight':(5,300)})
# U the expected improvement acquisition function to handle negative numbers
# Optimally needs quite a few more initiation points and number of iterations
xgb_bo.maximize(init_points=4, n_iter=25, acq='ei')
牛肉酱的做法大全print(xgb_bo.max)

本文发布于:2023-05-15 07:46:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/638171.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   函数   优化
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图