予測の目的
♦ 回帰を解きたい場合は "regression"
♦ 分類を解きたい場合は "binary"
他にも存在する。
LightGBM (how to use)
ここではLightGBMに関する最低限の情報をまとめておきます。詳細を知りたい場合は他の人のページを見てください。
1. Import
import lightgbm as lgb
2. Parameter (scikit-learn API type)
予測の目的
♦ 回帰を解きたい場合は "regression"
♦ 分類を解きたい場合は "binary"
他にも存在する。
使用するモデルの選択
♦ "gbdt" : 勾配ブースティング木
♦ "rf" : ランダムフォレスト
♦ "dart" : 多重加法型回帰樹木 + Drop Out
♦ "goss" :
シード値が固定されていないと、再現性が担保できないため、シード値を固定する。
評価指標
♦ "mrse", "mae" は回帰に対して使用される。
♦ "binary_logloss", "auc" は分類に対して使用される。
他にも存在する。
学習回数
1に設定すると学習の途中経過を見ることができる。見る必要がない場合は-1に設定する。
指定した回数連続で評価指標に変化がなければ、収束したと判定して学習を終了する。
学習率 : 過去の結果を元にどれくらい更新するか (0.1, 0.05, 0.01派が存在する。)
モデルの深さの最大値 : 調整必須(5-9くらいが良い??)
大きいほど過学習を起こしやすい。
一つの決定木につく葉の数 : 調整必須
大きいほど過学習を起こしやすい。
L1ノルムの係数 : 調整必須
小さいほど過学習を起こしやすい。
L2ノルムの係数 : 調整必須
小さいほど過学習を起こしやすい。
各決定木においてランダムに抽出される列の割合 : 調整必須 大きいほど過学習を起こしやすい。
各決定木においてランダムに抽出されるサンプルの割合 : 調整必須
大きいほど過学習を起こしやすい。
ここで指定した繰り返しごとにバギングを実施する : 調整必須
大きいほど過学習を起こしやすい。しかし、0のときはバギングが実施されない。
1枚の葉に含まれる最小データ数 : 調整必須
小さいほど過学習を起こしやすい。
# パラメータ設定例 (設定値はデフォルト)
params = {
'objective': 'regression',
'boosting_type': 'gbdt',
'random_state': 29, # デフォルトではNoneなので必ず設定する。
'metric': 'rmse', # 指定しないと適切な評価関数を自動補完
'n_estimators': 100,
'verbose': 1,
'early_stopping_round': 10, # デフォルト0 (0なら記述しない)
'learning_rate': 0.1,
'max_depth': -1, # -1は上限なしを意味する
'num_leaves': 31,
'reg_alpha': 0,
'reg_lambda': 0,
'colsample_bytree': 1.0,
'subsample': 1.0,
'subsample_freq': 0,
'min_child_samples': 20
}
3. Model making (scikit-learn API type)
# インスタンス生成
model = lgb.LGBMClassifier(**params) # 分類
model = lgb.LGBMRegressor(**params) # 回帰
# 学習を実行
model.fit(X_train, y_train) # エラー
これではエラーが発生する。
early_stopping_roundを指定すると評価に使用するためのデータセットが必要になるためである。
そこで、データセットの一部をearly stoppingの評価に使用すれば解決。
# インスタンス生成
from sklearn.model_selection import train_test_split
X_train, X_eval, y_train, y_eval = train_test_split(X_train, y_train, test_size=0.2, random_state=7)
# 評価用のデータセットを渡して学習を実行
model.fit(X_train, Y_train, eval_set=[(X_eval, y_eval)])
4. Referenced page