Loading BOA from JSON and Plotting Results#
This notebook demonstrates how to:
Loading a Scheduler from JSON from a previous run (If you want to see the Experiment that this is from, see Running BOA Optimization Directly in Python. We will look at the output and plot some exploratory data analysis.
import pathlib
import os
import numpy as np
from ax.utils.notebook.plotting import init_notebook_plotting
from ax.plot.trace import optimization_trace_single_method_plotly
from ax.service.utils.report_utils import get_standard_plots, exp_to_df
import boa
from botorch.test_functions.synthetic import Cosine8
init_notebook_plotting()
[INFO 12-10 13:48:11] ax.utils.notebook.plotting: Injecting Plotly library into cell. Do not overwrite or delete cell.
Loading the Scheduler#
# Filepath to the scheduler.json
scheduler_fp = pathlib.Path(os.path.abspath("")) / "boa_runs/scheduler.json"
scheduler = boa.scheduler_from_json_file(scheduler_fp)
experiment = scheduler.experiment
[WARNING 12-10 13:48:12] Scheduler: Experiment(boa_runs) already has 100 trials associated with it. Total trials setting for this scheduler is 100, so no more trials would be run in this scheduler if `Scheduler.run_all_trials` is called (but you can still use `Scheduler.run_n_trials` to run a fixed number of trials).
Get the Best Trial and Output All Trials#
best_trial, best_params, obj = scheduler.get_best_trial()
best_trial
99
exp_to_df(experiment)
| Cosine8 | trial_index | arm_name | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | trial_status | generation_method | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2.167124 | 0 | 0_0 | 0.774544 | 0.468805 | 0.068063 | 0.362316 | 0.879579 | 0.273648 | 0.832961 | 0.104289 | COMPLETED | Sobol |
| 1 | 1.332692 | 1 | 1_0 | 0.490980 | 0.122534 | 0.286072 | 0.135533 | 0.407212 | 0.516411 | 0.552975 | 0.209887 | COMPLETED | Sobol |
| 2 | 2.239779 | 2 | 2_0 | 0.370515 | 0.437868 | 0.613205 | 0.630494 | 0.135183 | 0.472351 | 0.552578 | 0.686980 | COMPLETED | Sobol |
| 3 | 3.417184 | 3 | 3_0 | 0.136836 | 0.695278 | 0.936232 | 0.844562 | 0.099137 | 0.971449 | 0.467957 | 0.413035 | COMPLETED | Sobol |
| 4 | 4.009739 | 4 | 4_0 | 0.747055 | 0.203236 | 0.984640 | 0.257893 | 0.542277 | 0.742640 | 0.682041 | 0.910413 | COMPLETED | Sobol |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 95 | 3.157963 | 95 | 95_0 | 0.428170 | 0.875173 | 0.948110 | 0.439605 | 0.663419 | 0.438504 | 0.603967 | 0.475487 | COMPLETED | GPEI |
| 96 | 1.803210 | 96 | 96_0 | 0.516141 | 0.635045 | 0.359797 | 0.222931 | 0.587980 | 0.171713 | 0.471170 | 0.425680 | COMPLETED | GPEI |
| 97 | 2.426793 | 97 | 97_0 | 0.385700 | 0.414825 | 0.168669 | 0.768933 | 0.446303 | 0.664891 | 0.797453 | 0.790683 | COMPLETED | GPEI |
| 98 | 3.770818 | 98 | 98_0 | 0.568660 | 0.763975 | 0.816566 | 0.932060 | 0.571092 | 0.517328 | 0.833606 | 0.391031 | COMPLETED | GPEI |
| 99 | 3.341448 | 99 | 99_0 | 0.779255 | 0.245177 | 0.975580 | 0.867021 | 0.315499 | 0.468669 | 0.496713 | 0.597464 | COMPLETED | GPEI |
100 rows × 13 columns
EDA Plots#
plots = get_standard_plots(experiment, scheduler.generation_strategy.model)
for plot in plots:
plot.show()
optimum = -Cosine8().optimal_value
model_transitions = scheduler.generation_strategy.model_transitions
data = experiment.fetch_data()
metric_name = "Cosine8"
optimization_trace_single_method_plotly(
y=np.array([data.df[data.df["metric_name"] == metric_name]["mean"]]),
title=r"$\text{ Cosine Mixture: } f(x) = -0.1 \sum_{i=1}^n (cos(5 \pi x_i) - x_i^2) : x \in [-1, 1]^8$",
ylabel="Cosine Mixture",
model_transitions=model_transitions,
# Try and use the metric's lower_is_better property, but fall back on
# objective's minimize property if relevent
optimum=optimum,
optimization_direction=(
("minimize" if experiment.metrics[metric_name].lower_is_better is True else "maximize")
if experiment.metrics[metric_name].lower_is_better is not None
else ("minimize" if optimization_config.objective.minimize else "maximize")
),
plot_trial_points=True,
)