我正在尝试使用Optuna来调整我的模型的超参数。
我卡在一个地方,想定义一个具有对数正态/正态分布的搜索空间。在hyperopt
中可以使用hp.lognormal
实现这一点。是否有可能使用Optuna
现有的suggest_
API组合来定义这样的空间?
回答:
你可以考虑使用suggest_float(..., 0, 1)
(即U(0, 1))的逆变换,因为目前Optuna没有直接提供这两种分布的suggest_
变体。这个示例可能是一个起点 https://gist.github.com/hvy/4ef02ee2945fe50718c71953e1d6381d请查看下面的代码
import matplotlib.pyplot as pltimport numpy as npfrom scipy.stats import normfrom scipy.special import erfcinvimport optunadef objective(trial): # 使用Optuna从U(0, 1)中建议。 x = trial.suggest_float("x", 0, 1) # 逆变换到正态分布。 y0 = norm.ppf(x, loc=0, scale=1) # 逆变换到对数正态分布。 y1 = np.exp(-np.sqrt(2) * erfcinv(2 * x)) return y0, y1if __name__ == "__main__": n_objectives = 2 # 正态和对数正态。 study = optuna.create_study( sampler=optuna.samplers.RandomSampler(), # 可以是"maximize"。对于此演示无关紧要。 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()