Optuna を使用したハイパーパラメーターの調整

Optuna は、複数のコンピューティング リソース間で水平方向にスケーリングできるハイパーパラメーターの調整用のオープンソース Python ライブラリです。 Optuna は MLflow とも整合性があり、モデルと試行の追跡と監視が可能です。

Optuna をインストールする

次のコマンドを使用して、Optuna とその統合モジュールをインストールします。

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

検索空間の定義と Optuna 最適化の実行

Optuna ワークフローの手順を次に示します。

  1. 最適化する目的関数を定義します。 目的関数内で、ハイパーパラメーター検索空間を定義します。
  2. Optuna Study オブジェクトを作成し、Study オブジェクトの optimize 関数を呼び出してチューニング アルゴリズムを実行します。

以下は、Optuna ドキュメントに記載されている最小限の例です。

  • 目的関数 objective を定義し、suggest_float 関数を呼び出してパラメーター x の検索空間を定義します。
  • Study を作成し、100 回の試行で objective 関数を最適化します。具体的には、x の値を変えて objective 関数を 100 回呼び出します。
  • Study の最適なパラメーターを取得する
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 Backend を使用すると、Azure Databricks クラスター内の複数のマシンに Optuna の試行を分散できます。

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 を使用してハイパーパラメーターの調整をスケールアップする

ノートブックを入手