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 3.4.0 documentation
OptunaSearchCV
optuna.integration — Optuna 3.4.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
コメント