Module Handbook

Archive

class pbmohpo.archive.Archive(space: ConfigurationSpace)

Bases: object

property incumbents: List[Evaluation]

Get incumbents.

Returns list of incumbents, i.e. configurations with highest utility values.

Returns:

Evaluation with highest utility

Return type:

list[Evaluation]

property max_utility: float

Get current best utility value.

Returns:

highest utility value

Return type:

float

to_numpy(on_search_space: bool = True) → Tuple

Convert evaluated configurations and utility values to numpy arrays

Parameters:

on_search_space (bool) – Whether configurations are on the search space, i.e. respecting log transformations

Returns:

feature values x and utility values y

Return type:

tuple(x, y)

to_torch(on_search_space: bool = True) → Tuple

Convert evaluated configurations and targets to torch arrays

Parameters:

on_search_space (bool) – Whether configurations are on the search space, i.e. respecting log transformations

Returns:

feature values x and utility values y

Return type:

tuple(x, y)

class pbmohpo.archive.Evaluation(config: Configuration, objectives: dict, utility: float)

Bases: object

Result of one Tuning step.

Contains the data from one tuning iteration

Parameters:
  • config (CS.Configuration) – Evaluated configuration

  • objectives (Dict) – Dict of resulting objective values

  • utility (float) – Utility assigned by DM

config: Configuration
objectives: dict
utility: float

Benchmark

class pbmohpo.benchmark.Benchmark(problem: Problem, optimizer: Optimizer, dm: DecisionMaker, eval_budget: int, dm_budget: int, eval_batch_size: int = 1, dm_batch_size: int = 1)

Bases: object

Conduct a benchmark.

Run an optimizer with a decision maker and problem for a given budget.

Parameters:
  • problem (Problem) – Problem to be optimized

  • optimizer (Optimizer) – Used optimizer

  • dm (DecisionMaker) – Decision maker that evaluates objective values from problems

  • eval_budget (int) – Number of configurations that can be evaluated

  • dm_budget (int) – Number of comparisons the DM can make

  • eval_batch_size (int) – How many configurations to propose in one step

  • dm_batch_size (int) – How many comparisons does the DM in one step

run() → None

Run the benchmark.

Run the benchmark by conducting as many steps as given by the budget and populate the archive with the results

Problems

class pbmohpo.problems.problem.Problem(seed: RandomState | int | None = 42)

Bases: ABC

Definition of an Optimization Problem.

Implements the abstract interface to problems used as benchmarks.

Parameters:

seed (int, np.random.RandomState) – Seed passed to the problem

abstract get_config_space() → ConfigurationSpace

Defines the configuration space of the problem

Returns:

The configuration space of the problem

Return type:

ConfigSpace.ConfigurationSpace

abstract get_objective_names() → List

Get the names of the objectives.

Returns:

Names of objectives

Return type:

List

property n_objectives: int

Get number of objectives.

Returns:

Number of objectives

Return type:

int

class pbmohpo.problems.lgboml.LgbOpenML(task_id: int, seed: RandomState | int | None = 42)

Bases: Problem

LightGBM Tuning Problem.

Tune LightGBM for a multiclass classification Problem.

One call evaluates a cross-validation as defined in the OpenML task and computes the average accuracy per class.

Objectives are the accuracies of each class (representing different missclassification costs of a DM)

Parameters:
  • task_id (int) – OpenML task ID

  • seed (int, np.random.RandomState) – Seed passed to the problem

get_config_space() → ConfigurationSpace

Defines the tuning space for LightGBM

Number of iterations (1, 100, log), Learning rate (0.001, 0.3, log), Bagging fraction (0, 1), Feature fraction (0, 1)

Returns:

The configuration space of the problem

Return type:

ConfigSpace.ConfigurationSpace

get_objective_names() → List

Get the names of the objectives, i.e. names of classes

Returns:

Names of objectives

Return type:

List

class pbmohpo.problems.zdt1.ZDT1(seed: RandomState | int | None = 42, dimension: int = 2)

Bases: Problem

Synthetic Test Function ZDT1

Can be scaled to an arbitrary number of dimensions and has two objectives.

Since we are always maximizing we’re taking the negative function values.

Parameters:
  • seed (int, np.random.RandomState) – Seed passed to the problem

  • dimension (int) – Number of dimensions, needs to be at least 2.

get_config_space() → ConfigurationSpace

Defines the configuration space of the problem

