optuna ver1.5.0よりLightGBMでクロスバリデーションを行いながらハイパーパラメータの探索をおこなう機能が追加されたため、その使用方法についての紹介です。
optuna.integration — Optuna 3.1.0 documentation
scikit-learn interfaceをもつestimatorには、別のクラスが試験的に用意されており、そちらで実施可能なようです。
必要なパッケージ
optunaでLightGBM用のクロスバリデーション機能を実行するには、skleranのkFoldと、optunaとLigthGBMをインテグレートしたoptuna.integration.lightgbmをimportする必要があります。
from sklearn.model_selection import KFold
import optuna.integration.lightgbm as lgb
クロスバリデーション実行のためのクラス
LightGBMTunerCVによりクロスバリデーションを行いながらハイパーパラメータの探索が可能です。
ハイパーパラメータは、パラメータを一つずつ順番に最適化するstep-wiseな方法がとられているようです。
# クロスバリデーションによるハイパーパラメータの探索 3fold
tuner = lgb.LightGBMTunerCV(params, trainval, verbose_eval=100, early_stopping_rounds=100, folds=KFold(n_splits=3))
# ハイパーパラメータ探索の実行
tuner.run()
実行コードの例
# データ準備用
import sklearn.datasets
from sklearn.model_selection import train_test_split
# LightGBMおよび交差検定用
from sklearn.model_selection import KFold
import optuna.integration.lightgbm as lgb
# 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)
# LightGBM用のデータセットに変換
trainval = lgb.Dataset(X_trainval, y_trainval)
# ハイパーパラメータサーチ&モデル構築
params = {'objective': 'regression',
'metric': 'rmse',
'random_seed':0}
# クロスバリデーションによるハイパーパラメータの探索 3fold
tuner = lgb.LightGBMTunerCV(params, trainval, verbose_eval=100, early_stopping_rounds=100, folds=KFold(n_splits=3))
# ハイパーパラメータ探索の実行
tuner.run()
# サーチしたパラメータの表示
best_params = tuner.best_params
print(" Params: ")
for key, value in best_params.items():
print(" {}: {}".format(key, value))
実行結果
Params:
objective: regression # 設定値
metric: rmse # 設定値
random_seed: 0 # 設定値
lambda_l1: 0.044785713144250304
lambda_l2: 8.047034885116519
num_leaves: 8
feature_fraction: 0.44800000000000006
bagging_fraction: 0.9123455120761703
bagging_freq: 1
min_child_samples: 20
コメント