Optuna 中是否有任何等效的 hyperopts lognormal?
Is there any equivalent of hyperopts lognormal in Optuna?
我正在尝试使用 Optuna 对我的模型进行超参数调整。
我被困在一个地方,我想定义一个具有 lognormal/normal 分布的搜索 space。在 hyperopt
中使用 hp.lognormal
是可能的。是否可以使用 Optuna
的现有 suggest_
api 的组合来定义这样的 space?
您或许可以使用 suggest_float(..., 0, 1)
的逆变换(即 U(0, 1)),因为 Optuna 目前不直接为这两个分布提供 suggest_
变体。这个例子可能是一个起点 https://gist.github.com/hvy/4ef02ee2945fe50718c71953e1d6381d
请在下面找到代码
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
from scipy.special import erfcinv
import optuna
def objective(trial):
# Suggest from U(0, 1) with Optuna.
x = trial.suggest_float("x", 0, 1)
# Inverse transform into normal.
y0 = norm.ppf(x, loc=0, scale=1)
# Inverse transform into lognormal.
y1 = np.exp(-np.sqrt(2) * erfcinv(2 * x))
return y0, y1
if __name__ == "__main__":
n_objectives = 2 # Normal and lognormal.
study = optuna.create_study(
sampler=optuna.samplers.RandomSampler(),
# Could be "maximize". Does not matter for this demonstration.
directions=["minimize"] * n_objectives,
)
study.optimize(objective, n_trials=10000)
fig, axs = plt.subplots(n_objectives)
for i in range(n_objectives):
axs[i].hist(list(t.values[i] for t in study.trials), bins=100)
plt.show()
我正在尝试使用 Optuna 对我的模型进行超参数调整。
我被困在一个地方,我想定义一个具有 lognormal/normal 分布的搜索 space。在 hyperopt
中使用 hp.lognormal
是可能的。是否可以使用 Optuna
的现有 suggest_
api 的组合来定义这样的 space?
您或许可以使用 suggest_float(..., 0, 1)
的逆变换(即 U(0, 1)),因为 Optuna 目前不直接为这两个分布提供 suggest_
变体。这个例子可能是一个起点 https://gist.github.com/hvy/4ef02ee2945fe50718c71953e1d6381d
请在下面找到代码
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
from scipy.special import erfcinv
import optuna
def objective(trial):
# Suggest from U(0, 1) with Optuna.
x = trial.suggest_float("x", 0, 1)
# Inverse transform into normal.
y0 = norm.ppf(x, loc=0, scale=1)
# Inverse transform into lognormal.
y1 = np.exp(-np.sqrt(2) * erfcinv(2 * x))
return y0, y1
if __name__ == "__main__":
n_objectives = 2 # Normal and lognormal.
study = optuna.create_study(
sampler=optuna.samplers.RandomSampler(),
# Could be "maximize". Does not matter for this demonstration.
directions=["minimize"] * n_objectives,
)
study.optimize(objective, n_trials=10000)
fig, axs = plt.subplots(n_objectives)
for i in range(n_objectives):
axs[i].hist(list(t.values[i] for t in study.trials), bins=100)
plt.show()