Returns:

The configuration space of the problem

Return type:

ConfigSpace.ConfigurationSpace

get_objective_names() → List

Get the names of the objectives.

Returns:

Names of objectives

Return type:

List

objective_names = ['y0', 'y1']
class pbmohpo.problems.yahpo.YAHPO(id: str, instance: str, objective_names: List, fix_hps: dict | None = None, objective_scaling_factors: dict | None = None, seed: RandomState | int | None = 42)

Bases: Problem

YAHPO Gym Problem.

This class wraps YAHPO Gym (https://github.com/slds-lmu/yahpo_gym/).

Parameters:
  • id (str) – Benchmark class from YAHPO

  • instance (str) – Instance of benchmark

  • objective_names (List[str]) – Objectives to optimize

  • fix_hps (Dict) – Dictionary of fixed HPs that should not be optimized

  • objective_scaling_factors (Dict) – Dictionary with objective names as keys and factors to divide output. If not provided, no scaling is done.

  • seed (int, np.random.RandomState) – Seed passed to the problem

get_config_space() → ConfigurationSpace

Defines the configuration space of the problem

Returns:

The configuration space of the problem

Return type:

ConfigSpace.ConfigurationSpace

get_objective_names() → List

Get the names of the objectives.

Returns:

Names of objectives

Return type:

List

Optimizers

class pbmohpo.optimizers.optimizer.BayesianOptimization(config_space: ConfigurationSpace)

Bases: Optimizer

propose_config(archive: Archive, n: int = 1) → List[Configuration]

Propose a new configuration to evaluate.

Takes an archive of previous evaluations and duels and proposes n new configurations.

Parameters:
  • archive (Archive) – Archive containing previous evaluations

  • n (int) – Number of configurations to propose in one batch

Returns:

Proposed Configuration

Return type:

CS.Configuration

class pbmohpo.optimizers.optimizer.Optimizer(config_space: ConfigurationSpace)

Bases: ABC

Definition of an Optimizer

Implements the abstract interface to an Optimizer class.

Parameters:

config_space (CS.ConfigurationSpace) – The config space the optimizer searches over

abstract property dueling: bool
abstract propose_config(archive: Archive, n: int = 1) → List[Configuration]

Propose a new configuration to evaluate.

Takes an archive of previous evaluations and duels and proposes n new configurations.

Parameters:
  • archive (Archive) – Archive containing previous evaluations

  • n (int) – Number of configurations to propose in one batch

Returns:

Proposed Configuration

Return type:

CS.Configuration

abstract propose_duel(archive: Archive, n: int = 1) → List[Tuple[int, int]]

Propose a duel between two Evaluations

Takes an archive of previous evaluations and duels to propose n new duels of two configurations each.

Parameters:
  • archive (Archive) – Archive containing previous evaluations

  • n (int) – Number of duels to propose in one batch

Returns:

List of tuples of two indicies of Archive evaluations to compare

Return type:

List(Tuple(int, int))

class pbmohpo.optimizers.utility_bayesian_optimization.UtilityBayesianOptimization(config_space: ConfigurationSpace, initial_design_size: int | None = None)

Bases: BayesianOptimization

Single objective Bayesian optimization of utility scores.

Implements a simple BO loop to optimize the utility scores provided by the decision maker. Uses a GP surrogate and UCB acquisition function with beta=0.1.

Parameters:
  • config_space (CS.ConfigurationSpace) – The config space the optimizer searches over

  • initial_design_size (int, None) – Size of the initial design, if not specified, two times the number of HPs is used

property dueling: bool
propose_duel(archive: Archive, n: int = 1) → List[Tuple[int, int]]

Propose a duel between two Evaluations

Takes an archive of previous evaluations and duels to propose n new duels of two configurations each.

Parameters:
  • archive (Archive) – Archive containing previous evaluations

  • n (int) – Number of duels to propose in one batch

Returns:

List of tuples of two indicies of Archive evaluations to compare

Return type:

List(Tuple(int, int))

class pbmohpo.optimizers.eubo.EUBO(config_space: ConfigurationSpace, initial_design_size: int | None = None)

Bases: BayesianOptimization

Bayesian Optimization for Pairwise Comparison Data.

Implements the Analytic Expected Utility Of Best Option algrithm. For details see: https://botorch.org/tutorials/preference_bo

Parameters:
  • config_space (CS.ConfigurationSpace) – The config space the optimizer searches over

  • initial_design_size (int, None) – Size of the initial design, if not specified, two times the number of HPs is used

property dueling: bool
propose_duel(archive: Archive, n: int = 1) → List[Tuple[int, int]]

Propose a duel between two Evaluations

Takes an archive of previous evaluations and duels to propose n new duels of two configurations each.

Parameters:
  • archive (Archive) – Archive containing previous evaluations

  • n (int) – Number of duels to propose in one batch

Returns:

List of tuples of two indices of Archive evaluations to compare

Return type:

List(Tuple(int, int))

class pbmohpo.optimizers.eubo.qEUBO(config_space: ConfigurationSpace, initial_design_size: int | None = None)

Bases: EUBO

Bayesian Optimization for Pairwise Comparison Data.

Implements the expected utility of the best option algorithm.

For details see: https://arxiv.org/pdf/2303.15746.pdf

Their implementation can be found here: https://github.com/facebookresearch/qEUBO

Large parts of that code have been used in this implementation.

Parameters:
  • config_space (CS.ConfigurationSpace) – The config space the optimizer searches over

  • initial_design_size (int, None) – Size of the initial design, if not specified, two times the number of HPs is used

Decision Makers

class pbmohpo.decision_makers.decision_maker.DecisionMaker(preferences: Dict | None = None, objective_names: List | None = None, seed: RandomState | int | None = 42)

Bases: object

Simple Decision Maker.

This class constructs a decision maker that has a weight for each objective. Preference weights need to sum to 1.

Parameters:
  • preferences (Dict, None) – Dict containing a weight for each objective

  • objective_names (List, None) – List of objective names, if preferences are not given, preference values are sampled randomly

  • seed (int, np.random.RandomState) – Seed used to generate the preferences if not given

compare(objectives1: Dict, objectives2: Dict) → bool

Check if the DM prefers objectives 1 over objectives 2.

Parameters:
  • objectives1 (Dict) – Dict of objectives with associated values that should be checked for preference

  • objectives2 (Dict) – Dict of objectives with associated values, that should be checked if objectives1 is preferred by DM

Returns:

Does DM prefer objectives1 over objectives2

Return type:

bool

Utils

pbmohpo.utils.color_generator()

Generates colors for archives visualization to match YAHPO colors.

pbmohpo.utils.get_botorch_bounds(space: ConfigurationSpace, on_search_space: bool = True) → List

Get bounds of hyperparameters in the format botorch needs, If on_search_space is True, the bounds are returned as on the search space, i.e. respecting log transformations.

Parameters:
  • space (CS.configuration_space) – Configuration space of the problem

  • on_search_space (bool) – Whether candidates are on the search space, i.e. respecting log transformations

Returns:

list of [lower, upper] bounds of each hyperparameter

Return type:

list

pbmohpo.utils.get_config_values(config: Configuration, space: ConfigurationSpace, on_search_space: bool = True) → List

Get the values of a configuration. If on_search_space is True, the values are returned as on the search space, i.e. respecting log transformations. If on_search_space is False, the values are returned as on the original space.

Parameters:
  • config (CS.Configuration) – Configuration to be evaluated

  • space (CS.ConfigurationSpace) – Search space of the problem

  • on_search_space (bool) – Whether candidates are on the search space, i.e. respecting log transformations

Returns:

List of values of the configuration

Return type:

List

pbmohpo.utils.remove_hp_from_cs(old_cs: ConfigurationSpace, remove_hp_dict: Dict) → ConfigurationSpace

Remove parameters from the search space.

Parameters:
  • old_cs (CS.ConfigurationSpace) –

  • remove_hp_dict (Dict) – Dict of hyperparameters with hyperparameters as keys and defaults as values

Return type:

CS.ConfigurationSpace

pbmohpo.utils.visualize_archives(archive_list: List[Archive], plot_elements: List[str] = ['incumbent'], legend_elements: List[str] = None)

Visualize archive utility and incumbent utility over iterations.

Parameters:
  • archive_list (list[Archive]) – List of archives to be visualized

  • plot_elements (list[str]) – List of elements that should be plotted. Currently, supports “incumbent”, which plots the incumbent utility over iteration and “utilities”, which plots the utility for each iteration over iteration.

  • legend_elements (list[str]) – List of elements that should be included in the legend. Must be of the same length as archive_list.

Return type:

matplotlib item