automl-hyperparameter-optimization について
AutoMLやハイパーパラメーター探索を計画する機械学習実務者向けのスキルです。データ漏洩を防ぐ検証、ツール選定、計算資源の制限、ベースラインとの比較を扱います。
主な機能
- 01検証設計とデータ漏洩の防止
- 02構造化された探索空間の設計
- 03AutoML・チューニングツールの選定
- 04枝刈りと予算による探索制限
- 05実験記録とベースライン比較
活用シーン
- 01信頼性のあるモデル調整実験の計画
- 02時系列予測向けの検証・ツール選定
- 03高コストな探索の計算量制限
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill automl-hyperparameter-optimizationインストール後、Claude Code で/automl-hyperparameter-optimizationを入力して読み込まれたか確認します。
詳細
AutoML とハイパーパラメーター最適化
このスキルでは、適切なハイパーパラメーター探索の設計と、問題の設定、検証設計、説明可能性をおろそかにせずに AutoML ツール(Optuna、Ray Tune、PyCaret、時系列 AutoML ライブラリ)を使用する方法を扱います。
ハイパーパラメーター探索のワークフロー
- まず目標指標とベースラインを定義する — ツールを選ぶ前に指標を決め、探索範囲を固定して最小限にしたシンプルなベースライン(線形モデル、ランダムフォレスト、または単純な時系列予測)を学習します。
- 検証方法を設計する — モデル選択に関する主張を行う場合は、ネストされた交差検証、または最後まで未使用のテスト分割を使います。時系列の問題では、時間を考慮した分割(シャッフルは決してしない)を使います。
- 各分割の学習データ内で前処理を適合させる — データ漏洩を防ぐため、スケーラー、エンコーダー、補完器は各分割の学習部分だけで適合させます。
- 構造化された探索空間を定義する — 学習率、正則化の強さ、木の数には対数スケールの範囲を使い、範囲は恣意的に広げず、ドメインの知識に基づいて設定します。
- 適切なツールを選ぶ — プルーニングや分散トライアルを使ったカスタム学習ループには Optuna または Ray Tune、単純な表形式データの問題を手早くローコードで比較するには PyCaret、季節性や予測期間の扱いに第一級のサポートが必要な場合は時系列専用ライブラリ(AutoTS、Merlion、PyAF)を使います。
- リソース制限とプルーニングを設定して実行する — トライアル数または時間の予算を設定し、早期終了やプルーニングを使って、性能の悪いトライアルが予算を使い切らないようにします。
- すべての実行を記録する — データセット、分割方法、指標の定義、乱数シード、ライブラリのバージョン、探索空間自体を MLflow、Weights & Biases、TensorBoard、または同等のトラッカーに記録します。
- ベースラインと比較して報告する — 選択したモデルをベースラインおよび少なくとも 1 つの非 AutoML の代替手法と比較してから、本番運用に適していると判断します。
実験設計
- ツールを選ぶ前に目標指標を定義します — 探索空間やプルーニング戦略を決めるのは指標であり、その逆ではありません。
- モデル選択に関する主張を報告する場合は、ネストされた検証(ハイパーパラメーター選択を行う内側のループと、性能を推定する外側のループ)、または最後まで未使用のテスト分割を使います。
- 時系列の問題では、時間を考慮した分割を使います — 時間の境界を越えてシャッフルすると、未来の情報が学習に漏洩するため、決して行わないでください。
- すべての前処理(スケーラー、エンコーダー、補完器、特徴量選択)は学習用フォールドだけで適合させ、検証データやテストデータでは決して適合させないでください。
- シンプルなベースラインを必ず含めます。線形/ロジスティックモデル、ランダムフォレスト、または時系列の場合は単純な予測/季節性を考慮した単純な予測を使います。ベースラインを上回らない複雑なモデルは、運用コストに見合いません。
- 計算コストの高い探索では、早期終了とリソース制限(最大トライアル数、実時間の予算)を使い、探索が際限なく計算リソースを消費しないようにします。
- 恣意的に広いグリッドより、構造化され、ドメインの知識に基づいた探索空間を優先します — 対数スケールの
1e-5から1e-1までの学習率範囲は、線形スケールの0.0001から10までよりも有用です。
探索空間の設計
- 探索空間を明示し、作成者以外の人によるレビューを受けます — レビューされていない探索空間は、最適解を気づかないうちに除外したり、妥当性のない領域で予算を浪費したりする可能性があります。
- 学習率、正則化係数、木の数など、スケールに敏感なハイパーパラメーターのサンプリングには対数スケールを使います。
- モデルの複雑さ(最大深度、層の幅、推定器の数)を制限し、デプロイ環境で学習時間とメモリ使用量が現実的な範囲に収まるようにします。
- データ漏洩なしにフォールドごとに適用できる場合に限り、前処理の選択肢を探索空間に含めます。
- テストセットでは決してチューニングしないでください — チューニング完了後に、偏りのない最終推定値を報告することだけがテストセットの役割です。
ツール
Optuna — プルーニングを使ったカスタムループ
学習ループの細かな制御、試行のプルーニング、探索アルゴリズム(TPE、CMA-ES)には Optuna を使用します。
import optuna
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold
X, y = load_breast_cancer(return_X_y=True)
def objective(trial: optuna.Trial) -> float:
params = {
"n_estimators": trial.suggest_int("n_estimators", 50, 500, log=True),
"max_depth": trial.suggest_int("max_depth", 2, 10),
"learning_rate": trial.suggest_float("learning_rate", 1e-3, 3e-1, log=True),
"subsample": trial.suggest_float("subsample", 0.5, 1.0),
}
model = GradientBoostingClassifier(random_state=42, **params)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=cv, scoring="roc_auc")
# Report the running mean for pruning support
trial.report(scores.mean(), step=0)
if trial.should_prune():
raise optuna.TrialPruned()
return scores.mean()
study = optuna.create_study(
direction="maximize",
sampler=optuna.samplers.TPESampler(seed=42),
pruner=optuna.pruners.MedianPruner(n_warmup_steps=5),
)
study.optimize(objective, n_trials=100, timeout=1800)
print("Best AUROC:", study.best_value)
print("Best params:", study.best_params)
- 有望でない試行を早期に停止するには、
optuna.pruners.MedianPrunerまたはHyperbandPrunerを使用します。特に、反復型モデル(勾配ブースティング、ニューラルネットワーク)で有効です。 - 探索が必ず予算内に終了するよう、
n_trialsとtimeoutの両方を設定します。 - 再現性を確保するためサンプラーにシードを設定し、
study.trials_dataframe()を実験トラッカーに記録します。
Ray Tune — 分散試行
複数のマシンや GPU にまたがって試行を実行する必要がある場合や、ASHA などのプルーニングスケジューラーを深層学習の学習ループに組み込む場合は、Ray Tune を使用します。
from ray import tune
from ray.tune.schedulers import ASHAScheduler
def train_fn(config):
# ... build model/optimizer from config, train for several epochs ...
for epoch in range(config["max_epochs"]):
val_loss = train_one_epoch(config) # user-defined training step
tune.report({"val_loss": val_loss})
search_space = {
"lr": tune.loguniform(1e-4, 1e-1),
"batch_size": tune.choice([32, 64, 128]),
"max_epochs": 20,
}
tuner = tune.Tuner(
train_fn,
param_space=search_space,
tune_config=tune.TuneConfig(
metric="val_loss",
mode="min",
scheduler=ASHAScheduler(max_t=20, grace_period=3),
num_samples=50,
),
)
results = tuner.fit()
best_result = results.get_best_result()
print(best_result.config, best_result.metrics["val_loss"])
PyCaret — 手軽なローコード比較
指標や前処理の要件が単純な、一般的な表形式データの問題で、最初の素早い評価を行うには PyCaret を使用します。
from pycaret.classification import setup, compare_models, tune_model, finalize_model
setup(data=df, target="churn", train_size=0.8, session_id=42)
best_model = compare_models(sort="AUC")
tuned_model = tune_model(best_model, optimize="AUC", n_iter=50)
final_model = finalize_model(tuned_model)
PyCaret のリーダーボードは調査の出発点として扱い、それだけで本番環境への採用を決定しないでください。
時系列 AutoML
生のモデルの多様性よりも、季節性の検出、予測期間の処理、ローリングウィンドウを使ったバックテストなど、予測固有の考慮事項が重要な場合は、AutoTS、Merlion、PyAF、またはプロジェクトで承認された別の時系列ライブラリを使用します。これらのライブラリには、汎用の表形式 AutoML ツールとは異なり、時間を考慮した交差検証がデフォルトで組み込まれています。
実験の追跡と環境
- 実行メタデータ(指標、パラメーター、シード、データのバージョン、ライブラリのバージョン)を MLflow、Weights & Biases、TensorBoard、またはプロジェクトで承認されたトラッカーに保存します。記憶や場当たり的なスプレッドシートに頼らないでください。
- 探索環境の再現性を保つため、
uvまたはプロジェクトで既に使用しているパッケージマネージャーを使います。サンプラーやプルーナーの動作はリリースによって変わることがあるため、ライブラリのバージョンを固定してください。
レポート
- 選択したモデル、使用した指標、信頼区間または分散の推定値、検証方式、最終的なテスト結果を報告します。本番環境への採用を決める際、単一の点推定だけでは不十分です。
- 最良のハイパーパラメーターと、使用した探索予算(試行回数、実時間)を記載し、探索を再現可能にするとともに、そのコストを明らかにします。
- 選択したモデルをベースラインおよび AutoML 以外のモデル少なくとも 1 つと比較します。
- 運用上の制約(推論レイテンシー、メモリ使用量、再学習コスト、説明可能性の要件)を文書化します。リーダーボードで首位のモデルでも、レイテンシー SLA に違反する場合は、そのままではデプロイできません。
よくある間違い
- リーダーボードの順位を、本番環境で使用できることの証明として扱うこと。リーダーボードの指標では、レイテンシー、メモリ、説明可能性の制約が考慮されません。
- 特徴量エンジニアリング中に訓練データとテストデータを混在させること(例:分割前に平均値や頻度エンコーディングなどの全体統計を計算する)。
- ラベルとデータ品質を検証する前に大規模な探索を実行すること。探索は、バグのある目的変数に対しても問題なく「最適化」してしまいます。
- 最適化指標が反映していない場合に、クラス不均衡、キャリブレーション、ビジネスコストの非対称性を無視すること(例:クラス比が 99:1 のデータで正解率を最適化する)。
- 再現可能な学習コードとバージョンを固定した依存関係なしに、AutoML が選択したモデルをデプロイすること。勝者となった試行を再実行できなければ、保守できません。
コメント
Markdown 対応