超参优化工具总结——Hyperopt
Posted mishidemudong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超参优化工具总结——Hyperopt相关的知识,希望对你有一定的参考价值。
Homepage:https://github.com/hyperopt
特性:Hyperopt是一个sklearn的Python库,在搜索空间上进行串行和并行优化,搜索空间可以是实值,离散和条件维度(real-valued, discrete, and conditional dimensions.)。它支持跨多台机器的并行化,并使用 MongoDb 作为存储超参数组合结果的中心数据库。
使用方法及配置
使用方法:
#定义目标函数
def objective(args):
case, val = args
if case == 'case 1':
return val
else:
return val ** 2
#定义搜索空间
from hyperopt import hp
space = hp.choice('a',
[
('case 1', 1 + hp.lognormal('c1', 0, 1)),
('case 2', hp.uniform('c2', -10, 10))
])
#取得最优参数
from hyperopt import fmin, tpe
best = fmin(objective, space, algo=tpe.suggest, max_evals=100)
#打印输出
print best
# -> {'a': 1, 'c2': 0.01420615366247227}
print hyperopt.space_eval(space, best)
# -> ('case 2', 0.01420615366247227}
支持系统:linux
优化库基于: hyperopt-sklearn和hyperas, 这两个用于模型选择和优化的函数库分别建立在scikit-learn和keras的基础上
适用范围:Machine Learning
并行计算:Using mongodb
搜索空间定义
https://github.com/hyperopt/hyperopt/wiki/FMin#2-defining-a-search-space
from hyperopt import hp
space = hp.choice('a',
[
('case 1', 1 + hp.lognormal('c1', 0, 1)),
('case 2', hp.uniform('c2', -10, 10))
])
- 'a' - 可选类别
- 'c1' - 'case 1'中正参数
- 'c2' - 'case 2'中给定边界的实值参数
- 参数表达式
from hyperopt import hp
space = hp.choice('classifier_type', [
{
'type': 'naive_bayes',
},
{
'type': 'svm',
'C': hp.lognormal('svm_C', 0, 1),
'kernel': hp.choice('svm_kernel', [
{'ktype': 'linear'},
{'ktype': 'RBF', 'width': hp.lognormal('svm_rbf_width', 0, 1)},
]),
},
{
'type': 'dtree',
'criterion': hp.choice('dtree_criterion', ['gini', 'entropy']),
'max_depth': hp.choice('dtree_max_depth',
[None, hp.qlognormal('dtree_max_depth_int', 3, 1, 1)]),
'min_samples_split': hp.qlognormal('dtree_min_samples_split', 2, 1, 1),
},
])
基于pyII加入非统计表达式(Adding Non-Stochastic Expressions with pyll)
优化算法
- 随机搜索
- Tree of Parzen Estimators(TPE)
- Adaptive TPE
输出示例
print(estim.best_model()) //输出最优的模型
# {'learner': ExtraTreesClassifier(bootstrap=True, class_weight=None, criterion='entropy',
# max_depth=None, max_features=0.959202875857,
# max_leaf_nodes=None, min_impurity_decrease=0.0,
# min_impurity_split=None, min_samples_leaf=1,
# min_samples_split=2, min_weight_fraction_leaf=0.0,
# n_estimators=20, n_jobs=1, oob_score=False, random_state=3,
# verbose=False, warm_start=False), 'preprocs': (), 'ex_preprocs': ()}"
以上是关于超参优化工具总结——Hyperopt的主要内容,如果未能解决你的问题,请参考以下文章
如何保存最佳 hyperopt 优化的 keras 模型及其权重?
如何将 KerasClassifier、Hyperopt 和 Sklearn 交叉验证放在一起
机器学习调参与贝叶斯优化及其典型python实现hyperopt
如何使用 hyperopt 对 Keras 深度学习网络进行超参数优化?