lightGBM Tunerについて
Preferred NetworksによってOptunaの拡張機能として開発された、LightGBMのハイパーパラメータ自動最適化モジュール。
通常のハイパーパラメータ最適化では、最適化したいパラメータの数が増えるほど探索空間が指数関数的に多くなってしまう。
lightGBM Tunerでは、経験則に基づき「より重要のハイパーパラメータから順に最適化、かつ相互作用の大きいハイパーパラメータは同時にチューニングする」ことで、少ない試行回数でハイパーパラメータを最適化することが可能。
通常のハイパーパラメータ
LightGBMによるハイパーパラメータ
使い方
モジュールインポートの際にこれまでlightgbmをインポートしていた部分を書き換えるだけで lightGBMと同じように使うことができる。
変更前
import lightgbm as lgb
変更後
import optuna.integration.lightgbm as lgb
コード
サンプルデータとしてボストンの住宅価格のデータを使用する
準備
モジュールのインストール
conda install -c conda-forge lightgbm
pip install optuna
データの準備など
前述の通り普段インストールしているlightgbmをoptuna.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_jobs | LightGBM に使用するスレッド数 | 0:デフォルトの数 -1:最大数で指定(おそらく) デフォルト:0 |
参考
関連書籍
リンク
リンク
リンク