Custom Emulators¶
You can create your own emulator, based on a custom dataset within Olympus. A simple example where we create an
Emulator
for Boston housing dataset can be found in the examples. Here we provide a high-level guide of the steps
necessary.
First, you need to create a custom Dataset
. This can easily be done if you have your data in a DataFrame
. This
needs to contain all parameters and measurements/targets, such that you can specify the column name for the target of interest
from olympus.datasets import Dataset
import pandas as pd
df = pd.from_csv('mydata.csv')
dataset = Dataset(data=df, target_ids=['target'])
Second, you need to specify the parameter space of the problem. An easy of doing this is to ask Olympus to infer this from the data
dataset.infer_param_space()
However, to have more control over this you can instantiate and populate a ParameterSpace
object to then pass to
dataset
:
from olympus import ParameterSpace, Parameter
# initialise a parameter space object
param_space = ParameterSpace()
# define the parameters and append them to param_space
param1 = Parameter(kind='continuous', name='param1', low=10, high=100)
param2 = Parameter(kind='continuous', name='param2', low=5, high=15)
param_space.add(param1)
param_space.add(param2)
# provide this param_space to dataset
dataset.set_param_space(param_space)
Now the details of your data are all set. So as third step, you need to instantiate the Model
that will be trained
on this data:
from olympus.models import BayesNeuralNet
model = BayesNeuralNet(hidden_depth=2, hidden_nodes=12, hidden_act='leaky_relu', out_act="relu",
batch_size=50, reg=0.005, max_epochs=10000)
Finally, you combine dataset and model into an Emulator
:
from olympus import Emulator
emulator = Emulator(dataset=dataset, model=model, feature_transform='normalize', target_transform='normalize')
The choice of feature_transform
, target_transform
, as well as the model hyperparameters depend on the details
of your dataset. Once all this is setup, you can use cross-validation to test your emulator
and tweak the model’s
architecture:
emulator.cross_validate()
Once you are happy with the performance of the emulator, you can train it:
emulator.train()
After this, you have a custom emulator ready to be used to benchmark various optimization algorithms for your specific problem:
emulator.run(...)
You can also save this specific emulator to be reused:
# save
emulator.save('custom_emulator')
# load
emulator = load_emulator('custom_emulator')