贝叶斯优化算法python实例_贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现...

贝叶斯优化 (BayesianOptimization)

1 问题提出

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

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

1.1 贝叶斯优化的优点贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息

贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸

贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部优最

贝叶斯优化 (BayesianOptimization)

1 问题提出

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

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

1.1 贝叶斯优化的优点贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参数信息

贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸

贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部优最

2 详细算法

这个博客写的不错,但是需要一定的数学基础贝叶斯优化(Bayesian Optimization)深入理解​www.cnblogs.com

3 python实现

这里本来想用kaggle的lgb贝叶斯优化,但是对新手不太友好,就使用这个博客中的例子。强大而精致的机器学习调参方法:贝叶斯优化 - 杨睿 - 博客园​www.cnblogs.com

不过后来我写了lightGBM的优化。安装

pip install bayesian-optimization

2. 准备工作(使用随机森林作为模型进行参数优化)

from sklearn.datasets import make_classification

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import cross_val_score

from bayes_opt import BayesianOptimization

# 产生随机分类数据集,10个特征, 2个类别

x, y = make_classification(n_samples=1000,n_features=10,n_classes=2)

不调参数的结果:

rf = RandomForestClassifier()

print(np.mean(cross_val_score(rf, x, y, cv=20, scoring='roc_auc')))

>>> 0.965162

3. 贝叶斯优化

先要定义一个目标函数。比如此时,函数输入为随机森林的所有参数,输出为模型交叉验证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.max

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

如何使用贝叶斯优化LGB可以看这个,差别不多啦:陈亦新:【竞赛代码模板1】:kFold与Stratified的区别+LGB+贝叶斯优化 (Python代码)​zhuanlan.zhihu.com

觉得本文有用的小伙伴,点个喜欢再走呗~微信公众号:【机器学习炼丹术】,也可以加作者好友交流:cyx645016617,记得备注【学校+姓名+方向】哦~强烈推荐 | “深度学习零基础视频教程”,“机器学习零基础视频教程”,"python零基础入门基础视频教程"等,公众号回复【视频教程】或者【白嫖】免费获取~

关注公众号,回复【下载】有免费的杂七杂八的机器学习相关的PDF学习资料,持续更新哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值