High-dimensional, Multi-Objective Optimization with Existing Data
[3]:
# For notebook gallery thumbnail
from IPython.display import Image
Image(filename="../saasbo-feature-importances.png")
[3]:
See https://github.com/facebook/Ax/issues/743
[1]:
%pip install ax-platform
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting ax-platform
Downloading ax_platform-0.2.10-py3-none-any.whl (1.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 7.9 MB/s eta 0:00:00
Requirement already satisfied: ipywidgets<8.0.0 in /usr/local/lib/python3.8/dist-packages (from ax-platform) (7.7.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.8/dist-packages (from ax-platform) (2.11.3)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.8/dist-packages (from ax-platform) (1.0.2)
Collecting botorch==0.8.0
Downloading botorch-0.8.0-py3-none-any.whl (481 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 481.8/481.8 KB 13.9 MB/s eta 0:00:00
Requirement already satisfied: scipy in /usr/local/lib/python3.8/dist-packages (from ax-platform) (1.7.3)
Requirement already satisfied: plotly in /usr/local/lib/python3.8/dist-packages (from ax-platform) (5.5.0)
Requirement already satisfied: typeguard in /usr/local/lib/python3.8/dist-packages (from ax-platform) (2.7.1)
Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (from ax-platform) (1.3.5)
Requirement already satisfied: torch>=1.11 in /usr/local/lib/python3.8/dist-packages (from botorch==0.8.0->ax-platform) (1.13.1+cu116)
Collecting linear-operator==0.2.0
Downloading linear_operator-0.2.0-py3-none-any.whl (152 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 153.0/153.0 KB 4.9 MB/s eta 0:00:00
Requirement already satisfied: multipledispatch in /usr/local/lib/python3.8/dist-packages (from botorch==0.8.0->ax-platform) (0.6.0)
Collecting gpytorch==1.9.0
Downloading gpytorch-1.9.0-py3-none-any.whl (245 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 245.8/245.8 KB 7.2 MB/s eta 0:00:00
Collecting pyro-ppl>=1.8.2
Downloading pyro_ppl-1.8.4-py3-none-any.whl (730 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 730.7/730.7 KB 20.6 MB/s eta 0:00:00
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (5.3.4)
Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (5.7.1)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (3.6.2)
Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (0.2.0)
Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (7.9.0)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.8/dist-packages (from ipywidgets<8.0.0->ax-platform) (3.0.5)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.8/dist-packages (from jinja2->ax-platform) (2.0.1)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from pandas->ax-platform) (1.21.6)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas->ax-platform) (2022.7.1)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.8/dist-packages (from pandas->ax-platform) (2.8.2)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.8/dist-packages (from plotly->ax-platform) (8.2.1)
Requirement already satisfied: six in /usr/local/lib/python3.8/dist-packages (from plotly->ax-platform) (1.15.0)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.8/dist-packages (from scikit-learn->ax-platform) (1.2.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from scikit-learn->ax-platform) (3.1.0)
Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.8/dist-packages (from ipykernel>=4.5.1->ipywidgets<8.0.0->ax-platform) (6.2)
Requirement already satisfied: jupyter-client in /usr/local/lib/python3.8/dist-packages (from ipykernel>=4.5.1->ipywidgets<8.0.0->ax-platform) (6.1.12)
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (57.4.0)
Collecting jedi>=0.10
Downloading jedi-0.18.2-py2.py3-none-any.whl (1.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 11.8 MB/s eta 0:00:00
Requirement already satisfied: backcall in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (0.2.0)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (0.7.5)
Requirement already satisfied: prompt-toolkit<2.1.0,>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (2.0.10)
Requirement already satisfied: pexpect in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (4.8.0)
Requirement already satisfied: decorator in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (4.4.2)
Requirement already satisfied: pygments in /usr/local/lib/python3.8/dist-packages (from ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (2.6.1)
Collecting pyro-api>=0.1.1
Downloading pyro_api-0.1.2-py3-none-any.whl (11 kB)
Requirement already satisfied: tqdm>=4.36 in /usr/local/lib/python3.8/dist-packages (from pyro-ppl>=1.8.2->botorch==0.8.0->ax-platform) (4.64.1)
Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.8/dist-packages (from pyro-ppl>=1.8.2->botorch==0.8.0->ax-platform) (3.3.0)
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.8/dist-packages (from torch>=1.11->botorch==0.8.0->ax-platform) (4.5.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.8/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (6.3.0)
Requirement already satisfied: parso<0.9.0,>=0.8.0 in /usr/local/lib/python3.8/dist-packages (from jedi>=0.10->ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (0.8.3)
Requirement already satisfied: Send2Trash>=1.5.0 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (1.8.0)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.16.0)
Requirement already satisfied: nbconvert in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (5.6.1)
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (23.2.1)
Requirement already satisfied: nbformat in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (5.7.3)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.13.3)
Requirement already satisfied: jupyter-core>=4.6.1 in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (5.2.0)
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.8/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (21.3.0)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.8/dist-packages (from prompt-toolkit<2.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (0.2.6)
Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.8/dist-packages (from pexpect->ipython>=4.0.0->ipywidgets<8.0.0->ax-platform) (0.7.0)
Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.8/dist-packages (from jupyter-core>=4.6.1->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (3.0.0)
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.8/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (21.2.0)
Requirement already satisfied: entrypoints>=0.2.2 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.4)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (1.5.0)
Requirement already satisfied: testpath in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.6.0)
Requirement already satisfied: bleach in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (6.0.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.7.1)
Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.8/dist-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.8.4)
Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.8/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (4.3.3)
Requirement already satisfied: fastjsonschema in /usr/local/lib/python3.8/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (2.16.2)
Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.19.3)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (22.2.0)
Requirement already satisfied: importlib-resources>=1.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (5.10.2)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (1.15.1)
Requirement already satisfied: webencodings in /usr/local/lib/python3.8/dist-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (0.5.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.8/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (2.21)
Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.8/dist-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets<8.0.0->ax-platform) (3.13.0)
Installing collected packages: pyro-api, jedi, pyro-ppl, linear-operator, gpytorch, botorch, ax-platform
Successfully installed ax-platform-0.2.10 botorch-0.8.0 gpytorch-1.9.0 jedi-0.18.2 linear-operator-0.2.0 pyro-api-0.1.2 pyro-ppl-1.8.4
[2]:
# %% imports
import numpy as np
import pandas as pd
from ax.modelbridge.generation_strategy import GenerationStrategy, GenerationStep
from ax.modelbridge.registry import Models
from ax.service.ax_client import AxClient
from ax.service.utils.instantiation import ObjectiveProperties
unique_components = ["filler_A", "filler_B", "resin_A", "resin_B", "resin_C"]
X_train = np.array([
[0.4, 0.4, 0. , 0. , 0.2],
[0.5, 0. , 0. , 0.5, 0. ],
[0.5, 0.3, 0. , 0.2, 0. ],
[0.5, 0. , 0. , 0.5, 0. ],
[0. , 0.6, 0.4, 0. , 0. ],
[0.6, 0. , 0.4, 0. , 0. ],
[0. , 0.6, 0.2, 0.2, 0. ]])
X_train = pd.DataFrame(X_train, columns=unique_components)
X_train
[2]:
| filler_A | filler_B | resin_A | resin_B | resin_C | |
|---|---|---|---|---|---|
| 0 | 0.4 | 0.4 | 0.0 | 0.0 | 0.2 |
| 1 | 0.5 | 0.0 | 0.0 | 0.5 | 0.0 |
| 2 | 0.5 | 0.3 | 0.0 | 0.2 | 0.0 |
| 3 | 0.5 | 0.0 | 0.0 | 0.5 | 0.0 |
| 4 | 0.0 | 0.6 | 0.4 | 0.0 | 0.0 |
| 5 | 0.6 | 0.0 | 0.4 | 0.0 | 0.0 |
| 6 | 0.0 | 0.6 | 0.2 | 0.2 | 0.0 |
[3]:
np.random.seed(10)
n_train = X_train.shape[0]
num_objectives = 2
y_train = 100 * np.random.rand(n_train, num_objectives)
y_train
[3]:
array([[77.13206433, 2.07519494],
[63.36482349, 74.88038825],
[49.85070123, 22.47966455],
[19.80628648, 76.05307122],
[16.91108366, 8.83398142],
[68.53598184, 95.33933462],
[ 0.39482663, 51.21922634]])
[4]:
# Ax-specific
parameters = [
{"name": component, "type": "range", "bounds": [0.0, 1.0]}
for component in unique_components[:-1]
]
parameters
[4]:
[{'name': 'filler_A', 'type': 'range', 'bounds': [0.0, 1.0]},
{'name': 'filler_B', 'type': 'range', 'bounds': [0.0, 1.0]},
{'name': 'resin_A', 'type': 'range', 'bounds': [0.0, 1.0]},
{'name': 'resin_B', 'type': 'range', 'bounds': [0.0, 1.0]}]
[5]:
separator = " + "
composition_constraint = separator.join(unique_components[:-1]) + " <= 1.0"
composition_constraint
[5]:
'filler_A + filler_B + resin_A + resin_B <= 1.0'
[9]:
# skip the pseudo-random suggested points by specifying a custom generation strategy
gs = GenerationStrategy(
steps=[
# 2. Bayesian optimization step (requires data obtained from previous phase and learns
# from all data available at the time of each new candidate generation call)
GenerationStep(
model=Models.FULLYBAYESIANMOO,
num_trials=-1, # No limitation on how many trials should be produced from this step
max_parallelism=3, # Parallelism limit for this step, often lower than for Sobol
# More on parallelism vs. required samples in BayesOpt:
# https://ax.dev/docs/bayesopt.html#tradeoff-between-parallelism-and-total-number-of-trials
),
]
)
objectives = {
"yield_strength": ObjectiveProperties(minimize=False),
"elongation": ObjectiveProperties(minimize=False),
}
# setup the experiment
ax_client = AxClient(generation_strategy=gs)
ax_client.create_experiment(
name="dummy",
parameters=parameters,
parameter_constraints=[
composition_constraint,
],
objectives=objectives,
)
[INFO 02-18 04:13:20] ax.service.ax_client: Starting optimization with verbose logging. To disable logging, set the `verbose_logging` argument to `False`. Note that float values in the logs are rounded to 6 decimal points.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Due to non-specification, we will use the heuristic for selecting objective thresholds.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter filler_A. If that is not the expected value type, you can explicity specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter filler_B. If that is not the expected value type, you can explicity specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter resin_A. If that is not the expected value type, you can explicity specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Inferred value type of ParameterType.FLOAT for parameter resin_B. If that is not the expected value type, you can explicity specify 'value_type' ('int', 'float', 'bool' or 'str') in parameter dict.
[INFO 02-18 04:13:20] ax.service.utils.instantiation: Created search space: SearchSpace(parameters=[RangeParameter(name='filler_A', parameter_type=FLOAT, range=[0.0, 1.0]), RangeParameter(name='filler_B', parameter_type=FLOAT, range=[0.0, 1.0]), RangeParameter(name='resin_A', parameter_type=FLOAT, range=[0.0, 1.0]), RangeParameter(name='resin_B', parameter_type=FLOAT, range=[0.0, 1.0])], parameter_constraints=[ParameterConstraint(1.0*filler_A + 1.0*filler_B + 1.0*resin_A + 1.0*resin_B <= 1.0)]).
[12]:
# attach the training data
for i in range(n_train):
ax_client.attach_trial(X_train.iloc[i, :-1].to_dict())
ax_client.complete_trial(trial_index=i, raw_data={"yield_strength": y_train[i, 0], "elongation": y_train[i, 1]})
[INFO 02-18 04:13:50] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.4, 'filler_B': 0.4, 'resin_A': 0.0, 'resin_B': 0.0} as trial 1.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 0 with data: {'yield_strength': (77.132064, None), 'elongation': (2.075195, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.5, 'filler_B': 0.0, 'resin_A': 0.0, 'resin_B': 0.5} as trial 2.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 1 with data: {'yield_strength': (63.364823, None), 'elongation': (74.880388, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.5, 'filler_B': 0.3, 'resin_A': 0.0, 'resin_B': 0.2} as trial 3.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 2 with data: {'yield_strength': (49.850701, None), 'elongation': (22.479665, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.5, 'filler_B': 0.0, 'resin_A': 0.0, 'resin_B': 0.5} as trial 4.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 3 with data: {'yield_strength': (19.806286, None), 'elongation': (76.053071, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.0, 'filler_B': 0.6, 'resin_A': 0.4, 'resin_B': 0.0} as trial 5.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 4 with data: {'yield_strength': (16.911084, None), 'elongation': (8.833981, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.6, 'filler_B': 0.0, 'resin_A': 0.4, 'resin_B': 0.0} as trial 6.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 5 with data: {'yield_strength': (68.535982, None), 'elongation': (95.339335, None)}.
[INFO 02-18 04:13:51] ax.service.ax_client: Attached custom parameterization {'filler_A': 0.0, 'filler_B': 0.6, 'resin_A': 0.2, 'resin_B': 0.2} as trial 7.
[INFO 02-18 04:13:51] ax.service.ax_client: Completed trial 6 with data: {'yield_strength': (0.394827, None), 'elongation': (51.219226, None)}.
[13]:
# produce a *single* next suggested experiment, be sure to only run this once
next_experiment, trial_index = ax_client.get_next_trial()
print("next suggested experiment: ", next_experiment)
Sample: 100%|██████████| 768/768 [00:48, 15.73it/s, step size=5.60e-01, acc. prob=0.888]
Sample: 100%|██████████| 768/768 [00:50, 15.26it/s, step size=4.75e-01, acc. prob=0.907]
[INFO 02-18 04:15:42] ax.service.ax_client: Generated new trial 8 with parameters {'filler_A': 0.0, 'filler_B': 1.0, 'resin_A': 0.0, 'resin_B': 0.0}.
next suggested experiment: {'filler_A': 0.0, 'filler_B': 1.0, 'resin_A': 5.645796473207701e-16, 'resin_B': 0.0}
[16]:
# note that the model fit is poor because of the toy data and randomly generated objective values
# (i.e. this is what we would expect: a bad fit, because the "true" values are nonsense)
pareto_optimal_parameters = ax_client.get_pareto_optimal_parameters()
print(pareto_optimal_parameters)
Sample: 100%|██████████| 768/768 [00:45, 16.84it/s, step size=5.96e-01, acc. prob=0.886]
Sample: 100%|██████████| 768/768 [00:48, 15.88it/s, step size=5.32e-01, acc. prob=0.907]
[INFO 02-18 04:21:01] ax.service.utils.best_point: Using inferred objective thresholds: [ObjectiveThreshold(elongation >= 47.00879661731586), ObjectiveThreshold(yield_strength >= 60.39932872713746)], as objective thresholds were not specified as part of the optimization configuration on the experiment.
{5: ({'filler_A': 0.0, 'filler_B': 0.6, 'resin_A': 0.4, 'resin_B': 0.0}, ({'elongation': 77.6029745114039, 'yield_strength': 68.73797698029448}, {'elongation': {'elongation': 443.2025659448865, 'yield_strength': 0.0}, 'yield_strength': {'elongation': 0.0, 'yield_strength': 211.24414246096174}}))}
/usr/local/lib/python3.8/dist-packages/ax/modelbridge/modelbridge_utils.py:831: UserWarning: FYI: The default behavior of `get_pareto_frontier_and_configs` when `transform_outcomes_and_configs` is not specified has changed. Previously, the default was `transform_outcomes_and_configs=True`; now this argument is deprecated and behavior is as if `transform_outcomes_and_configs=False`. You did not specify `transform_outcomes_and_configs`, so this warning requires no action.
warnings.warn(
[ ]: