用 RDB 后端保存/恢复 Study

RDB后端可以实现持久化实验(即保存和恢复 study)以及访问 study 的历史记录。此外,我们还可以利用这个特点来进行分布式优化。具体描述见 分布式优化."

在本部分中,我们将尝试一个在本地环境下运行SQLite DB的简单例子。

注解

通过设置 DB 的 storage URL 参数,你也可以使用其他的 RDB 后端,比如 PostgreSQL 或者 MySQL.设置URL的方式参见 SQLAlchemy 的文档.

新建 Study

通过调用函数 create_study(),我们可以创建一个持久化的 study.创建新 study 会自动初始化一个 SQLite 文件 example.db.

import optuna
study_name = 'example-study'  # Unique identifier of the study.
study = optuna.create_study(study_name=study_name, storage='sqlite:///example.db')

为了运行一个 study, 我们需要将目标函数传入 optimize() 方法并调用它。

def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    return (x - 2) ** 2

study.optimize(objective, n_trials=3)

恢复 Study

为了恢复 study, 首先需要初始化一个 Study 对象, 并将该study 的名字 example-study 和 DB URL参数 sqlite:///example.db 传入其中。

study = optuna.create_study(study_name='example-study', storage='sqlite:///example.db', load_if_exists=True)
study.optimize(objective, n_trials=3)

实验历史记录

我们可以通过 Study 类来获得 study 和对应 trials的历史记录。比如,下面的语句可以获取 example-study 的所有 trials.

import optuna
study = optuna.create_study(study_name='example-study', storage='sqlite:///example.db', load_if_exists=True)
df = study.trials_dataframe(attrs=('number', 'value', 'params', 'state'))

trials_dataframe() 方法会返回一个如下的 pandas dataframe:

print(df)

输出:

   number       value  params_x     state
0       0   25.301959 -3.030105  COMPLETE
1       1    1.406223  0.814157  COMPLETE
2       2   44.010366 -4.634031  COMPLETE
3       3   55.872181  9.474770  COMPLETE
4       4  113.039223 -8.631991  COMPLETE
5       5   57.319570  9.570969  COMPLETE

Study 对象也有一些其他属性,比如 trials, best_valuebest_params (见 第一个优化例子).

study.best_params  # Get best parameters for the objective function.
study.best_value  # Get best objective value.
study.best_trial  # Get best trial's information.
study.trials  # Get all trials' information.