本文主要对 Hyperopt 和 Hyperopt-Sklearn 进行介绍
Hyperopt 为一个超参数优化的库,主要使用的是SMBO ( Sequential model-based optimization )系列算法,包括:random search, Tree-of-Parzen-Estimators (TPE) 等。
对于自动超参数优化系统来说,重要的就是给出 objective function 和 configuration space。
下面给出一个具体例子
from hyperopt import hp, fmin, rand
# objective function
def func(args):
x, y = args
return x**2 + y**2
# search / configuration space
# x 01区间均匀分布 y 均值0标准差1
space = [hp.uniform('x', 0, 1), hp.normal('y', 0, 1)]
# 优化
# 可以设置误差允许范围 优化时间 优化轮次等参数
best = fmin(q, space, algo=rand.suggest, loss_threshold=0.001)
对于 configuration space 的设置,在机器学习中,会出现 类别型变量 的超参数,以及 有的超参数在一定条件下才有效的情况,所以下面介绍一下这些情况怎么处理。
# 以sklearn的SVM为例
space = hp.choice('case', [{'kernel':'rbf', 'gamma': hp.uniform('gamma', 0.1, 10), 'C': hp.uniform('C', 0.1, 10)}, {'kernel':'linear', 'C': hp.uniform('C', 0.1, 10)}])
# 或者
C = hp.uniform('C', 0.1, 10)
space = hp.choice('case', [{'kernel':'rbf', 'gamma': hp.uniform('gamma', 0.1, 10), 'C': C}, {'kernel':'linear', 'C': C}])
有时候我们不只需要优化后的结果与最优解,我们同时需要知道寻找到最优解的过程,这时候只有fmin
无法达到目标,于是引入了Trials
类。
from hyperopt import hp, fmin, rand, Trials
def func(args):
x, y = args
return x**2 + y**2
space = [hp.uniform('x', 0, 1), hp.normal('y', 0, 1)]
trials = Trials()
best = fmin(q, space, algo=rand.suggest, loss_threshold=0.001, trials=trials)
# 优化过程信息
trials.trials
参考资料:《Hyperopt: A Python Library for Optimizing the Hyperparameters of Machine Learning Algorithms》