Databricks

ハイパーパラメータチューニング|Hyperopt・Optuna

2026-03-26
更新: 2026-03-27
NicheeLab編集部

ハイパーパラメータチューニングは、モデルの学習率・木の深さ・正則化係数といった「学習では決まらないパラメータ」を最適化する工程です。 Databricksでは主にHyperopt(SparkTrialsによる分散探索)とOptunaが使われ、全トライアルをMLflow Trackingで自動記録できます。 ML Associate試験ではHyperoptの基本API、ML Professional試験ではSparkTrials vs Trialsの使い分けが頻出です。

探索戦略の比較

ハイパーパラメータの探索空間から最適な組み合わせを見つけるためのアルゴリズムは、大きく3種類に分かれます。

戦略仕組み長所短所代表ツール
Grid Search指定した全組み合わせを網羅的に試行再現性が高い。パラメータ数が少ない場合に有効探索空間が指数的に増加(次元の呪い)scikit-learn GridSearchCV
Random Search探索空間からランダムにサンプリングGrid Searchより少ない試行で良い解を発見しやすい重要でないパラメータにも均等にリソースを割くscikit-learn RandomizedSearchCV
Bayesian Optimization過去の試行結果から確率モデル(TPE等)を構築し、次に試すべき点を予測少ない試行で最適解に収束。高次元空間に強い逐次依存性があり純粋な並列化に工夫が必要Hyperopt (TPE), Optuna (TPE)

Databricksの実務・試験の両方で最も重要なのはBayesian Optimization(TPE: Tree-structured Parzen Estimator)です。 HyperoptもOptunaもデフォルトでTPEを採用しており、50〜200回程度のトライアルで高次元空間でも良好な解を見つけられます。

Hyperoptの基本

HyperoptはDatabricksに組み込まれているベイズ最適化ライブラリです。fmin()関数に目的関数・探索空間・アルゴリズム・最大試行数を渡すだけでチューニングが実行されます。

探索空間の定義

関数用途
hp.choice(label, options)カテゴリカル値(離散選択)hp.choice("algo", ["rf", "xgb", "lgb"])
hp.uniform(label, low, high)一様分布(連続値)hp.uniform("dropout", 0.1, 0.5)
hp.loguniform(label, low, high)対数一様分布(学習率など桁が変わるパラメータ)hp.loguniform("lr", log(1e-5), log(1e-1))
hp.quniform(label, low, high, q)量子化一様分布(整数パラメータ)hp.quniform("max_depth", 3, 15, 1)

Hyperopt + MLflow 統合コード例

from hyperopt import fmin, tpe, hp, STATUS_OK, SparkTrials
import mlflow
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

# 探索空間の定義
search_space = {
    "n_estimators": hp.quniform("n_estimators", 50, 500, 50),
    "max_depth": hp.quniform("max_depth", 3, 15, 1),
    "min_samples_split": hp.quniform("min_samples_split", 2, 20, 1),
    "learning_rate": hp.loguniform("learning_rate", np.log(1e-4), np.log(1e-1)),
}

# 目的関数(最小化対象を返す)
def objective(params):
    params["n_estimators"] = int(params["n_estimators"])
    params["max_depth"] = int(params["max_depth"])
    params["min_samples_split"] = int(params["min_samples_split"])

    clf = RandomForestClassifier(**params, random_state=42)
    score = cross_val_score(clf, X_train, y_train, cv=3, scoring="f1").mean()

    # MLflowにメトリクスを記録
    mlflow.log_metrics({"f1_cv": score})

    # STATUS_OKとlossを返す(lossは最小化される)
    return {"loss": -score, "status": STATUS_OK}

# SparkTrialsで分散実行
spark_trials = SparkTrials(parallelism=8)

with mlflow.start_run(run_name="hyperopt_rf_tuning"):
    best_params = fmin(
        fn=objective,
        space=search_space,
        algo=tpe.suggest,       # TPE(Bayesian Optimization)
        max_evals=100,          # 最大100トライアル
        trials=spark_trials,    # Spark Executorで並列実行
    )

目的関数は必ず {"loss": 値, "status": STATUS_OK} の形式で辞書を返します。lossはfminが最小化する値なので、精度を最大化したい場合は負の値(-score)を返します。

SparkTrials vs Trials 比較

Hyperoptの実行モードを決めるのがTrialsクラスの選択です。クラスタリソースを活用するかどうかで大きく性能が変わります。

項目TrialsSparkTrials
実行場所ドライバーノード(単一マシン)Spark Executor(クラスタ全体)
並列度逐次実行のみparallelismパラメータで並列数を指定
適したモデルscikit-learn等の単一マシンMLscikit-learn等の単一マシンML(各Executorで独立実行)
MLflow連携手動でログ記録が必要各トライアルをネストされたRunとして自動記録
推奨parallelismクラスタのワーカー数と同じか、max_evalsの平方根
注意点100トライアルでもドライバー1台で逐次処理parallelismが高すぎるとTPEの逐次最適化の利点が減る

