LightGBMとOptunaを使って遊んだ(前編)

はじめに

LightGBMとOptunaで遊んだのでメモ

LightGBMとは

決定木に基づいた勾配ブースティングの機械学習フレームワーク
教師あり学習手法

決定木

決定木は条件に基づいて分岐を行う
これによりターゲットクラスを分類

アンサンブル学習

複数モデルを融合させて1つの学習モデルを生成する手法

「バギング」、「ブースティング」、「スタッキング」といった手法に大別

「バギング」によるアンサンブル学習をランダムフォレストと言う

「ブースティング」は前の弱学習器の結果を次の学習に反映させる

勾配ブースティング

「ブースティング」を用いたアンサンブル学習手法
LightGBMにおける決定木の扱いは「Leaf-Wise」であり、訓練時間が短い傾向にある
また、訓練データの特徴量を階級に分けてヒストグラム化することで、意図的に厳密な枝分かれを探さず、大規模なデータセットに対しても計算コストを抑えられる

以下、LightGBMを使ってた予測までの流れ

import lightgbm as lgb

# 適当なデータとそのラベルを用意し、訓練とテストに分割する  
# train:学習データ  
# target:ターゲットデータ  
X_train, X_test, y_train, y_test = train_test_split(train, target, test_size=0.1, random_state=0608)

# データセットの生成
lgb_train = lgb.Dataset(X_train, y_train)
lgb_valid = lgb.Dataset(X_test, y_test, reference=lgb_train)

# LightGBMのパラメータ指定
params = {
    'boosting': 'gbdt',
    'objective': 'gamma',
    'metric': 'fair',
    'num_leaves': 31,
    'learning_late': 0.01,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0,
    'num_iterations': 20000,
    'early_stopping_rounds': 200,
    'seed': 42
}

# モデルの学習
model = lgb.train(params,
                  lgb_train,
                  valid_sets=lgb_valid,
                  categorical_feature=features_idx,
                  verbose_eval=200)

# テストデータで予測
predicts = np.expm1(model.predict(test))
パラメータについて

'boosting': boostingアルゴリズム(デフォルトはgbdt)
'objective': 目的変数
'metric': 評価指標
'num_leaves': 木の末端ノード数
'learning_late': 学習率
'feature_fraction': 使用する特徴量の割合
'bagging_fraction': 使用するオブジェクトの割合
'bagging_freq': バギングの間隔(0の場合はバギングなし)
'verbose': 学習経過の情報表示(-1で非表示)
'num_iterations': 木の数
'early_stopping_rounds': 性能が頭打ちになった時点で止める基準
'seed': シード値

目的変数について

回帰問題であれば正規分布を仮定したデフォルトのrmse
年収やある事象がおこる間隔など正規分布に当てはまらない様な分布に対してはgamma
一定期間内に起こるランダムな事象のカウントを予測する場合にはpoisson

過学習への対策

feature_fractionfeature_freqの値を下げる
bagging_fractionbaggin_freqを使用する これにより、学習の高速化も期待できる

lgb.trainの引数

上で説明したようなパラメータ
学習データ(categorical_featureで使用したいカラムを指定することができる)

学習したモデルで推論

model.predictにテストデータを渡してあげるだけ

参考サイト

Parameters — LightGBM 2.3.2 documentation
【アンサンブル学習】多様性が大事? バギング・ランダムフォレスト編 - Np-Urのデータ分析教室
勾配ブースティングで大事なパラメータの気持ち - nykergoto’s blog
scikit-learnとLightGBMの評価関数比較 - Qiita
LightGBM 徹底入門 – LightGBMの使い方や仕組み、XGBoostとの違いについて

次回、Optuna使ってみた