Optunaでクロスバリデーションを用いたハイパーパラメータの探索

Source Code Software Computer機械学習

scikit-learn interfaceのestimatorに対して、交差検証をしながらハイパーパラメータの探索をおこなう機能がOptunaに試験的に実装されているようなので使用してみました。

なお、LightGBMなどには専用のクラスが用意されているようです。

LightGBMについては以下を参照ください。

クロスバリデーション実行のためのクラス

optuna.integration.OptunaSearchCVにより実施が可能なようです。

ハイパーパラメータの探索範囲は、optunaのDistributionsを使用して設定します。

OptunaSearchCVには、交差検証のk分割数や、試行回数、評価スコアの設定が可能です。

実行コードの概要

# 探索パラメータ範囲の設定
param_distributions = {
    'ハイパーパラメータ名': optunaディストリビューションによる探索範囲の設定
}

# クロスバリデーションによる、ハイパーパラメータの探索設定.よく使いそうな設定値のみを書き出している
optuna_search = optuna.integration.OptunaSearchCV(estimator,param_distributions,cv=5, n_jobs=1,n_trials=10,random_state=0,scoring='r2')

# 探索の実施
optuna_search.fit(X_trainval, y_trainval)

optunaのDistributions

optuna.distributions — Optuna 2.3.0 documentation

OptunaSearchCV

optuna.integration — Optuna 2.3.0 documentation

実施コード例

import sklearn.datasets
from sklearn.model_selection import train_test_split
import optuna
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score

# scikit-learnでお試しデータの準備
boston = sklearn.datasets.load_boston()
X_trainval, X_test, y_trainval, y_test = train_test_split(boston.data, boston.target, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_trainval, y_trainval, random_state=0)


# モデルの準備
model = RandomForestRegressor()

# 探索パラメータ範囲の設定
param_distributions = {
    'n_estimators': optuna.distributions.IntLogUniformDistribution(1e+0, 1e+3, 1), # 整数かつLog領域で、一定ステップで探索
    'max_depth': optuna.distributions.IntUniformDistribution(1, 20, 1), # 整数かつ一定ステップで探索  
}

# クロスバリデーションによる、ハイパーパラメータの探索設定.cvのデフォルト設定値は5
optuna_search = optuna.integration.OptunaSearchCV(model,param_distributions,cv=3, n_jobs=1,n_trials=15,random_state=0,scoring='r2')

# 探索の実施
optuna_search.fit(X_trainval, y_trainval)

# 探索したベストパラメータの表示
best_params = optuna_search.best_params_
print("  Params: ")
for key, value in best_params.items():
    print("    {}: {}".format(key, value))

# 調整後モデルで予測の実行
y_trainval_pred = optuna_search.predict(X_trainval)
y_test_pred = optuna_search.predict(X_test)

# 評価値の計算と表示
r2_trainval = r2_score(y_trainval, y_trainval_pred)
r2_test = r2_score(y_test, y_test_pred)

print("r2_train:{0:.4}".format(r2_trainval))
print("r2_test:{0:.4}".format(r2_test))
実行結果

Params:
 n_estimators: 311
 max_depth: 8
r2_train:0.977
r2_test:0.7961

コメント

タイトルとURLをコピーしました