贝叶斯优化 (BayesianOptimization)

1 问题提出

神经网咯是有许多超参数决定的,例如网络深度,学习率,正则等等。如何寻找最好的超参数组合,是一个老人靠经验,新人靠运气的任务。

穷举搜索 Grid Search 效率太低;随机搜索比穷举搜索好一点;目前比较好的解决方案是贝叶斯优化

1.1 贝叶斯优化的优点

  • 贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息
  • 贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸
  • 贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部优最

2 详细算法

这个博客写的不错,但是需要一定的数学基础

3 python实现

3.1 贝叶斯初步优化

这里本来想用kaggle的lgb贝叶斯优化,但是对新手不太友好,就使用这个博客中的例子

  1. 安装
pip install bayesian-optimization
  1. 准备工作(使用随机森林作为模型进行参数优化)
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)

sklearn.cross_validation 已经废弃,改为:sklearn.model_selection

不调参数的结果:

rf = RandomForestClassifier()
print(np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc'))) >>> 0.965162
  1. 贝叶斯优化

    先要定义一个目标函数。比如此时,函数输入为随机森林的所有参数,输出为模型交叉验证5次的AUC均值,作为我们的目标函数。因为bayes_opt库只支持最大值,所以最后的输出如果是越小越好,那么需要在前面加上负号,以转为最大值。
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, scoring='roc_auc', cv=5
).mean()
return val

建立贝叶斯优化对象

 rf_bo = BayesianOptimization(
rf_cv,
{'n_estimators': (10, 250),
'min_samples_split': (2, 25),
'max_features': (0.1, 0.999),
'max_depth': (5, 15)}
)

里面的第一个参数是我们的优化目标函数,第二个参数是我们所需要输入的超参数名称,以及其范围。超参数名称必须和目标函数的输入名称一一对应。

开始优化:

rf_bo.maximize()

优化结果:

|   iter    |  target   | max_depth | max_fe... | min_sa... | n_esti... |
-------------------------------------------------------------------------
| 1 | 0.9758 | 7.261 | 0.7852 | 17.35 | 231.3 |
| 2 | 0.9725 | 9.361 | 0.1805 | 12.82 | 185.7 |
| 3 | 0.9761 | 6.576 | 0.6609 | 15.19 | 12.12 |
| 4 | 0.9711 | 6.679 | 0.1358 | 10.07 | 223.1 |
| 5 | 0.9768 | 7.614 | 0.563 | 12.94 | 247.5 |
| 6 | 0.9744 | 14.74 | 0.7134 | 24.53 | 245.1 |
| 7 | 0.953 | 5.275 | 0.1552 | 24.75 | 10.72 |
| 8 | 0.9748 | 5.318 | 0.8218 | 2.634 | 77.82 |
| 9 | 0.9607 | 15.0 | 0.999 | 2.0 | 10.0 |
| 10 | 0.9654 | 5.007 | 0.2314 | 2.315 | 10.24 |
| 11 | 0.9701 | 14.89 | 0.976 | 24.45 | 118.8 |
| 12 | 0.9743 | 14.98 | 0.6535 | 23.94 | 53.86 |
| 13 | 0.972 | 14.09 | 0.7797 | 2.199 | 142.2 |
| 14 | 0.9722 | 14.88 | 0.8909 | 9.471 | 64.05 |
| 15 | 0.976 | 5.195 | 0.8093 | 24.1 | 145.6 |
| 16 | 0.9715 | 5.136 | 0.9308 | 4.38 | 35.74 |
| 17 | 0.9747 | 5.195 | 0.9876 | 24.68 | 78.97 |
| 18 | 0.9747 | 5.249 | 0.9799 | 24.72 | 248.5 |
| 19 | 0.9745 | 5.235 | 0.8297 | 4.737 | 120.6 |
| 20 | 0.9711 | 14.88 | 0.9794 | 23.83 | 179.4 |
| 21 | 0.9739 | 5.495 | 0.9039 | 2.218 | 161.8 |
| 22 | 0.9757 | 8.063 | 0.2147 | 13.45 | 247.3 |
| 23 | 0.9723 | 14.59 | 0.8999 | 2.442 | 249.0 |
| 24 | 0.9741 | 5.035 | 0.8009 | 13.7 | 56.69 |
| 25 | 0.9701 | 13.11 | 0.9747 | 12.36 | 93.52 |
| 26 | 0.9744 | 5.083 | 0.9857 | 24.38 | 205.5 |
| 27 | 0.9741 | 14.99 | 0.7923 | 17.87 | 30.14 |
| 28 | 0.9738 | 5.038 | 0.973 | 13.42 | 142.2 |
| 29 | 0.9724 | 14.81 | 0.7962 | 2.028 | 187.0 |
| 30 | 0.9734 | 5.378 | 0.9614 | 14.71 | 24.68 |
=========================================================================

寻找最大值:

rf_bo.res["max"]

