mcpField
H
hyperparameter-tuning

hyperparameter-tuning

github.com/seb1nデータ・データベース232115 回インストール11 週間前に更新
リポジトリ

hyperparameter-tuning について

計算予算内で機械学習モデルのハイパーパラメーターを探索する、AIエージェント向けスキルです。探索空間の設計、試行の評価と枝刈り、結果分析を行い、最終学習に使う値を選びます。

主な機能

  1. 01カテゴリ、整数、浮動小数点の探索空間定義
  2. 02グリッド、ランダム、ベイズ、Hyperbandの選択
  3. 03交差検証またはホールドアウトによる評価
  4. 04成績の低い試行の早期打ち切り
  5. 05パラメーターの重要度と相互作用の分析
  6. 06最終モデル学習用パラメーターの選定

活用シーン

  1. 01目標指標に合わせたモデルの調整
  2. 02試行予算内での探索手法の比較
  3. 03計算資源節約のための低成績試行の終了
  4. 04モデル性能に影響するパラメーターの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/seb1n/awesome-ai-agent-skills --skill hyperparameter-tuning

インストール後、Claude Code で/hyperparameter-tuningを入力して読み込まれたか確認します。

詳細

ハイパーパラメーターのチューニング

このスキルを使うと、AI エージェントは機械学習モデルに最適なハイパーパラメーター構成を体系的に探索できます。探索空間の定義、探索戦略(グリッド、ランダム、ベイズ、Hyperband)の選択、交差検証による試行の実行、性能の低い構成を除外するための早期終了の適用、結果の分析による最良のパラメーターの特定を扱います。エージェントは探索と活用のバランスを取り、与えられた計算予算内で優れた構成を見つけます。

ワークフロー

  1. 探索空間を定義する: 各ハイパーパラメーターの型(カテゴリ、整数、浮動小数点数)と範囲を指定します。桁違いの範囲にわたるパラメーター(例:1e-5 から 1e-1 までの学習率)には、対数一様分布を使用します。関連するパラメーターをグループ化し、特定のパラメーターがほかのパラメーターの値に応じて適用される条件付き探索空間を定義します。

  2. 探索戦略を選択する: 計算予算と探索空間の大きさに基づいて、チューニングアルゴリズムを選択します。グリッドサーチは網羅的ですが、小規模な探索空間でしか実用的ではありません。ランダムサーチは優れたベースラインとなり、より大きな探索空間にも対応できます。ベイズ最適化(Tree-structured Parzen Estimators または Gaussian Processes)は、評価にコストがかかる場合に最もサンプル効率が高くなります。Hyperband と ASHA は、深層学習のワークロード向けに、早期終了とランダムサーチを組み合わせます。

  3. 評価を設定する: 小規模から中規模のデータセットで信頼性の高い性能推定を行うには、k 分割交差検証(通常は 5 分割)を設定します。大規模なデータセットや計算コストの高いモデルでは、単一のホールドアウト検証セットを使用します。最適化する評価指標(例:検証 F1、AUC-ROC、RMSE)と、最小化するか最大化するかを定義します。

  4. 枝刈りを適用して試行を実行する: 探索を実行し、可能な場合は試行を並列で開始します。中間結果(例:数エポックの学習後)に基づいて性能の低い試行を早期に終了する枝刈りを有効にし、より有望な構成に計算リソースを割り当てます。

  5. 結果を分析して選択する: 最適化の履歴を調べ、どのハイパーパラメーターが最も重要かを把握します(重要度分析)。等高線プロットや平行座標プロットを使って、パラメーター間の相互作用を可視化します。最良の構成を選択し、そのパラメーターを使って完全な学習セットで最終モデルを再学習します。

対応テクノロジー

  • フレームワーク: Optuna、Ray Tune、scikit-learn GridSearchCV/RandomizedSearchCV、Hyperopt、Keras Tuner
  • 枝刈りアルゴリズム: 中央値による枝刈り、Hyperband(Successive Halving)、ASHA
  • ベイズ手法: TPE(Tree-structured Parzen Estimators)、GP(Gaussian Process)、CMA-ES
  • 可視化: Optuna visualization(plotly)、TensorBoard HParams、Weights & Biases Sweeps
  • 分散実行: Ray Tune クラスター、分散ストレージを使用した Optuna(MySQL、PostgreSQL)

使用方法

エージェントにモデル、データセット、チューニングするハイパーパラメーターとその範囲、計算予算(試行回数または実行時間)、および目標指標を指定します。エージェントはチューニングのワークフローを実行し、性能分析とともに最良のハイパーパラメーター構成を返します。

例

例 1:ランダムフォレストをチューニングする Optuna Study
import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
import numpy as np

X, y = load_breast_cancer(return_X_y=True)

def objective(trial):
    params = {
        "n_estimators": trial.suggest_int("n_estimators", 50, 500, step=50),
        "max_depth": trial.suggest_int("max_depth", 3, 30),
        "min_samples_split": trial.suggest_int("min_samples_split", 2, 20),
        "min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 10),
        "max_features": trial.suggest_categorical("max_features", ["sqrt", "log2", None]),
        "criterion": trial.suggest_categorical("criterion", ["gini", "entropy"]),
    }
    clf = RandomForestClassifier(**params, random_state=42, n_jobs=-1)
    scores = cross_val_score(clf, X, y, cv=5, scoring="f1")
    return scores.mean()

study = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler(seed=42))
study.optimize(objective, n_trials=100, show_progress_bar=True)

print(f"Best F1: {study.best_value:.4f}")
print(f"Best params: {study.best_params}")

# Visualization
fig_importance = optuna.visualization.plot_param_importances(study)
fig_history = optuna.visualization.plot_optimization_history(study)
fig_contour = optuna.visualization.plot_contour(study, params=["n_estimators", "max_depth"])
例 2:早期終了を備えたニューラルネットワーク向け Ray Tune
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset, random_split
from ray import tune
from ray.tune.schedulers import ASHAScheduler
from ray.air import session
import numpy as np

def train_nn(config):
    X = torch.randn(2000, 20)
    y = (X[:, 0] + X[:, 1] * 2 > 0).long()
    dataset = TensorDataset(X, y)
    train_set, val_set = random_split(dataset, [1600, 400])
    train_loader = DataLoader(train_set, batch_size=config["batch_size"], shuffle=True)
    val_loader = DataLoader(val_set, batch_size=256)

    model = nn.Sequential(
        nn.Linear(20, config["hidden_size"]),
        nn.ReLU(),
        nn.Dropout(config["dropout"]),
        nn.Linear(config["hidden_size"], config["hidden_size"] // 2),
        nn.ReLU(),
        nn.Linear(config["hidden_size"] // 2, 2),
    )
    optimizer = torch.optim.Adam(model.parameters(), lr=config["lr"], weight_decay=config["weight_decay"])
    criterion = nn.CrossEntropyLoss()

    for epoch in range(50):
        model.train()
        for xb, yb in train_loader:
            loss = criterion(model(xb), yb)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        model.eval()
        correct, total = 0, 0
        with torch.no_grad():
            for xb, yb in val_loader:
                correct += (model(xb).argmax(1) == yb).sum().item()
                total += yb.size(0)
        session.report({"val_accuracy": correct / total})

search_space = {
    "hidden_size": tune.choice([64, 128, 256]),
    "lr": tune.loguniform(1e-4, 1e-1),
    "dropout": tune.uniform(0.1, 0.5),
    "batch_size": tune.choice([32, 64, 128]),
    "weight_decay": tune.loguniform(1e-5, 1e-2),
}

scheduler = ASHAScheduler(max_t=50, grace_period=5, reduction_factor=3)
result = tune.run(
    train_nn,
    config=search_space,
    num_samples=50,
    scheduler=scheduler,
    metric="val_accuracy",
    mode="max",
    resources_per_trial={"cpu": 2},
)

print(f"Best config: {result.best_config}")
print(f"Best val accuracy: {result.best_result['val_accuracy']:.4f}")

ベストプラクティス

  • 学習率、重み減衰、正則化の強さには対数一様分布を使用してください。 最適値が複数の桁にわたることが多いためです。
  • まずランダムサーチを開始し、 有望な探索空間の領域をすばやく特定してから、ベイズ最適化に切り替えて細かく探索してください。
  • 早期停止/枝刈りを有効にして、 数エポック後に明らかに性能が劣る設定に計算リソースを浪費しないようにしてください。
  • データセットが小さい場合(サンプル数が 50k 未満)は、目的スコアに必ず交差検証を使用してください。 性能推定のばらつきを抑え、単一の検証用データ分割への過適合を防げます。
  • チューニング後にハイパーパラメーターの重要度分析を実行し、 実際に重要なパラメーターを把握してください。多くの場合、性能差の大半を左右するのは 2~3 個のパラメーターだけです。
  • 事前に計算予算(試行回数、GPU 時間、または実時間)を設定し、 その予算を最も有効に活用できる探索戦略を選んでください。

エッジケース

  • 探索空間が非常に大きい場合(10 次元超): 高次元ではベイズ最適化の性能が低下します。まずランダムサーチまたは Hyperband を使用し、その後、最初の探索で特定した重要度上位 3~5 個のパラメーターを対象にベイズ最適化を実行してください。
  • 目的関数がノイジーな場合: 交差検証スコアのばらつきが大きいと、単一の試行結果は信頼できません。CV の分割数を増やす、反復 k 分割交差検証を使用する、または設定を比較する前に複数のシードで平均を取る、といった方法があります。
  • 相関のあるハイパーパラメーター: 学習率とバッチサイズのように、強く相互作用するハイパーパラメーターがあります。Optuna の等高線プロットまたは fANOVA 重要度を使用して相互作用を検出し、相関のあるパラメーター群をまとめて調整することを検討してください。
  • 評価コストが高い場合(1 試行あたり 1 時間超): Hyperband のようなマルチフィデリティ手法を使用し、まず少ない予算で学習させ、有望な設定だけを完全な学習に進めてください。また、初期スクリーニングには代理ベンチマークや小規模なプロキシデータセットの使用も検討してください。
  • カテゴリの組み合わせが爆発する場合: 複数のカテゴリ型ハイパーパラメーターによって組み合わせが爆発する場合は、条件付き探索空間を使用して無効な組み合わせを枝刈りし、実効的な空間サイズを縮小してください。

コメント