01. 基础教程

在本教程中,您可以学习如何:

  • 定义搜索空间
  • 优化目标函数

本教程描述了如何在不了解HyperOpt中实现的任何算法的数学原理的情况下,使用HyperOpt优化超参数。

# 导入HyperOpt库
from hyperopt import tpe, hp, fmin

声明一个目标函数以进行优化。在本教程中,我们将优化一个名为objective的简单函数,它是一个简单的二次函数。

$$ y = (x-3)^2 + 2 $$

objective = lambda x: (x-3)**2 + 2

现在,让我们可视化这个目标函数。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 10, 100)
y = objective(x)

fig = plt.figure()
plt.plot(x, y)
plt.show()

png

我们试图通过改变超参数$x$来优化目标函数。这就是为什么我们将为$x$声明一个搜索空间。与搜索空间相关的函数在hyperopt.hp中实现。列表如下:

  • hp.randint(label, upper)hp.randint(label, low, high)
  • hp.uniform(label, low, high)
  • hp.loguniform(label, low, high)
  • hp.normal(label, mu, sigma)
  • hp.lognormal(label, mu, sigma)
  • hp.quniform(label, low, high, q)
  • hp.qloguniform(label, low, high, q)
  • hp.qnormal(label, mu, sigma, q)
  • hp.qlognormal(label, mu, sigma, q)
  • hp.choice(label, list)
  • hp.pchoice(label, p_list) 其中 p_list 是一个 (概率, 选项) 对的列表
  • hp.uniformint(label, low, high, q)hp.uniformint(label, low, high) 因为 q = 1.0

在本教程中,我们将使用最基本的hp.uniform

# 定义x在-10到10之间的搜索空间。
space = hp.uniform('x', -10, 10)

现在,只剩下最后一步了。到目前为止,我们已经定义了一个目标函数,并且为$x$定义了一个搜索空间。现在我们可以通过搜索空间$x$并找到可以优化目标函数的$x$值。HyperOpt使用fmin来执行此操作。

best = fmin(
    fn=objective, # 要优化的目标函数
    space=space, # 超参数的搜索空间
    algo=tpe.suggest, # 优化算法
    max_evals=1000 # 优化尝试的次数
)
print(best)
100%|██████████| 1000/1000 [00:04<00:00, 228.56trial/s, best loss: 2.000001036046408]
{'x': 3.0010178636491283}

HyperOpt找到的最优$x$值约为3.0。这与$y=(x-3)^2+2$的解非常接近。