OptunaにLightGBMが組み込まれて、より簡単に利用できるようになったので試してみました。
(ちなみに、オプチューナーと読むのが正しいようです。)
基本的に、LightGBMのimport文をoptuna配下のLightGBMに書き換え、train部分に少しの手直しするだけで簡単に使うことができます。
自動でサーチされるパラメータは下記の7つ。
- lambda_l1
- lambda_l2
- num_leaves
- feature_fraction
- bagging_fraction
- bagging_freq
- min_child_samples
(私の場合、別途num_boost_roundとearly_stopping_roundsを設定して、early_stopするようにします。)
まずOptunaをインストール。LightGBMもOptunaに入っています。
1 |
pip install optuna |
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.datasets import make_classification # import lightgbm as lgb import optuna.integration.lightgbm as lgb # ダミーのデータセット作成 data = make_classification(n_samples=10000, n_features=100, n_classes=2) X = pd.DataFrame(data[0]) y = pd.DataFrame(data[1]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=False) X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.3, shuffle=False) # train用・valid用のデータセットを生成する lgb_train = lgb.Dataset(X_train, y_train) lgb_val = lgb.Dataset(X_val, y_val, reference=lgb_train) # ベストなパラメータ、途中経過を保存する best_params, tuning_history = dict(), list() lgbm_params = {'objective': 'binary', 'learning_rate':0.01, 'num_boost_round':10000, 'early_stopping_rounds':10 } # 学習 model = lgb.train(lgbm_params, lgb_train, valid_sets=lgb_val, verbose_eval=0, best_params=best_params, tuning_history=tuning_history) |
best_paramsを使って学習・予測
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import lightgbm as lgb # 最適なパラメーターで学習 # train用・valid用のデータセットを生成する lgb_train = lgb.Dataset(X_train, y_train) lgb_val = lgb.Dataset(X_val, y_val, reference=lgb_train) # 学習 model = lgb.train(best_params, lgb_train, valid_sets=lgb_val) # フォールドアウト検証 predict_proba = model.predict(X_test) |
以上です。めっちゃ楽。
参考
PFNの公式ブログ
Optuna の拡張機能 LightGBM Tuner によるハイパーパラメータ自動最適化