Example for using the multi target mode for the objective¶
Example for using the multi target mode for the objective. It uses a desirability value to handle several targets.
This example assumes some basic familiarity with using BayBE.
We thus refer to campaign
for a basic example.
Necessary imports for this example¶
import pandas as pd
from baybe import Campaign
from baybe.objectives import DesirabilityObjective
from baybe.parameters import CategoricalParameter, NumericalDiscreteParameter
from baybe.searchspace import SearchSpace
from baybe.targets import NumericalTarget
from baybe.utils.dataframe import add_fake_measurements
Experiment setup and creating the searchspace¶
Categorical_1 = CategoricalParameter("Cat_1", values=["22", "33"], encoding="OHE")
Categorical_2 = CategoricalParameter(
"Cat_2",
values=["very bad", "bad", "OK", "good", "very good"],
encoding="INT",
)
Num_disc_1 = NumericalDiscreteParameter(
"Num_disc_1", values=[1, 2, 3, 4, 6, 8, 10], tolerance=0.3
)
Num_disc_2 = NumericalDiscreteParameter(
"Num_disc_2", values=[-1, -3, -6, -9], tolerance=0.3
)
parameters = [Categorical_1, Categorical_2, Num_disc_1, Num_disc_2]
searchspace = SearchSpace.from_product(parameters=parameters)
Defining the targets¶
The multi target mode is handled when creating the objective object. Thus we first need to define the different targets.
This examples has different targets with different modes. The first target is maximized and while the second one is minimized. Note that in this multi target mode, the user must specify bounds for each target.
Target_1 = NumericalTarget(
name="Target_1", mode="MAX", bounds=(0, 100), transformation="LINEAR"
)
Target_2 = NumericalTarget(
name="Target_2", mode="MIN", bounds=(0, 100), transformation="LINEAR"
)
For each target it is also possible to specify a target_transform
function.
A detailed discussion of this functionality can be found at the end of this example.
In this example, define a third target working with the mode MATCH
.
We furthermore use target_transform="BELL"
.
Target_3 = NumericalTarget(
name="Target_3", mode="MATCH", bounds=(45, 55), transformation="BELL"
)
Note that the MATCH
mode seeks to have the target at the mean between the two bounds.
For example, choosing 95 and 105 will lead the algorithm seeking 100 as the optimal
value.
Thus, using the bounds, it is possible to control both the match target and
the range around this target that is considered viable.
Creating the objective¶
Now to work with these three targets the objective object must be properly created.
The mode is set to DESIRABILITY
and the targets are described in a list.
targets = [Target_1, Target_2, Target_3]
As the recommender requires a single function, the different targets need to be
combined.
Thus, a scalarizer
is used to create a single target out of the several targets given.
The combine function can either be the mean MEAN
or the geometric mean GEOM_MEAN
.
Per default, GEOM_MEAN
is used.
Weights for each target can also be specified as a list of floats in the arguments
Per default, weights are equally distributed between all targets and are normalized
internally.
It is thus not necessary to handle normalization or scaling.
objective = DesirabilityObjective(
targets=targets,
weights=[20, 20, 60],
scalarizer="MEAN",
)
print(objective)
Objective
Type: DesirabilityObjective
Targets
Type Name ... Transformation Weight
0 NumericalTarget Target_1 ... LINEAR 20.0
1 NumericalTarget Target_2 ... LINEAR 20.0
2 NumericalTarget Target_3 ... BELL 60.0
[3 rows x 7 columns]
Scalarizer: MEAN
Creating and printing the campaign¶
campaign = Campaign(searchspace=searchspace, objective=objective)
print(campaign)
Campaign
Meta Data
Batches done: 0
Fits done: 0
Discrete Subspace Meta Data
Recommended: 0/280
Measured: 0/280
Excluded: 0/280
SearchSpace
Search Space Type: DISCRETE
SubspaceDiscrete
Discrete Parameters
Name Type ... Encoding
nActiveValues 0 Cat_1 CategoricalParameter … CategoricalEncoding.OHE 2.0 1 Cat_2 CategoricalParameter … CategoricalEncoding.INT 5.0 2 Num_disc_1 NumericalDiscreteParameter … None NaN 3 Num_disc_2 NumericalDiscreteParameter … None NaN
[4 rows x 5 columns]
Experimental Representation
Cat_1 Cat_2 Num_disc_1 Num_disc_2
0 22 OK 1.0 -9.0
1 22 OK 1.0 -6.0
2 22 OK 1.0 -3.0
.. ... ... ... ...
277 33 very good 10.0 -6.0
278 33 very good 10.0 -3.0
279 33 very good 10.0 -1.0
[280 rows x 4 columns]
Constraints
Empty DataFrame
Columns: []
Index: []
Computational Representation
Cat_1_22 Cat_1_33 ... Num_disc_1 Num_disc_2
0 1.0 0.0 ... 1.0 -9.0
1 1.0 0.0 ... 1.0 -6.0
2 1.0 0.0 ... 1.0 -3.0
.. ... ... ... ... ...
277 0.0 1.0 ... 10.0 -6.0
278 0.0 1.0 ... 10.0 -3.0
279 0.0 1.0 ... 10.0 -1.0
[280 rows x 5 columns]
Objective
Type: DesirabilityObjective
Targets
Type Name ... Transformation Weight
0 NumericalTarget Target_1 ... LINEAR 20.0
1 NumericalTarget Target_2 ... LINEAR 20.0
2 NumericalTarget Target_3 ... BELL 60.0
[3 rows x 7 columns]
Scalarizer: MEAN
TwoPhaseMetaRecommender
Initial recommender
RandomRecommender
Compatibility: SearchSpaceType.HYBRID
Recommender
BotorchRecommender
Surrogate
GaussianProcessSurrogate
Supports Transfer Learning: True
Kernel factory: DefaultKernelFactory()
Acquisition function: None
Compatibility: SearchSpaceType.HYBRID
Sequential continuous: True
Hybrid sampler: None
Sampling percentage: 1.0
Switch after: 1
Remain switched: False
Has switched: False
Performing some iterations¶
The following loop performs some recommendations and adds fake results. It also prints what happens to internal data.
N_ITERATIONS = 3
for kIter in range(N_ITERATIONS):
rec = campaign.recommend(batch_size=3)
add_fake_measurements(rec, campaign.targets)
campaign.add_measurements(rec)
desirability = campaign.objective.transform(campaign.measurements, allow_extra=True)
print(f"\n\n#### ITERATION {kIter + 1} ####")
print("\nRecommended measurements with fake measured results:\n")
print(rec)
print("\nInternal measurement database with desirability values:\n")
print(pd.concat([campaign.measurements, desirability], axis=1))
#### ITERATION 1 ####
Recommended measurements with fake measured results:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 Target_3
19 22 OK 6.0 -1.0 17.119642 99.116298 53.774511
259 33 very good 2.0 -1.0 4.265173 20.551621 51.506013
115 22 very good 1.0 -1.0 97.608557 18.182221 55.618873
Internal measurement database with desirability values:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 Target_3 \
0 22 OK 6.0 -1.0 17.119642 99.116298 53.774511
1 33 very good 2.0 -1.0 4.265173 20.551621 51.506013
2 22 very good 1.0 -1.0 97.608557 18.182221 55.618873
BatchNr FitNr Desirability
0 1 NaN 0.487243
1 1 NaN 0.740818
2 1 NaN 0.677950
#### ITERATION 2 ####
Recommended measurements with fake measured results:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 \
index
258 33 very good 2.0 -3.0 85.056835 34.882087
227 33 very bad 1.0 -1.0 39.673733 84.633391
267 33 very good 4.0 -1.0 6.349473 73.503178
Target_3
index
258 53.266851
227 54.235516
267 55.534439
Internal measurement database with desirability values:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 Target_3 \
0 22 OK 6.0 -1.0 17.119642 99.116298 53.774511
1 33 very good 2.0 -1.0 4.265173 20.551621 51.506013
2 22 very good 1.0 -1.0 97.608557 18.182221 55.618873
3 33 very good 2.0 -3.0 85.056835 34.882087 53.266851
4 33 very bad 1.0 -1.0 39.673733 84.633391 54.235516
5 33 very good 4.0 -1.0 6.349473 73.503178 55.534439
BatchNr FitNr Desirability
0 1 1.0 0.487243
1 1 1.0 0.740818
2 1 1.0 0.677950
3 2 NaN 0.785027
4 2 NaN 0.529192
5 2 NaN 0.390856
#### ITERATION 3 ####
Recommended measurements with fake measured results:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 \
index
256 33 very good 2.0 -9.0 31.951126 69.922035
253 33 very good 1.0 -6.0 63.334798 8.351403
85 22 very bad 1.0 -6.0 65.058874 69.289708
Target_3
index
256 52.116219
253 51.310315
85 53.186293
Internal measurement database with desirability values:
Cat_1 Cat_2 Num_disc_1 Num_disc_2 Target_1 Target_2 Target_3 \
0 22 OK 6.0 -1.0 17.119642 99.116298 53.774511
1 33 very good 2.0 -1.0 4.265173 20.551621 51.506013
2 22 very good 1.0 -1.0 97.608557 18.182221 55.618873
3 33 very good 2.0 -3.0 85.056835 34.882087 53.266851
4 33 very bad 1.0 -1.0 39.673733 84.633391 54.235516
5 33 very good 4.0 -1.0 6.349473 73.503178 55.534439
6 33 very good 2.0 -9.0 31.951126 69.922035 52.116219
7 33 very good 1.0 -6.0 63.334798 8.351403 51.310315
8 22 very bad 1.0 -6.0 65.058874 69.289708 53.186293
BatchNr FitNr Desirability
0 1 1.0 0.487243
1 1 1.0 0.740818
2 1 1.0 0.677950
3 2 2.0 0.785027
4 2 2.0 0.529192
5 2 2.0 0.390856
6 3 NaN 0.672654
7 3 NaN 0.889713
8 3 NaN 0.681281
Addendum: Description of transformation
functions¶
This function is used to transform target values to the interval [0,1]
for MAX
/MIN
mode.
An ascending or decreasing LINEAR
function is used per default.
This function maps input values in a specified interval [lower, upper] to the interval
[0,1]
.
Outside the specified interval, the function remains constant, that is, 0 or 1.
For the match mode, two functions are available TRIANGULAR
and BELL
.
The TRIANGULAR
function is 0 outside a specified interval and linearly increases to 1
from both
interval ends, reaching the value 1 at the center of the interval.
This function is used per default for MATCH mode.
The BELL
function is a Gaussian bell curve, specified through the boundary values of
the sigma
interval, reaching the maximum value of 1 at the interval center.