02. 多参数教程
在本教程中,您将学习如何:
- 使用多个超参数优化目标函数
- 定义不同类型的搜索空间
# 导入HyperOpt库
from hyperopt import tpe, hp, fmin
import numpy as np
声明一个目标函数以进行优化。与上次不同,我们将使用两个超参数 $x$ 和 $y$ 来优化函数。
$$ z = sin\sqrt{x^2 + y^2} $$
def objective(params):
x, y = params['x'], params['y']
return np.sin(np.sqrt(x**2 + y**2))
与上次一样,让我们尝试可视化它。但与上次不同,这次有两个超参数,因此我们需要在3D空间中可视化它们。
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
x, y = np.meshgrid(x, y)
z = objective({'x': x, 'y': y})
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(x, y, z, cmap=cm.coolwarm)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
同样,让我们定义搜索空间。然而,这次你需要定义两个搜索空间($x, y$),所以你将它们分别放在 dict()
中。
space = {
'x': hp.uniform('x', -6, 6),
'y': hp.uniform('y', -6, 6)
}
完美!现在你可以完全按照在BasicTutorial中所做的那样做了!
best = fmin(
fn=objective, # 要优化的目标函数
space=space, # 超参数的搜索空间
algo=tpe.suggest, # 优化算法(代表性的TPE)
max_evals=1000 # 优化尝试的次数
)
print(best)
100%|██████████| 1000/1000 [00:07<00:00, 127.90trial/s, best loss: -0.9999976342002768]
{'x': 4.278018218372159, 'y': 1.97095757186186}
定义不同类型的搜索空间
hp.randint(label, upper)
在 [0, upper) 区间内搜索整数。hp.choice(label, list)
在列表中搜索元素。
def f(params):
x1, x2 = params['x1'], params['x2']
if x1 == 'james':
return -1 * x2
if x1 == 'max':
return 2 * x2
if x1 == 'wansoo':
return -3 * x2
search_space = {
'x1': hp.choice('x1', ['james', 'max', 'wansoo']),
'x2': hp.randint('x2', -5, 5)
}
best = fmin(
fn=f,
space=search_space,
algo=tpe.suggest,
max_evals=100
)
print(best)
100%|██████████| 100/100 [00:00<00:00, 396.61trial/s, best loss: -12.0]
{'x1': 2, 'x2': 4}