def _save_model(self, out_fn: str, scenario: ASlibScenario, feature_pre_pipeline: list, pre_solver: Aspeed, selector, config: Configuration): ''' save all pipeline objects for predictions Arguments --------- out_fn: str filename of output file scenario: AslibScenario ASlib scenario with all the data feature_pre_pipeline: list list of preprocessing objects pre_solver: Aspeed aspeed object with pre-solving schedule selector: autofolio.selector.* fitted selector object config: Configuration parameter setting configuration ''' scenario.logger = None for fpp in feature_pre_pipeline: fpp.logger = None if pre_solver: pre_solver.logger = None selector.logger = None model = [scenario, feature_pre_pipeline, pre_solver, selector, config] with open(out_fn, "bw") as fp: pickle.dump(model, fp)
def predict(self, scenario: ASlibScenario, config: Configuration, feature_pre_pipeline: list, pre_solver: Aspeed, selector): ''' predicts algorithm schedules wrt a given config and given pipelines Arguments --------- scenario: aslib_scenario.aslib_scenario.ASlibScenario aslib scenario at hand config: Configuration parameter configuration feature_pre_pipeline: list list of fitted feature preprocessors pre_solver: Aspeed pre solver object with a saved static schedule selector: autofolio.selector.* fitted selector object ''' self.logger.info("Predict on Test") for f_pre in feature_pre_pipeline: scenario = f_pre.transform(scenario) if pre_solver: pre_solving_schedule = pre_solver.predict(scenario=scenario) else: pre_solving_schedule = {} pred_schedules = selector.predict(scenario=scenario) # combine schedules if pre_solving_schedule: return dict((inst, pre_solving_schedule.get(inst, []) + schedule) for inst, schedule in pred_schedules.items()) else: return pred_schedules
def predict(self, scenario: ASlibScenario, config: Configuration, feature_pre_pipeline: list, pre_solver: Aspeed, selector): ''' predicts algorithm schedules wrt a given config and given pipelines Arguments --------- scenario: autofolio.data.aslib_scenario.ASlibScenario aslib scenario at hand config: Configuration parameter configuration feature_pre_pipeline: list list of fitted feature preprocessors pre_solver: Aspeed pre solver object with a saved static schedule selector: autofolio.selector.* fitted selector object ''' self.logger.info("Predict on Test") for f_pre in feature_pre_pipeline: scenario = f_pre.transform(scenario) if pre_solver: pre_solving_schedule = pre_solver.predict(scenario=scenario) else: pre_solving_schedule = {} pred_schedules = selector.predict(scenario=scenario) # combine schedules if pre_solving_schedule: return dict((inst, pre_solving_schedule.get(inst, []) + schedule) for inst, schedule in pred_schedules.items()) else: return pred_schedules
def get_cs(self, scenario: ASlibScenario): ''' returns the parameter configuration space of AutoFolio (based on the automl config space: https://github.com/automl/ConfigSpace) Arguments --------- scenario: aslib_scenario.aslib_scenario.ASlibScenario aslib scenario at hand ''' self.cs = ConfigurationSpace() # add feature steps as binary parameters for fs in scenario.feature_steps: fs_param = CategoricalHyperparameter(name="fgroup_%s" % ( fs), choices=[True, False], default=fs in scenario.feature_steps_default) self.cs.add_hyperparameter(fs_param) # preprocessing PCAWrapper.add_params(self.cs) ImputerWrapper.add_params(self.cs) StandardScalerWrapper.add_params(self.cs) # Pre-Solving if scenario.performance_type[0] == "runtime": Aspeed.add_params( cs=self.cs, cutoff=scenario.algorithm_cutoff_time) # classifiers RandomForest.add_params(self.cs) XGBoost.add_params(self.cs) # regressors RandomForestRegressor.add_params(self.cs) # selectors PairwiseClassifier.add_params(self.cs) PairwiseRegression.add_params(self.cs) self.logger.debug(self.cs) return self.cs
def fit_pre_solving(self, scenario: ASlibScenario, config: Configuration): ''' fits an pre-solving schedule using Aspeed [Hoos et al, 2015 TPLP) Arguments --------- scenario: aslib_scenario.aslib_scenario.ASlibScenario aslib scenario at hand config: Configuration parameter configuration to use for preprocessing Returns ------- instance of Aspeed() with a fitted pre-solving schedule if performance_type of scenario is runtime; else None ''' if scenario.performance_type[0] == "runtime": aspeed = Aspeed() aspeed.fit(scenario=scenario, config=config) return aspeed else: return None
def fit_pre_solving(self, scenario: ASlibScenario, config: Configuration): ''' fits an pre-solving schedule using Aspeed [Hoos et al, 2015 TPLP) Arguments --------- scenario: autofolio.data.aslib_scenario.ASlibScenario aslib scenario at hand config: Configuration parameter configuration to use for preprocessing Returns ------- instance of Aspeed() with a fitted pre-solving schedule if performance_type of scenario is runtime; else None ''' if scenario.performance_type[0] == "runtime": aspeed = Aspeed() aspeed.fit(scenario=scenario, config=config) return aspeed else: return None
def get_cs(self, scenario: ASlibScenario): ''' returns the parameter configuration space of AutoFolio (based on the automl config space: https://github.com/automl/ConfigSpace) Arguments --------- scenario: autofolio.data.aslib_scenario.ASlibScenario aslib scenario at hand ''' self.cs = ConfigurationSpace() # add feature steps as binary parameters for fs in scenario.feature_steps: fs_param = CategoricalHyperparameter(name="fgroup_%s" % ( fs), choices=[True, False], default=fs in scenario.feature_steps_default) self.cs.add_hyperparameter(fs_param) # preprocessing PCAWrapper.add_params(self.cs) ImputerWrapper.add_params(self.cs) StandardScalerWrapper.add_params(self.cs) # Pre-Solving if scenario.performance_type[0] == "runtime": Aspeed.add_params( cs=self.cs, cutoff=scenario.algorithm_cutoff_time) # classifiers RandomForest.add_params(self.cs) # selectors PairwiseClassifier.add_params(self.cs) return self.cs
def get_cs(self, scenario: ASlibScenario, autofolio_config:dict=None): ''' returns the parameter configuration space of AutoFolio (based on the automl config space: https://github.com/automl/ConfigSpace) Arguments --------- scenario: aslib_scenario.aslib_scenario.ASlibScenario aslib scenario at hand autofolio_config: dict, or None An optional dictionary of configuration options ''' self.cs = ConfigurationSpace() # only allow the feature groups specified in the config file # by default, though, all of the feature groups are allowed. allowed_feature_groups = autofolio_config.get("allowed_feature_groups", scenario.feature_steps) if len(allowed_feature_groups) == 0: msg = "Please ensure at least one feature group is allowed" raise ValueError(msg) if len(allowed_feature_groups) == 1: choices = [True] # if we only have one feature group, it has to be active else: choices = [True, False] default = True for fs in allowed_feature_groups: fs_param = CategoricalHyperparameter(name="fgroup_%s" % (fs), choices=choices, default_value=default) self.cs.add_hyperparameter(fs_param) # preprocessing if autofolio_config.get("pca", True): PCAWrapper.add_params(self.cs) if autofolio_config.get("impute", True): ImputerWrapper.add_params(self.cs) if autofolio_config.get("scale", True): StandardScalerWrapper.add_params(self.cs) # Pre-Solving if scenario.performance_type[0] == "runtime": if autofolio_config.get("presolve", True): Aspeed.add_params( cs=self.cs, cutoff=scenario.algorithm_cutoff_time) if autofolio_config.get("classifier"): # fix parameter cls_choices = [autofolio_config["classifier"]] cls_def = autofolio_config["classifier"] else: cls_choices = ["RandomForest","XGBoost"] cls_def = "RandomForest" classifier = CategoricalHyperparameter( "classifier", choices=cls_choices, default_value=cls_def) self.cs.add_hyperparameter(classifier) RandomForest.add_params(self.cs) XGBoost.add_params(self.cs) if autofolio_config.get("regressor"): # fix parameter reg_choices = [autofolio_config["regressor"]] reg_def = autofolio_config["regressor"] else: reg_choices = ["RandomForestRegressor"] reg_def = "RandomForestRegressor" regressor = CategoricalHyperparameter( "regressor", choices=reg_choices, default_value=reg_def) self.cs.add_hyperparameter(regressor) RandomForestRegressor.add_params(self.cs) # selectors if autofolio_config.get("selector"): # fix parameter sel_choices = [autofolio_config["selector"]] sel_def = autofolio_config["selector"] else: sel_choices = ["PairwiseClassifier","PairwiseRegressor"] sel_def = "PairwiseClassifier" selector = CategoricalHyperparameter( "selector", choices=sel_choices, default_value=sel_def) self.cs.add_hyperparameter(selector) PairwiseClassifier.add_params(self.cs) PairwiseRegression.add_params(self.cs) self.logger.debug(self.cs) return self.cs