使用 Optuna 进行超参数优化

Optuna 是一个用于超参数优化的开源 Python 库,可在多个计算资源之间进行水平缩放。 Optuna 还与 MLflow 集成,用于模型和试验跟踪和监视。

安装 Optuna

使用以下命令安装 Optuna 及其集成模块。

%pip install optuna
%pip install optuna-integration # Integration with MLflow

定义搜索空间并运行 Optuna 优化

以下是 Optuna 工作流中的步骤:

  1. 定义要优化的目标函数。 在目标函数中,定义超参数搜索空间。
  2. 创建一个“Optuna 研究”对象,并通过调用该“研究”对象的 optimize 函数以运行优化算法。

下面是 Optuna 文档中的最小化示例。

  • 定义目标函数 objective,并调用 suggest_float 函数以定义参数 x 的搜索空间。
  • 创建一个“研究”,并通过 100 个试验优化 objective 函数,即通过不同的 x 值对 objective 函数进行 100 次调用。
  • 获取“研究”的最佳参数
def objective(trial):
    x = trial.suggest_float("x", -10, 10)
    return (x - 2) ** 2

study = optuna.create_study()
study.optimize(objective, n_trials=100)

best_params = study.best_params

将 Optuna 试用并行化到多台计算机

可使用 Joblib Apache Spark 后端将 Optuna 试验分发到 Azure Databricks 群集中的多台计算机。

import joblib
from joblibspark import register_spark

register_spark() # register Spark backend for Joblib
with joblib.parallel_backend("spark", n_jobs=-1):
    study.optimize(objective, n_trials=100)

与 MLflow 集成

若要跟踪所有 Optuna 试验的超参数和指标,在调用 optimize 函数时,请使用 Optuna 集成模块的 MLflowCallback

import mlflow
from optuna.integration.mlflow import MLflowCallback

mlflow_callback = MLflowCallback(
    tracking_uri="databricks",
    metric_name="accuracy",
    create_experiment=False,
    mlflow_kwargs={
        "experiment_id": experiment_id
    }
)

study.optimize(objective, n_trials=100, callbacks=[mlflow_callback])

笔记本示例

此笔记本提供了使用 Optuna 为 Iris 数据集选择 scikit-learn 模型和一组超参数的示例。

在单机 Optuna 工作流之上,笔记本展示了如何

  • 通过 Joblib 将 Optuna 试验并行化到多台计算机
  • 使用 MLflow 跟踪试验运行

使用 Optuna 和 MLflow 纵向扩展超参数优化

获取笔记本