但是我使用这个就会报错,所以就简单写了一个循环寻找最大值的索引:

index = []
for i in rf_bo.res:
index.append(i['target'])
max_index = index.index(max(index))

3.2 贝叶斯进阶优化

上面bayes算法得到的参数并不一定最优,当然我们会遇到一种情况,就是我们已经知道有一组或是几组参数是非常好的了,我们想知道其附近有没有更好的。这个操作相当于上文bayes优化中的Explore操作,而bayes_opt库给了我们实现此方法的函数:

rf_bo.explore(
{'n_estimators': [10, 100, 200],
'min_samples_split': [2, 10, 20],
'max_features': [0.1, 0.5, 0.9],
'max_depth': [5, 10, 15]
}
)

这里我们添加了三组较优的超参数,让其在该参数基础上进行explore,可能会得到更好的结果。

同时,我们还可以修改高斯过程的参数,高斯过程主要参数是核函数(kernel),还有其他参数可以参考sklearn.gaussianprocess:

gp_param={'kernel':None}
rf_bo.maximize(**gp_param)

如果kernel是None,1.0 * RBF(1.0)被用来当成默认的kernel。

但是从某种角度上来说,贝叶斯优化也是另外一种瞎猜。。。

贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现的更多相关文章

  1. 贝叶斯优化 Bayesian Optimization

    贝叶斯优化 Bayesian Optimization 2018年07月02日 22:28:06 余生最年轻 阅读数 4821更多 分类专栏: 机器学习   版权声明:本文为博主原创文章,遵循CC 4 ...

  2. 贝叶斯优化(Bayesian Optimization)深入理解

    目前在研究Automated Machine Learning,其中有一个子领域是实现网络超参数自动化搜索,而常见的搜索方法有Grid Search.Random Search以及贝叶斯优化搜索.前两 ...

  3. 转载:Docker入门只需看这一篇就够了

    最近项目中需要用到 Docker 打包,于是上网查找资料学习了 Docker 的基本命令,记录一下自己遇到的一些错误. 准备开始自己写,结果看到了阮一峰老师的文章,瞬间就没有写下去的动力了,转载大佬的 ...

  4. Kappa(cappa)系数只需要看这一篇就够了,算法到python实现

    1 定义 百度百科的定义: 它是通过把所有地表真实分类中的像元总数(N)乘以混淆矩阵对角线(Xkk)的和,再减去某一类地表真实像元总数与被误分成该类像元总数之积对所有类别求和的结果,再除以总像元数的平 ...

  5. JVM内存模型你只要看这一篇就够了

    JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...

  6. DeepMind提出新型超参数最优化方法:性能超越手动调参和贝叶斯优化

    DeepMind提出新型超参数最优化方法:性能超越手动调参和贝叶斯优化 2017年11月29日 06:40:37 机器之心V 阅读数 2183   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  7. 基于贝叶斯优化的超参数tuning

    https://arimo.com/data-science/2016/bayesian-optimization-hyperparameter-tuning/ 贝叶斯优化:使用高斯过程作为代理函数, ...

  8. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  9. [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...

随机推荐

  1. Jenkins(3)- 安装Jenkins过程中遇到问题的排查思路

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 安装Jenkins过程中,可能会遇 ...

  2. 关于php抑错方法

    在循环里,如果@不能用的话,就使用try catch,是可以的

  3. QtConcurrent::run() 只能运行参数个数不超过5的函数

    有时不得不看源码 qtconcurrentrun.h template <typename T, typename Param1, typename Arg1, typename Param2, ...

  4. 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约

    文章目录 安装IBM Blockchain Platform extension for VS Code 创建一个智能合约项目 理解智能合约 打包智能合约 Local Fabric Ops 安装智能合 ...

  5. Linux网络服务第五章NFS共享服务

    1.笔记 NFS一般用在局域网中,网络文件系统c/s格式 服务端s:设置一个共享目录 客户端c:挂载使用这个共享目录 rpc:111远程过程调用机制 Showmount -e:查看共享目录信息 def ...

  6. 【ubuntu】windows+ubuntu 设置windows为第一启动项

    进入ubuntu系统 sudo su vim /etc/default/grub 更改GRUB_DEFAULT=后的值默认是0,如果你的windows启动项在第5个就改成4.改完之后退出保存输入 up ...

  7. OpenRASP管理后台安装记录

    OpenRASP项目地址https://rasp.baidu.com/ 一.安装java 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令java -version查看 ...

  8. JAVA连接Excel最好用的开源项目EasyExcel,官方使用文档及.jar包下载

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.com/alibaba ...

  9. STL部分学习总结

    一.map/multimap map/multimap映射容器的元素数据是由一个Key和一个Value成的,key与映照value之间具有一一映照的关系. map/multimap容器的数据结构也采用 ...

  10. .NET Core 反编译dll源码查看

    一.可以通过JetBrains dotPeek进行反编译 二.可以通过.NET Reflector和VS自带的反编译工具查看