前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言实现贝叶斯优化算法

R语言实现贝叶斯优化算法

作者头像
一粒沙
修改2020-04-28 18:57:24
2.8K0
修改2020-04-28 18:57:24
举报
文章被收录于专栏:R语言交流中心R语言交流中心

对于神经网络,机器学习等字眼大家应该都很熟悉,今天我们不谈这个,我们看一下这个在这些模型中一个重要的子领域网络超参数搜索。常见的搜索方法是:试错法(Babysitting)、网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)。前面三种都是好理解的,都可以从字面意思进行理解。我们主要讲下这个贝叶斯优化算法。其算法可以转化为一个形式的方程式:

x=argmaxf(x) x∈R

此方程的主要意思是获得f(x)最大时的x值,同时x是R中的一个子元素。

算法主要分为两种子形式:一种Prior Function(PF),当我们不知道目标函数曲线是什么样的时候,我们就只能猜(概率)。主要的方式有含参、不含参、线性、非线形等。比如有高斯过程(GP),认为目标函数满足多变量高斯分布。当然也有存在其他的函数,在选择PF的时候,需要谨慎选择模型,不同的模型效果是不一样的;另外一种Acquisition Function(AC),在经历过PF的选择后,那么就要对PF模型进行进一步修正,就需要通过提供真实的样本点来推测最优参数。

基本的流程就是给一个先验的参数进行不断的优化寻找其最优的参数点。我们下面就直接看下在R语言中是如何实现的,我们需要用到包rBayesianOptimization。

首先我们看下包的安装:

代码语言:javascript
复制

install.packages(“rBayesianOptimization”)
install.packages("xgboost")

在此包中只有一个主要的函数BayesianOptimization,其参数如下:

其中主要的参数:

Bounds 每个超参数的下界和上界的指定列表。列表的名称应该与FUN的参数相同。init_grid_dt中的所有采样点都应该在界限范围内。请使用“L”后缀表示整型超参数。

Init_grid_dt 采样点的数据,可以是data.frame或者data.table. 同时可以通过最后一列命名“Value”来为预先采样的值进行标注。

Init_points 在贝叶斯优化拟合高斯过程之前,随机选取的点的个数。

N_iter 重复贝叶斯优化的总次数。

Acq 设置AC的子函数。包括:

Poi-Probability of improvement

ei-Exceptedimprovement

ucb- upper confidence bound

通过上面的函数的优化,我们会得到具体的一个输出参数列表:

接下来我们就看下包自带的实例:

1. 简单的方程:

代码语言:javascript
复制
Test_Fun <- function(x) {
 list(Score = exp(-(x - 2)^2) + exp(-(x - 6)^2/10) + 1/ (x^2 + 1),
      Pred = 0)
}
## Set larger init_points and n_iter forbetter optimization result
OPT_Res <-BayesianOptimization(Test_Fun,
                                bounds = list(x= c(1, 3)),
                                init_points =2, n_iter = 1,
                                acq ="ucb", kappa = 2.576, eps = 0.0,
                                verbose = TRUE)

2. 复杂模型的实现:

代码语言:javascript
复制

library(xgboost)
data(agaricus.train, package ="xgboost")
dtrain <-xgb.DMatrix(agaricus.train$data,
                      label =agaricus.train$label)
cv_folds <- KFold(agaricus.train$label,nfolds = 5,
                  stratified = TRUE, seed = 0)
xgb_cv_bayes <- function(max.depth,min.child.weight, subsample) {
  cv<- xgb.cv(params = list(booster = "gbtree", eta = 0.01,
                                                 prediction= TRUE,
                             max_depth =max.depth,
                             min_child_weight =min.child.weight,
                             subsample =subsample, colsample_bytree = 0.3,
                             lambda = 1, alpha= 0,
                            objective ="binary:logistic",
                             eval_metric ="auc"),
               data = dtrain, nround = 100,
               folds = cv_folds, prediction =TRUE, showsd = TRUE,
               early_stopping_rounds = 5, maximize= TRUE, verbose = 0)
 list(Score = cv$evaluation_log[,min(cv$evaluation_log$test_rmse_mean)]
      ,Pred = cv$pred)
}
 
 
OPT_Res <-BayesianOptimization(xgb_cv_bayes,
                                bounds =list(max.depth = c(2L, 6L),
                                             min.child.weight= c(1L, 10L),
                                             subsample = c(0.5, 0.8)),
                                 init_grid_dt =NULL,init_points = 10, n_iter = 20,
                                acq ="ucb", kappa = 2.576, eps = 0.0,
                                verbose = TRUE)

当然我们这里并没有得到最优的参数。大家可以根据自己的需求进行修改相对应的位置。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档