贝叶斯优化 (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. c++中set 的用法

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  2. beetl 模板语法

    如何定义临时变量 @var tmp = false; 如何给临时变量赋值 @tmp = true; 如何在判断中使用临时变量 @if(tmp){ ... @} 如何使用条件语句 if else @if ...

  3. Linux系统curl获取公网ip

    收集了几个查询当前公网ip的网址,可以通过curl命令方便的查看 curl cip.cc curl ipinfo.io curl myip.ipip.net curl http://members.3 ...

  4. tcpdump常用抓包命令

    主要语法 过滤主机/IP: tcpdump -i eth1 host 172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据   过滤端口: tcpdump -i ...

  5. Oracle把表记录恢复到指定时间节点

    可以执行以下命令alter table 表名 enable row movement; --开启表行移动flashback table 表名 to timestamp to_timestamp('20 ...

  6. vue2.x学习笔记(二十六)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12682137.html. 单文件组件 介绍 在很多的vue项目中,我们都是使用[Vue.component]来定义 ...

  7. var、let、const

    var.let.const之间的区别和使用 1.var声明变量可以重复声明,而let不可以重复声明 let a = 1; let a = 2; var b = 3; var b = 4; a // I ...

  8. 团队一致性的PHP开发环境之Docker

    docker php环境模型 docker 简介 Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现 ...

  9. 运用shell脚本 执行sftp,ftp命令

    sftp文件上传(从本地上传到远程) #!/bin/bash #远程上传文件测试 if [ $# -ne 2 ] then echo "miss arguments" echo & ...

  10. 【漏洞预警】SaltStack远程命令执行漏洞 /tmp/salt-minions

    前言:   2020年5月3日,阿里云应急响应中心监测到近日国外某安全团队披露了SaltStack存在认证绕过致命令执行漏洞以及目录遍历漏洞.在多个微信群和QQ群已经有群友反映中招,请马上修复. 以下 ...