SparkTrialsのparallelismにはトレードオフがあります。 値を大きくすると物理的な並列度は上がりますが、TPEは過去の結果を使って次の探索点を決めるため、 並列度が高すぎると「まだ結果が返っていないトライアルが多い状態」で次の点を選ぶことになり、ランダム探索に近づきます。 実務では max_evals の平方根程度が推奨されています。

Optunaの基本

Optunaは日本のPreferred Networks社が開発したベイズ最適化フレームワークです。Hyperoptとは異なり、Pruning(早期打ち切り)を標準サポートしており、無駄なトライアルを途中で打ち切ることで計算コストを削減できます。

Optunaの主要API

API役割
optuna.create_study(direction)最適化スタディの作成("minimize" or "maximize")
study.optimize(objective, n_trials)指定回数の最適化を実行
trial.suggest_int(name, low, high)整数パラメータの探索
trial.suggest_float(name, low, high, log)浮動小数点パラメータの探索(log=Trueで対数スケール)
trial.suggest_categorical(name, choices)カテゴリカル値の探索
trial.report(value, step)中間結果の報告(Pruning判定に使用)
trial.should_prune()Pruning判定(Trueなら早期終了)

Optuna + MLflow 統合コード例

import optuna
import mlflow
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score

def objective(trial):
    params = {
        "n_estimators": trial.suggest_int("n_estimators", 50, 500),
        "max_depth": trial.suggest_int("max_depth", 3, 15),
        "learning_rate": trial.suggest_float("learning_rate", 1e-4, 1e-1, log=True),
        "subsample": trial.suggest_float("subsample", 0.5, 1.0),
        "min_samples_split": trial.suggest_int("min_samples_split", 2, 20),
    }

    clf = GradientBoostingClassifier(**params, random_state=42)
    score = cross_val_score(clf, X_train, y_train, cv=3, scoring="f1").mean()

    # MLflowにトライアル結果を記録
    with mlflow.start_run(nested=True):
        mlflow.log_params(params)
        mlflow.log_metric("f1_cv", score)

    return score

with mlflow.start_run(run_name="optuna_gbm_tuning"):
    study = optuna.create_study(direction="maximize")
    study.optimize(objective, n_trials=100)

    # 最良パラメータの記録
    mlflow.log_params(study.best_params)
    mlflow.log_metric("best_f1", study.best_value)

Hyperopt vs Optuna 比較

項目HyperoptOptuna
探索アルゴリズムTPE、Random Search、Adaptive TPETPE、CMA-ES、Random Search、Grid Search、GP
Databricks分散対応SparkTrialsでネイティブ対応Joblib等で並列化可能だがSpark統合はなし
Pruning(早期打ち切り)標準サポートなしMedianPruner / HyperbandPruner等を標準装備
目的関数の返り値loss(最小化)+ STATUS_OKの辞書スカラー値(direction指定で最大/最小化を選択)
MLflow連携SparkTrials使用時に自動記録手動でmlflow.start_run(nested=True)
AutoMLとの関係Databricks AutoMLの内部エンジンAutoMLでは使用されない
可視化MLflow UIを利用optuna.visualizationで探索過程を可視化
試験での重要度ML Associate / ML Professional で頻出直接の出題は少ないが概念理解に有用

AutoMLとの関係

Databricks AutoMLは、データを渡すだけで前処理・特徴量エンジニアリング・モデル選択・ハイパーパラメータチューニングを自動実行する機能です。内部でHyperoptのTPEアルゴリズムを使って各モデルのハイパーパラメータを探索し、全トライアルをMLflow Experimentに自動記録します。

  • AutoMLが生成する各Notebookには、Hyperoptを使ったチューニングコードが含まれている
  • 生成されたNotebookを編集して探索空間を拡張したり、独自の前処理を追加したりできる
  • AutoMLは「ベースライン構築」として使い、その後Hyperoptで精密チューニングするパターンが実務では一般的
  • AutoMLの結果はMLflow Experimentに記録されるため、手動チューニングの結果と直接比較可能

MLflow Tracking連携

Hyperopt + SparkTrialsを使用すると、各トライアルは親Runの下にネストされた子Runとして自動記録されます。これにより、MLflow UIで全トライアルのパラメータ・メトリクスを一覧比較できます。

  • 親Run: mlflow.start_run()で作成。チューニング全体のメタ情報を記録
  • 子Run: SparkTrialsが各トライアルを自動的にネストRunとして記録(パラメータ・loss・status)
  • Compare機能: 子Run間のメトリクスをPlotで比較し、パラメータの影響を分析
  • 最良のRunのモデルをModel Registryに登録してデプロイまでシームレスに進められる

