機械学習のハイパパラメータ調整において、Define by RunスタイルのOptunaというライブラリーを使おうと思っています。ただ、このハイパパラメータ調整を一つの操作単位として、パラメータ探索範囲を変えたり、機械学習モデルを変えたりしたく、この操作単位そのものを関数化してfor文で回したいと思っています。
ただ、Defineパートのdefをさらにdefで囲ってしまう方法をとると、実行時、引数に未定義関数が入ってしまってエラーになります。
辞書やDataFrameなりを使って、未定義関数を使わない引数を使ることはできるのですが、(自分の実装力だと)構造がややこしくなるので、シンプルに設計したいのですが、いい方法があれば教えていただけないでしょうか?
Optunaの説明
for文を使わない場合のOptunaの実行例
↓は動きます
# Defineパート def objective(trial): # 探索パラメータの設定。trial.suggestでパラメータの探索範囲を指定 param_grid = { "max_depth": trial.suggest_int("max_depth", 1, 15), "min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 5), 'bootstrap': trial.suggest_categorical('bootstrap', [True, False]) } # 機械学習手法の指定 model = RandomForestRegressor(**param_grid) scores = cross_validate(model, X=X, y=y, cv=5, scoring={"neg_mean_squared_error"}) # 最適化するのはscore平均値と指定 return scores['test_neg_mean_squared_error'].mean() # Runパート study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=20)
↓はtrialが定義されていないとエラーが出て動きません。
# 学習全体の関数 def optimization(param_grid): # Defineパート def objective(trial): # 機械学習手法の指定 model = RandomForestRegressor(**param_grid) scores = cross_validate(model, X=X, y=y, cv=5, scoring={"neg_mean_squared_error"}) # 最適化するのはscore平均値と指定 return scores['test_neg_mean_squared_error'].mean() # Runパート study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=20) # trialが定義されていないとエラーが出る param_grid = { "max_depth": trial.suggest_int("max_depth", 1, 15), "min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 5), 'bootstrap': trial.suggest_categorical('bootstrap', [True, False]) } optimization(param_grid)
回答1件
あなたの回答
tips
プレビュー