LightGBM Tunerを使ったハイパーパラメータ最適化

lightGBM Tunerについて

Preferred NetworksによってOptunaの拡張機能として開発された、LightGBMのハイパーパラメータ自動最適化モジュール

通常のハイパーパラメータ最適化では、最適化したいパラメータの数が増えるほど探索空間が指数関数的に多くなってしまう。
lightGBM Tunerでは、経験則に基づき「より重要のハイパーパラメータから順に最適化、かつ相互作用の大きいハイパーパラメータは同時にチューニングする」ことで、少ない試行回数でハイパーパラメータを最適化することが可能。

通常のハイパーパラメータ


Optuna の拡張機能 LightGBM Tuner によるハイパーパラメータ自動最適化より

LightGBMによるハイパーパラメータ


Optuna の拡張機能 LightGBM Tuner によるハイパーパラメータ自動最適化より

使い方

モジュールインポートの際にこれまでlightgbmをインポートしていた部分を書き換えるだけで lightGBMと同じように使うことができる。

変更前

import lightgbm as lgb

変更後

import optuna.integration.lightgbm as lgb

コード

サンプルデータとしてボストンの住宅価格のデータを使用する

準備

モジュールのインストール

conda install -c conda-forge lightgbm
pip install optuna

データの準備など

前述の通り普段インストールしているlightgbmoptuna.integration.lightgbmに変更するだけ。

import numpy as np
import pandas as pd

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error

import optuna.integration.lightgbm as lgb

boston = load_boston()

df_X = pd.DataFrame(boston.data, columns=boston.feature_names)
df_y = pd.DataFrame(boston.target,columns=['Price'])

X_train, X_valid, y_train, y_valid = train_test_split(df_X, df_y,test_size=0.3)

最適化を実行

dtrain = lgb.Dataset(X_train, y_train)
deval = lgb.Dataset(X_valid, y_valid, reference=dtrain)

best_params, history = {}, []

params = {'objective':'regression',
        'metric': 'rmse',
        'verbosity':-1,
        'n_jobs':-1}

model = lgb.train(params, dtrain, 
                    valid_sets=[dtrain, deval],
                    verbose_eval=False,
                    )

結果の可視化

#最適化したパラメータを表示する。
best_params = model.params
print(best_params)
"""
{'objective': 'regression', 'metric': 'rmse', 'verbosity': -1, 'n_jobs': -1, 'feature_pre_filter': False, 'lambda_l1': 8.440168755919984, 'lambda_l2': 0.0241531507530068, 'num_leaves': 31, 'feature_fraction': 1.0, 'bagging_fraction': 1.0, 'bagging_freq': 0, 'min_child_samples': 5, 'num_iterations': 1000, 'early_stopping_round': None}
"""

# 予測精度を算出する
pred_y_train = model.predict(X_train)
pred_y_valid = model.predict(X_valid)

r2_train = r2_score(y_train,pred_y_train)
MAE_train = mean_absolute_error(y_train,pred_y_train)
r2_valid = r2_score(y_valid,pred_y_valid)
MAE_valid = mean_absolute_error(y_valid,pred_y_valid)
print('r2_train:',round(r2_train,4))
print('MAE_train:',round(MAE_train,4))
print('r2_valid:',round(r2_valid,4))
print('MAE_valid:',round(MAE_valid,4))
"""
r2_train: 0.9492
MAE_train: 1.2979
r2_valid: 0.9634
MAE_valid: 1.1321
"""

設定できるパラメータ

解析手法

  • 回帰問題:'regression'
  • 分類問題:'binary'
  • 多クラス類問題:'multiclass'

精度評価に用いる指標

回帰(regression)

  • 誤差平均:'mae'
  • 二乗誤差:'mse'
  • 平均平方二乗誤差:'rmse'

二値分類

  • クロスエントロピー:'binary_logloss'
  • 正答率:'binary_error'

多クラス分類

  • Logarthmic Loss:'multi_logloss'
  • 正答率:'multi_error'

その他のパラメータ

パラメータ名説明引数
verbosity学習途中の情報を表示するかどうか>1:Debug
1:Info
0:Error(Warning)
-1:Fatal
デフォルト:1
verbose_eval学習途中の結果を表示するかTrue:表示する
False:表示しない
デフォルト:True
random_state乱数シードの値int
n_jobsLightGBM に使用するスレッド数0:デフォルトの数
-1:最大数で指定(おそらく)
デフォルト:0

参考

関連書籍