from ConfigSpace import Configuration#
Description#
from smac import HyperparameterOptimizationFacade, Scenario from smac.runhistory.dataclasses import TrialValue, TrialInfo
from ConfigSpace import Configuration, ConfigurationSpace, Float
from smac import HyperparameterOptimizationFacade, Scenario from smac.runhistory.dataclasses import TrialValue
copyright = "Copyright 2021, AutoML.org Freiburg-Hannover" license = "3-clause BSD"
class Rosenbrock2D: @property def configspace(self) -> ConfigurationSpace: cs = ConfigurationSpace(seed=0) x0 = Float("x0", (-5, 10), default=-3) x1 = Float("x1", (-5, 10), default=-4) cs.add_hyperparameters([x0, x1])
return cs
def train(self, config: Configuration, seed: int = 0) -> float:
"""The 2-dimensional Rosenbrock function as a toy model.
The Rosenbrock function is well know in the optimization community and
often serves as a toy problem. It can be defined for arbitrary
dimensions. The minimium is always at x_i = 1 with a function value of
zero. All input parameters are continuous. The search domain for
all x's is the interval [-5, 10].
"""
x1 = config["x0"]
x2 = config["x1"]
cost = 100.0 * (x2 - x1 ** 2.0) ** 2.0 + (1 - x1) ** 2.0
return cost
model = Rosenbrock2D()
Assuming model and Scenario have already been defined#
scenario = Scenario(model.configspace, deterministic=False, n_trials=100) intensifier = HyperparameterOptimizationFacade.get_intensifier(scenario, max_config_calls=1)
we probably will want to adjust the initial design (we can also set the n_configs to zero)#
n_original_initial_design = 20 n_warmstarted = 2 n_init_design = n_original_initial_design - n_warmstarted if n_original_initial_design > n_warmstarted else 0
initial_design = HyperparameterOptimizationFacade.get_initial_design( scenario, n_configs=n_init_design, additional_configs=[], # here we could also specify hps to be evaluated during the # initial design. )
smac = HyperparameterOptimizationFacade( scenario, model.train, intensifier=intensifier, initial_design=initial_design, overwrite=True, )
Example trial infos and values; Configuration will take care of parameter validation#
trial_infos = [ TrialInfo(config=Configuration(model.configspace, {'x0': 1, 'x1': 2}), instance='instance1', seed=1), TrialInfo(config=Configuration(model.configspace, {'x0': -1, 'x1': 3}), instance='instance2', seed=2), ]
trial_values = [ TrialValue(cost=0.5, time=0.1), TrialValue(cost=0.3, time=0.2), ]
Warmstart SMAC with the trial information and values#
for info, value in zip(trial_infos, trial_values): smac.tell(info, value)
continue as usual:#
smac.optimize()
if n_original_initial_design > n_warmstarted: # verify that we have the right number of initial design configurations. assert sum([c.origin == 'Initial Design: Sobol' for c in smac.runhistory.get_configs()]) == n_original_initial_design - n_warmstarted else: # if we have no initial design, we should not have any configurations from it in the runhistory assert sum([c.origin == 'Initial Design: Sobol' for c in smac.runhistory.get_configs()]) == 0
assert len([c for c in smac.runhistory.get_configs() if c.origin == 'Custom']) == n_warmstarted
print()