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。
首先我们看下包的安装:
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. 简单的方程:
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. 复杂模型的实现:
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)
当然我们这里并没有得到最优的参数。大家可以根据自己的需求进行修改相对应的位置。
欢迎大家学习交流!