分散チューニングのベストプラクティス

  • parallelismの設定: max_evalsの平方根を目安にする。100トライアルなら parallelism=10 程度。高すぎるとTPEの探索効率が低下する
  • early stopping: fminに渡す early_stop_fn で、目標精度到達時に探索を打ち切る
  • 探索空間の型: 学習率には hp.loguniform(桁が変わるパラメータ)、木の深さには hp.quniform(整数パラメータ)を使う
  • クラスタサイジング: SparkTrialsの各トライアルは1 Executor = 1トライアルで実行される。GPUモデルの場合はワーカーあたり1GPUを確保する
  • データサイズとキャッシュ: 訓練データが大きい場合、spark.broadcast() やDBFSへの事前書き出しでデータ転送コストを削減する
  • 再現性の確保: np.random.seed() と rstate パラメータでシード固定。ただし分散実行では実行順序が非決定的になる点に注意

試験出題ポイント

試験出題範囲重要ポイント
ML AssociateHyperoptの基本fmin / hp.choice / hp.loguniform / STATUS_OKの意味と使い方
ML Associate探索戦略の違いGrid Search vs Random Search vs Bayesian Optimizationの特徴
ML ProfessionalSparkTrials vs Trials分散実行と単一マシン実行の違い、parallelismの設定
ML ProfessionalMLflow連携SparkTrials使用時の自動ネストRun記録、結果の比較
ML ProfessionalAutoMLとの関係AutoMLが内部でHyperoptを使用している事実、生成Notebookの活用

問題で確認

ML Professional

問題 1

MLエンジニアが8ワーカーのDatabricksクラスタ上で、scikit-learnのランダムフォレストに対して100パターンのハイパーパラメータチューニングを実行したい。クラスタリソースを最大限活用しつつ、TPEの探索効率も維持する方法として最も適切なのはどれか。

  1. fmin()にTrialsオブジェクトを渡し、ドライバーノードで100トライアルを逐次実行する
  2. fmin()にSparkTrials(parallelism=8)を渡し、各Executorでトライアルを並列実行する。parallelismはmax_evalsの平方根(=10)程度が推奨だが、ワーカー数と同じ8は許容範囲である
  3. fmin()にSparkTrials(parallelism=100)を渡し、100トライアル全てを同時に実行する
  4. Optunaのcreate_studyを使い、Joblib並列化でSpark Executorに分散する

正解: B

SparkTrialsを使えばSpark Executorにトライアルを分散できます。parallelism=8はワーカー数と一致し、max_evals(100)の平方根(≈10)にも近いため合理的です。選択肢Aはクラスタリソースを活用しません。選択肢Cはparallelism=100でTPEの「過去の結果を活用して次の点を選ぶ」利点がほぼ失われ、ランダム探索と同等になります。選択肢DのOptunaはDatabricksのSparkTrials統合を持たず、最適な方法ではありません。

よくある質問

HyperoptとOptunaはどちらを使うべきですか?

Databricksエコシステムとの統合を重視するならHyperoptが第一選択です。SparkTrialsによるクラスタ全体での分散チューニング、AutoMLの内部エンジンとしての採用、MLflow Trackingとの自動連携が強みです。一方、Pruning(早期打ち切り)による効率化やTPE以外の探索アルゴリズム(CMA-ES等)が必要な場合、または他クラウドやオンプレミスでも同一コードを使いたい場合はOptunaが適しています。試験対策ではHyperoptが優先です。

SparkTrialsとTrialsの違いは何ですか?

Trialsは単一マシン上で逐次的にトライアルを実行するクラスで、ドライバーノード1台のリソースしか使いません。SparkTrialsはSpark Executorにトライアルを分散し、クラスタ全体で並列実行します。たとえば8ワーカーのクラスタなら最大8トライアルを同時実行でき、100トライアルの実行時間を大幅に短縮できます。ML Professional試験ではこの違いが頻出です。

ハイパーパラメータチューニングとAutoMLの関係は?

Databricks AutoMLは内部でHyperoptを使用してハイパーパラメータ探索を行います。AutoMLは前処理・特徴量エンジニアリング・モデル選択・チューニングを自動化する上位レイヤーで、各トライアルはMLflowに自動記録されます。AutoMLが生成したNotebookにはHyperoptのコードが含まれており、それをカスタマイズして独自のチューニングパイプラインを構築することも可能です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Databricks

Databricks資格一覧|全7試験・難易度・勉強法

Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...

Databricks

Databricks試験の難易度ランキング|全7資格を徹底比較

Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...

Databricks

Databricks資格の勉強方法|最短合格ルートと学習時間の目安

Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...

Databricks

Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略

Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...

Databricks

Databricks Data Engineer Professional完全解説|上級試験の攻略法

Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...

Databricksの記事一覧 (109件)
© 2026 NicheeLab All rights reserved.