🐍
【Python】LightGBMのハイパーパラメータをOptunaで最適化する方法
はじめに
この記事はオーム社出版の「Optunaによるブラックボックス最適化」を読んで、私がアレンジしたLightGBMのハイパーパラメータをOptunaで最適化する方法を記載しています。
【リンク紹介】
・これまで書いたシリーズ記事一覧
書籍について
他にも役立つ機能が沢山紹介されており、なんとなくネットに転がっているOptunaの使用例を体系的に丁寧に学ぶことができるので、気になる方は是非お手に取ってみてください。
最適化の方法
それではLightGBMのハイパーパラメータをOptunaで最適化する方法を紹介していきます。
Optunaのインストール
まずはOptunaをインストールします。
!pip install optuna > /dev/null
ライブラリのインポート
次に必要なライブラリをインポートします。
※ここには今回の最適化に必要なものしか載せていませんので注意してください。
from gc import collect # ガーベッジコレクション
from lightgbm import LGBMClassifier as LGBMC
import optuna
from optuna import Trial, trial, create_study
LightGBMのハイパーパラメータをOptunaで最適化する
以下のコードがLightGBMのハイパーパラメータをOptunaで最適化したものになります。
ただし最適化の処理は大変時間がかかり、かつログが大量に出現するので注意してください。
%%time
"""
Xtrain:特徴量
ytrain:目的変数
"""
# 目的関数の定義
def objective(trial):
clf = LGBMC(max_depth = trial.suggest_int('max_depth', 2, 32), # 決定木の深さ
subsample = trial.suggest_float('subsample', 0, 1), # 決定木ごとに学習データの行をサンプリングする割合
colsample_bytree =\
trial.suggest_float('colsample_bytree', 0, 1), # 決定木ごとに特徴量の列をサンプリングする割合
num_leaves = trial.suggest_int('num_leaves', 50, 150),
reg_alpha = trial.suggest_float('reg_alpha', 0, 1), # 決定木の葉のウェイトに対するL1正則化の強さ
reg_lambda = trial.suggest_float('reg_lambda', 0, 1) # 決定木の葉のウェイトに対するL2正則化の強さ
)
score = cross_val_score(clf, Xtrain, ytrain, cv = 3)
accuracy = score.mean()
return accuracy
# Study(トライアルを繰り返す一連の最適化プロセス)オブジェクトの呼び出し
study = optuna.create_study(direction = 'maximize')
# 最適化のループを呼び出す
study.optimize(objective, n_trials = 100)
# 学習時に表示された履歴を削除する。※これで長いログを残さないようにできます
clear_output()
print()
collect()
最適化が終わったら以下のコードを入力すると、精度とそのときのハイパーパラメータを確認することができます。
# 結果を出力
print(f'Best objective value: {study.best_value}')
print(f'Best parameter: {study.best_params}')
実際の使用例
以下に私がKaggleのコンペディションで使用したnotebookがありますので、よければそちらも参考にしてみてください。
※もしこのnotebookが「役に立った!」と感じた方がいらっしゃいましたら、以下の図の赤枠を「いいね!」代わりに押していただけると僕は泣いて喜びます(笑い)
Discussion