🐍

【Python】LightGBMのハイパーパラメータをOptunaで最適化する方法

2024/02/18に公開

はじめに

この記事はオーム社出版の「Optunaによるブラックボックス最適化」を読んで、私がアレンジしたLightGBMのハイパーパラメータをOptunaで最適化する方法を記載しています。他にも役立つ機能が沢山紹介されており、なんとなくネットに転がっている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}')

Discussion