sklearnとOptunaとによりk分割交差検証を行い、LightGBMのハイパーパラメータサーチを行う方法についてです。
2020/6/6追記
Optunaのバージョンアップ(1.5.0)に伴い、LightGBM専用のクロスバリデーションの機能が実装されたようです。その使用方法については、以下を参照ください。
以下は、Optuna 1.5.0以前に検討した内容です。
はじめに
OptunaによるLightGBMの導入や基本的な動かし方は、以前の記事を参照ください。
交差検証に使用する関数
今回はscikit-learnのkFoldおよびcross_validateを使用します。

sklearn.model_selection.KFold
Examples using sklearn.model_selection.KFold: Feature agglomeration vs. univariate selection Feature agglomeration vs. univariate selection, Gradient Boosting O...

sklearn.model_selection.cross_validate
Examples using sklearn.model_selection.cross_validate: Categorical Feature Support in Gradient Boosting Categorical Feature Support in Gradient Boosting, Combin...
交差検証を行うためのコード
コードは以下のようになります。
1行目のKFoldで、データをn_splitsで指定したfold数に分割します。
2行目の、cross_validateで、交差検証を行っています。
cross_validate中のscoringで、評価を行うための指標を設定します。
kf = KFold(n_splits=3, shuffle=True, random_state=0) scores = cross_validate(model, X=X_train, y=y_train,scoring='r2',cv=kf) #各foldの評価結果が格納されているため、平均化した値をOptunaに返す。 return scores['test_score'].mean()
評価指標の一覧

3.3. Metrics and scoring: quantifying the quality of predictions
There are 3 different APIs for evaluating the quality of a model’s predictions: Estimator score method: Estimators have a score method providing a default evalu...
全体コード例
以下に、k-fold交差検定とOptunaの組み合わせでLightGBMのハイパーパラメータサーチ行った一連の流れのコードについて記載します。
In [17]:
import lightgbm as lgb
from sklearn.model_selection import train_test_split,KFold,cross_validate
import sklearn.datasets
import optuna
In [20]:
def objectives(trial):
# scikit-learnでお試しデータの準備
boston = sklearn.datasets.load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=0)
# optunaでのハイパーパラメータサーチ範囲の設定
params = {
#fixed
'boosting_type':'gbdt',
'max_depth':-1,
'learning_rate':0.1,
'n_estimators': 1000,
'metric':'l2',
#variable
'num_leaves': trial.suggest_int('num_leaves', 10, 300),
'reg_alpha': trial.suggest_loguniform('reg_alpha',0.001, 10),
'reg_lambda':trial.suggest_loguniform('reg_lambda', 0.001, 10),
}
# LightGBMで学習+予測
model = lgb.LGBMRegressor(**params,random_state=0)# 追加部分
# kFold交差検定で決定係数を算出し、各セットの平均値を返す
kf = KFold(n_splits=3, shuffle=True, random_state=0)
scores = cross_validate(model, X=X_train, y=y_train,scoring='r2',cv=kf)
return scores['test_score'].mean()
In [23]:
%%time
# optunaによる最適化呼び出し
opt = optuna.create_study(direction='maximize')
opt.optimize(objectives, n_trials=5)
# 実行結果表示
print('最終トライアル回数:{}'.format(len(opt.trials)))
print('ベストトライアル:')
trial = opt.best_trial
print('値:{}'.format(trial.value))
print('パラメータ:')
for key, value in trial.params.items():
print('{}:{}'.format(key, value))
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
以上が、 k-fold交差検証とOptunaの組み合わせによりLightGBMのハイパーパラメータサーチを行う方法の紹介となります。
コメント
[…] Optuna+sklearnを用いたk分割交差検証で、LightGBMのハイパーパラメータ調整をしてみるOptuna+sklearnを用いたk分割交差検証で、LightGBMのハイパーパラメータ調整をした内容の紹介ですkiseno-log.com2 […]