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()
我们试图通过改变超参数$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$的解非常接近。