本文名字叫做贝叶斯优化实战~~就说明我不会在这里讲它的理论知识。因为我还没看懂。。。
不过用起来是真的舒服,真是好用的不行呢~
开始本文之前,我先说一下我目前用到的调参的手段。
1.网格搜索与随机搜索:
图来自:https://www.cnblogs.com/marsggbo/p/9866764.html
我们都知道神经网络训练是由许多超参数决定的,例如网络深度,学习率,卷积核大小等等。所以为了找到一个最好的超参数组合,最直观的的想法就是Grid Search,其实也就是穷举搜索,示意图如下。
但是我们都知道机器学习训练模型是一个非常耗时的过程,而且现如今随着网络越来越复杂,超参数也越来越多,以如今计算力而言要想将每种可能的超参数组合都实验一遍(即Grid Search)明显不现实,所以一般就是事先限定若干种可能,但是这样搜索仍然不高效。
所以为了提高搜索效率,人们提出随机搜索,示意图如下。虽然随机搜索得到的结果互相之间差异较大,但是实验证明随机搜索的确比网格搜索效果要好。
2.贝叶斯优化
先说一下它的好处吧:我记得我之前调SVR网格搜索时候,就是一个噩梦,3000个数据也得搞个小一会~我知道我的小mbp是不适合运行这些,但是你这也太慢了吧。而且事实证明不仅慢,效果其实也有待商榷。算了,不讨论有多差了,来看看贝叶斯优化吧。真实太棒了。
下面我会以一个随机森林二分类与一个lightgbm回归两个例子展示贝叶斯优化,我相信以后遇到别的模型调参,有这两个模板在,问题都不大~我还是建议这些代码都要背下来,这样以后顺手就来多帅哦。
关于安装:
pip install bayesian-optimization
我的版本:
bayesian-optimization-1.0.0
bayesian-optimization 的github:https://github.com/fmfn/BayesianOptimization/blob/master/examples/basic-tour.ipynb
3.RF分类调参
参考:https://www.cnblogs.com/yangruiGB2312/p/9374377.html
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import cross_val_score
from bayes_opt import BayesianOptimization
# 产生随机分类数据集,10个特征, 2个类别
x, y = make_classification(n_samples=1000,n_features=10,n_classes=2)
我们先看看不调参的结果:
import numpy as np
rf = RandomForestClassifier()
print(np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc')))
0.9839600000000001
bayes调参初探
我们先定义一个目标函数,里面放入我们希望优化的函数。比如此时,函数输入为随机森林的所有参数,输出为模型交叉验证5次的AUC均值,作为我们的目标函数。因为bayes_opt库只支持最大值,所以最后的输出如果是越小越好,那么需要在前面加上负号,以转为最大值。由于bayes优化只能优化连续超参数,因此要加上int()转为离散超参数。
def rf_cv(n_estimators, min_samples_split, max_features, max_depth):
val = cross_val_score(
RandomForestClassifier(n_estimators=int(n_estimators),
min_samples_split=int(min_samples_split),
max_features=min(max_features, 0.999), # float
max_depth=int(max_depth),
random_state=2
),
x, y, 'roc_auc', cv=5
).mean()
return val
然后我们就可以实例化一个bayes优化对象了:
rf_bo = BayesianOptimization(
rf_cv,
{
'n_estimators': (10, 250),
'min_samples_split': (2, 25),
'max_features': (0.1, 0.999),
'max_depth': (