Kaggle Tutorial

ハイパラ最適化 — Grid/Random・Optuna

グリッド/ランダム探索と Optuna によるベイズ最適化で、ハイパーパラメータを効率的に探索します。

探索方法の比較#

ハイパーパラメータの探索方法には大きく 3 つあります。

方法概要特徴
Grid Search候補の全組み合わせを試す網羅的だが組み合わせ爆発で高コスト
Random Searchランダムに候補を試す少ない試行でも当たりやすい
ベイズ最適化(Optuna)過去の結果から有望な領域を重点探索少ない試行で効率的

Optuna によるベイズ最適化#

Optuna は、試行結果を使って次に試す値を賢く選ぶライブラリです。 目的関数で 交差検証 スコアを返すのが基本形です。

import optuna
import lightgbm as lgb
from sklearn.model_selection import cross_val_score, StratifiedKFold

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

def objective(trial):
    params = {
        "n_estimators": 1000,
        "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.2, log=True),
        "num_leaves": trial.suggest_int("num_leaves", 16, 256),
        "subsample": trial.suggest_float("subsample", 0.6, 1.0),
        "colsample_bytree": trial.suggest_float("colsample_bytree", 0.6, 1.0),
        "reg_lambda": trial.suggest_float("reg_lambda", 1e-3, 10.0, log=True),
        "random_state": 42,
    }
    model = lgb.LGBMClassifier(**params)
    return cross_val_score(model, X, y, cv=cv, scoring="roc_auc").mean()

study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)
print(study.best_params, study.best_value)

探索空間の設計が肝心#

  • 対数スケールで振るべき値(学習率・正則化)は log=True を指定する
  • 範囲は広すぎず狭すぎず。まず粗く探索し、良い領域を絞って再探索する
  • 木の本数は最適化せず、大きめ固定+早期終了に任せると安定する

注意

最適化のたびに同じ CV 分割(固定シード)で評価しないと、スコアの上下が探索ノイズに埋もれます。 また Optuna で CV スコアを過度に追い込むと検証データに過適合します。最後は別シードの CV で確認しましょう。

このトラックのまとめ#

理解度チェック#

QuizOptuna でハイパラ最適化するとき、木の本数(n_estimators)の扱いとして適切なのは?

次のステップ#

Phase 2 の基礎トラック(L2〜L5)はここで一区切りです。以降のトラック(L6 アンサンブル & ワークフロー、L7 ディープラーニング、L8 上級)で、さらに実戦的な技術へ進みます。