こんにちは、ミナピピン(@python_mllover)です。前回は「XGBoost」について紹介しましたが、今回はその派生形である「LightGBM」について紹介したいと思います。
参照記事:【Python】元最強アルゴリズム「XGBoost」で機械学習をやってみた
Light GBMの概要
LightGBMとは決定木アルゴリズムに基づいた勾配ブースティング(Gradient Boosting)の機械学習フレームワークです。LightGBMは米マイクロソフト社がスポンサーをしています。勾配ブースティングのアルゴリズムといえば、前回紹介したXGBoostが有名ですが、XGBoostとは細部の仕組みが違います。
参照記事:https://rightcode.co.jp/blog/information-technology/lightgbm-useful-for-kaggler
PythonでLightGBMを実装する
という訳で実際にPythonでLightGBMを実装していきましょう。今回学習に使用するのは、皆さんおなじみのKaggleのタイタニックのデータです。以下のサイトから「titanic_train_mod.csv」と「titanic_test_mod.csv」をダウンロードしてください。
csvの中身は欠損値や特徴量を加工したタイタニックの乗客データです。特徴量エンジニアリングに関しては今回の話題ではないのでサクッと飛ばします。ダウンロードしたcsvは任意の場所に配置して、下記のpd.read_csvのパスを弄って読み込めるようにしておいてください。
# ライブラリをインストールする $ pip install lightgbm
学習のコードは以下になります
import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
#データの読み込み(パスは自分の環境に合わせて変えてください)
train = pd.read_csv(r'titanic_train_mod.csv.csv')
test = pd.read_csv(r'titanic_test_mod.csv.csv')
# 訓練用データを学習用・テスト用に7:3で分割する
X_train, X_test, y_train, y_test = train_test_split(train[["Pclass", "Sex", "Age", "Fare"]], train['Survived'], test_size=0.3)
# 学習用
lgb_train = lgb.Dataset(X_train, y_train,
free_raw_data=False)
# 検証用
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train,
free_raw_data=False)
# パラメーター設定
light_params = {'task': 'train', # レーニング ⇔ 予測predict
'boosting_type': 'gbdt', # 勾配ブースティング
'objective': 'multiclass', # 目的関数:多値分類、マルチクラス分類
'metric': 'multi_logloss', # 検証用データセットで、分類モデルの性能を測る指標
'num_class': 2, # 目的変数のクラス数
'learning_rate': 0.1, # 学習率(初期値0.1)
'num_leaves': 23, # 決定木の複雑度を調整(初期値31)
'min_data_in_leaf': 1, # データの最小数(初期値20)
}
evaluation_results = {} # 学習の経過を保存する箱
# 学習
lgb_model = lgb.train(light_params, # 上記で設定したパラメータ
lgb_train, # 使用するデータセット
num_boost_round=200, # 学習の回数
valid_names=['train', 'valid'], # 学習経過で表示する名称
valid_sets=[lgb_train, lgb_eval], # モデルの検証に使用するデータセット
evals_result=evaluation_results, # 学習の経過を保存
early_stopping_rounds=20, # アーリーストッピングの回数
verbose_eval=0
) # 学習の経過を表示する刻み(非表示)
# 検証用データで予測
prediction_XG = lgb_model.predict(test[["Pclass", "Sex", "Age", "Fare"]].values, num_iteration=lgb_model.best_iteration)
# 小数を丸めている
prediction_XG = [i[1] for i in np.round(prediction_XG).astype(int)]
# PassengerIdを取得
PassengerId = np.array(test["PassengerId"]).astype(int)
# my_prediction(予測データ)とPassengerIdをデータフレームへ落とし込む
my_result = pd.DataFrame(prediction_XG, PassengerId, columns = ["Survived"])
# xgb_result.csvとして書き出し
my_result.to_csv("lightgbm_result.csv", index_label = ["PassengerId"])
出力したCSVをhttps://www.kaggle.com/c/titanic/submitで提出すると結果は0.75598と約76%の正答率になりました。前回のXGBoostより若干低い結果となりましたが、勾配ブースティングなだけあってこの説明変数でもそこそこの精度が出せますね。
関連記事:データ分析業界で未経験が高給取りを目指すためには何をするべきか
関連記事:【Python】機械学習で株価を予測する~Scikit-Learnの決定木アルゴリズムを使う


コメント
X_trainなどを定義するコードがかかれていないと思うのですが、どのように定義していますか?
コメントありがとうございます。
以下のコードがブログに転記する際に抜けていました。ご指摘頂きありがとうございます!
X_train, X_test, y_train, y_test = train_test_split(train[[“Pclass”, “Sex”, “Age”, “Fare”]], train[‘Survived’], test_size=0.3)