#1.目的
Kaggleのようなコンペでは、xgboostやLGBMといった勾配ブースティングがよく使われている。
ただ、これらについては参考になる記事やサイトが少ないと感じたこと/自分で実装する際に結構困ったので、今回はLGBMについて、自分が試したこと・各パラメータの意味合いを記しておくことが目的。
※参考書籍
今回は基本的にこちらの書籍に則って実装しています。
「Kaggleで勝つ データ分析の技術」
https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437
※前回の記事ではxgboostを実装して、今回はそれのLGBM版です。
【Kaggle】xgboostを使ってみる
#2.勾配ブースティングの利点
・欠損値の補完が不要
・冗長な特徴量があっても問題ない(相関が高い説明変数があってもそのまま使える)
・ランダムフォレストとの違いは、木を直列に作っている点。
上記の様な特徴があり、勾配ブースティングはよく使われるようです。
#3.LGBMを使ってみる
今回もkaggleのHousepriceを使用して実装してみる。
##(1)前処理
###(ⅰ)インポート
import numpy as np
import pandas as pd
#データ分割用
from sklearn.model_selection import train_test_split
#XGBoost
import xgboost as xgb
###(ⅱ)データ読み込み・結合
#データ読み込み
df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")
#データ結合
df_train["TrainFlag"] = True
df_test["TrainFlag"] = False
df_all = df_train.append(df_test)
df_all.index = df_all["Id"]
df_all.drop("Id", axis = 1, inplace = True)
###(ⅲ)ダミー変数化
df_all = pd.get_dummies(df_all, drop_first=True)
###(ⅳ)データ分割
#df_allを訓練データとテストデータに再度分ける
df_train = df_all[df_all["TrainFlag"] == True]
df_train = df_train.drop(["TrainFlag"], axis = 1)
df_test = df_all[df_all["TrainFlag"] == False]
df_test = df_test.drop(["TrainFlag"], axis = 1)
df_test = df_test.drop(["SalePrice"], axis = 1)
#データ分割
y = df_train["SalePrice"].values
X = df_train.drop("SalePrice", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
##(2)LGBMを使ってみる
###(ⅰ)LGBMのデータ作成
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)
####※注意点
・LGBMを使うには、lgb.Datasetでデータを加工する必要がある。
・xgboostでは、df_test(大元のテストデータ)も「.Dataset」で加工が必要だったが、LGBMはその必要はない。このあたりのデータの使い方がxgboostとLGBMで微妙に異なるので注意。
###(ⅱ)パラメータ設定
params = {
# 回帰問題
'random_state':1234, 'verbose':0,
# 学習用の指標 (RMSE)
'metrics': 'rmse',
}
num_round = 100
####※パラメータの簡単な説明
詳細は下記参照
https://lightgbm.readthedocs.io/en/latest/Parameters.html
・verbose:学習途中の情報をどこまで表示させるか。デフォルトは1。
・metrics:誤算関数の測定方法。
・num_round:最大の学習回数。
###(ⅲ)モデル訓練
model = lgb.train(params, lgb_train, num_boost_round = num_round)
###(ⅳ)予測
#予測
prediction_LG = model.predict(df_test)
#小数を丸めている
prediction_LG = np.round(prediction_LG)
###(ⅴ)提出用ファイル作成
submission = pd.DataFrame({"id": df_test.index, "SalePrice": prediction_LG})
以上で終了です!
#4.結び
いかがでしたでしょうか。
LGBMは有名な割に、初学者は実装までに時間がかかる印象です。
なるべく簡単に実装方法が分かるようにシンプルなコードをご紹介してみました。
また、コードをコピペすれば実装できますが、各コードがどんな意味を持っているのかざっくりでいいので知ることは非常に重要だと感じます。
少しでも理解の深化の一助になりますと幸いです。