jijzepttools.blackbox_optimization.utils.to_optuna_distribution#
Functions#
|
BlackboxProblemの変数をOptunaの分布に変換する関数 |
Module Contents#
- bb_problem_to_optuna_distribution(problem: jijzepttools.blackbox_optimization.problem.BlackboxProblem) dict[str, optuna.distributions.BaseDistribution]#
BlackboxProblemの変数をOptunaの分布に変換する関数
Note
ommxインスタンスからの変換のほうがbbo_ommx.pyのコードとの相性はいいが、BlackBoxProblemからの変換としている。 理由は * カテゴリカル変数の情報がBlackBoxProblemの方が使いやすい形で保持しているから(ommxだとバイナリ変数 + onehot制約になってしまっている)
- Parameters:
problem – BlackboxProblemのインスタンス
- Returns:
変数名をキー、Optunaの分布を値とする辞書
- Return type:
dict[str, optuna.distributions.BaseDistribution]
Example
optuna TPESamplerで解く例。以下は所与とする。 ``` import optuna from optuna.samplers import TPESampler from jijzepttools.blackbox_optimization.utils.to_optuna_distribution import bb_problem_to_optuna_distribution
- def sense_to_optuna_direction(sense: jm.ProblemSense) -> str:
- if sense == jm.ProblemSense.MINIMIZE:
return “minimize”
- elif sense == jm.ProblemSense.MAXIMIZE:
return “maximize”
- else:
raise ValueError(f”Unsupported problem sense: {sense}”)
sampler = TPESampler(seed=seed, multivariate=True)
distribution = bb_problem_to_optuna_distribution(bb_model)
- study = optuna.create_study(
study_name=”jztools_optuna_study”, sampler=sampler, direction=sense_to_optuna_direction(bb_problem.sense)
)
- for x_init, y_init in zip(dataset[0], dataset[1]):
- trial = optuna.trial.create_trial(
params=x_init, distributions=distribution, value=float(y_init[“obj1”]), state=optuna.trial.TrialState.COMPLETE,
) study.add_trial(trial)
- for _ in range(n_iter):
trial = study.ask(fixed_distributions=distribution) value = float(blackbox_func(trial.params)[“y”]) study.tell(trial, value)