Note
Click here to download the full example code
Saving/Resuming Study with RDB Backend¶
An RDB backend enables persistent experiments (i.e., to save and resume a study) as well as access to history of studies. In addition, we can run multi-node optimization tasks with this feature, which is described in Easy Parallelization.
In this section, let’s try simple examples running on a local environment with SQLite DB.
Note
You can also utilize other RDB backends, e.g., PostgreSQL or MySQL, by setting the storage argument to the DB’s URL. Please refer to SQLAlchemy’s document for how to set up the URL.
New Study¶
We can create a persistent study by calling create_study() function as follows.
An SQLite file example.db is automatically initialized with a new study record.
import logging
import sys
import optuna
# Add stream handler of stdout to show the messages
optuna.logging.get_logger("optuna").addHandler(logging.StreamHandler(sys.stdout))
study_name = "example-study" # Unique identifier of the study.
storage_name = "sqlite:///{}.db".format(study_name)
study = optuna.create_study(study_name=study_name, storage=storage_name)
Out:
A new study created in RDB with name: example-study
To run a study, call optimize() method passing an objective function.
def objective(trial):
x = trial.suggest_uniform("x", -10, 10)
return (x - 2) ** 2
study.optimize(objective, n_trials=3)
Out:
Trial 0 finished with value: [23.21160886506031] and parameters: {'x': 6.8178427605164025}.
Trial 1 finished with value: [9.408797031358194] and parameters: {'x': 5.067376245483784}.
Trial 2 finished with value: [94.66360314317636] and parameters: {'x': -7.72952224639917}.
Resume Study¶
To resume a study, instantiate a Study object
passing the study name example-study and the DB URL sqlite:///example-study.db.
study = optuna.create_study(study_name=study_name, storage=storage_name, load_if_exists=True)
study.optimize(objective, n_trials=3)
Out:
Using an existing study with name 'example-study' instead of creating a new one.
Trial 3 finished with value: [111.68483533099945] and parameters: {'x': -8.568104623393896}.
Trial 4 finished with value: [73.71841531984474] and parameters: {'x': -6.585942890553415}.
Trial 5 finished with value: [5.2354785206683125] and parameters: {'x': -0.2881168066050108}.
Experimental History¶
We can access histories of studies and trials via the Study class.
For example, we can get all trials of example-study as:
study = optuna.create_study(study_name=study_name, storage=storage_name, load_if_exists=True)
df = study.trials_dataframe(attrs=("number", "value", "params", "state"))
Out:
Using an existing study with name 'example-study' instead of creating a new one.
The method trials_dataframe() returns a pandas dataframe like:
print(df)
Out:
number value params_x state
0 0 23.211609 6.817843 COMPLETE
1 1 9.408797 5.067376 COMPLETE
2 2 94.663603 -7.729522 COMPLETE
3 3 111.684835 -8.568105 COMPLETE
4 4 73.718415 -6.585943 COMPLETE
5 5 5.235479 -0.288117 COMPLETE
A Study object also provides properties
such as trials, best_value,
best_params (see also Lightweight, versatile, and platform agnostic architecture).
print("Best params: ", study.best_params)
print("Best value: ", study.best_value)
print("Best Trial: ", study.best_trial)
print("Trials: ", study.trials)
Out:
Best params: {'x': -0.2881168066050108}
Best value: 5.2354785206683125
Best Trial: FrozenTrial(number=5, values=[5.2354785206683125], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 688794), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 723812), params={'x': -0.2881168066050108}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=6, state=TrialState.COMPLETE, value=None)
Trials: [FrozenTrial(number=0, values=[23.21160886506031], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 150118), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 211956), params={'x': 6.8178427605164025}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=1, state=TrialState.COMPLETE, value=None), FrozenTrial(number=1, values=[9.408797031358194], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 256259), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 342198), params={'x': 5.067376245483784}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=2, state=TrialState.COMPLETE, value=None), FrozenTrial(number=2, values=[94.66360314317636], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 385528), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 419352), params={'x': -7.72952224639917}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=3, state=TrialState.COMPLETE, value=None), FrozenTrial(number=3, values=[111.68483533099945], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 520304), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 588739), params={'x': -8.568104623393896}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=4, state=TrialState.COMPLETE, value=None), FrozenTrial(number=4, values=[73.71841531984474], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 622029), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 653066), params={'x': -6.585942890553415}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=5, state=TrialState.COMPLETE, value=None), FrozenTrial(number=5, values=[5.2354785206683125], datetime_start=datetime.datetime(2020, 12, 21, 5, 57, 0, 688794), datetime_complete=datetime.datetime(2020, 12, 21, 5, 57, 0, 723812), params={'x': -0.2881168066050108}, distributions={'x': UniformDistribution(high=10, low=-10)}, user_attrs={}, system_attrs={}, intermediate_values={}, trial_id=6, state=TrialState.COMPLETE, value=None)]
Total running time of the script: ( 0 minutes 1.431 seconds)