注:转载请注明出处。
本篇文章主要记录了贝叶斯优化算法hyperopt的学习笔记,如果想看自动化调参中的网格调参和遗传优化算法TPOT,请查看我另外两篇文章:网格搜索gridSearchCV和遗传优化算法TPOT。
1、算法思想
贝叶斯优化算法与网格搜索和随机搜索完全不同,会充分利用之前测试点的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数想全局最优提升的参数。
2、具体步骤
- 首先根据先验分布,假设一个搜索函数。
- 然后每次使用新的测试点来测试目标函数时,利用这个信息来更新目标函数的先验分布。
- 最后,算法测试由后验分布给出的全局最值可能出现的位置的点。
3、缺陷与弥补
缺陷:一旦找到一个局部最优,会在该区域不断地采样,很容易陷入局部最优值。
弥补方式:在探索和利用之间找到一个平衡点。“探索”就是在还未取样的区域获取采样点;利用是在根据后验分布在最可能出现全局最值的区域进行采样。
4、具体实现-python库 hyperopt
1. 功能
- 可以针对某个模型进行调优。
- 可以同时调整多个模型的超参,并取得全局最优模型。–棒棒棒!!
2. hyperopt 参数简介
- 需导入模块:hyperopt
- 调用方法和主要参数
1 | from hyperopt import fmin, tpe, hp |
- fmin:作用就是在有限的迭代次数下,求使目标函数fn取得最小值的超参数(超参数的阈值在space中),在space中搜索超参数的方法使由algo进行指定。
- fn :目标函数当不是求最小值时,需要转化为求最小值。
- space:超参数的阈值空间。
- algo:超参数搜索算法
- max_evals: 最大迭代次数
- 输出历史结果,甚至进行可视化:trails matplotlib.pyplot
1 | from hyperopt import STATUS_OK,Trials |
输出图片结果:由图片可以看出最初算法从整个范围中均匀地选择值,但随着时间的推移以及参数对目标函数的影响了解越来越多,该算法越来越聚焦于它认为会取得最大收益的区域-一个接近0的范围。它仍然探索整个解空间,但频率有所下降。

1 | # 目标函数随时间t的变化 |
输出图片结果:可以看出目标函数逐渐趋向最小值0.

目标函数与x的变化
1 | import matplotlib.pyplot as plt |
输出图片结果:可以看出在y取最小值处,点比较密集。

- 功能2:
1 | digits = datasets.load_digits() |
5、参考
- 详细资料: https://www.jianshu.com/p/35eed1567463
- 书籍《百面机器学习》