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

贝叶斯优化 (BayesianOptimization)

1 问题提出

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

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

1.1 贝叶斯优化的优点

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


贝叶斯优化 (BayesianOptimization)

1 问题提出

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

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

1.1 贝叶斯优化的优点

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

2 详细算法

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

贝叶斯优化(Bayesian Optimization)深入理解​www.cnblogs.com
线材下料优化python算法_贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现..._第1张图片

3 python实现

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

强大而精致的机器学习调参方法:贝叶斯优化 - 杨睿 - 博客园​www.cnblogs.com
线材下料优化python算法_贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现..._第2张图片

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

  1. 安装
pip 

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

线材下料优化python算法_贝叶斯优化(Bayesian Optimization)只需要看这一篇就够了,算法到python实现..._第3张图片

觉得本文有用的小伙伴,点个喜欢再走呗~微信公众号:【机器学习炼丹术】,也可以加作者好友交流:cyx645016617,记得备注【学校+姓名+方向】哦~

  • 强烈推荐 | “深度学习零基础视频教程”,“机器学习零基础视频教程”,"python零基础入门基础视频教程"等,公众号回复【视频教程】或者【白嫖】免费获取~
  • 关注公众号,回复【下载】有免费的杂七杂八的机器学习相关的PDF学习资料,持续更新哦!

你可能感兴趣的:(线材下料优化python算法,线材优化python算法)