Hyperopt:Python 超参数优化工具
hyperopt/hyperopt 目前已获得 7,578 个 Star:
Hyperopt 是一款 Python 库,用于串行和并行超参数优化。它支持实数值、离散值和条件维度的复杂搜索空间。
对于机器学习从业者来说,调参是模型训练中的常规环节。手动尝试不同参数组合效率低,Grid Search 在参数空间增大时计算量呈指数级增长。Hyperopt 通过贝叶斯优化策略,用更少的评估次数找到较优参数组合。
目前 Hyperopt 实现了三种核心算法:
- Random Search:随机搜索基线方法
- Tree of Parzen Estimators (TPE):基于密度估计的序列优化算法,是默认推荐方案
- Adaptive TPE:TPE 的自适应改进版本
项目在设计上也预留了基于高斯过程和回归树的贝叶斯优化算法接口,只是当前版本尚未实现。
使用 Hyperopt 只需几行代码。先定义目标函数和搜索空间:
from hyperopt import hp, fmin, tpe, space_eval
# 定义目标函数
def objective(args):
case, val = args
if case == 'case 1':
return val
else:
return val ** 2
# 定义搜索空间
space = hp.choice('a', [
('case 1', 1 + hp.lognormal('c1', 0, 1)),
('case 2', hp.uniform('c2', -10, 10))
])
# 执行优化
best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
print(best)
fmin 是核心接口,接收目标函数、搜索空间、优化算法和最大评估次数四个参数,返回最优参数字典。space_eval 可将参数索引转换回原始空间中的实际值。
搜索空间的构建非常灵活。hp.choice 用于离散选择,hp.uniform 用于均匀分布的连续值,hp.lognormal 用于对数正态分布。这些基础组件可以嵌套组合,描述条件参数和层级结构。
并行化是 Hyperopt 的另一个设计重点。它支持两种分布式后端:
- Apache Spark:通过 SparkTrials 在 Spark 集群上分发评估任务
- MongoDB:通过 MongoTrials 将试验状态持久化到 MongoDB,支持多 worker 并行
安装直接从 PyPI 获取:
pip install hyperopt
项目还衍生出一系列配套工具。hyperopt-sklearn 将超参数优化与 scikit-learn 结合,自动搜索模型和参数组合。hyperas 为 Keras 模型提供类似的自动化调参能力。这些扩展降低了在具体框架中使用 Hyperopt 的门槛。
Hyperopt 的代码库持续维护,CI 流程通过 GitHub Actions 运行,pre-commit 钩子保证代码格式一致性。项目采用 Black 作为代码格式化工具,对贡献者友好。
如果你正在处理需要反复调参的机器学习项目,Hyperopt 的 TPE 算法和灵活的搜索空间定义可以帮你节省大量试错时间。