Kaggler がよく使う「LightGBM」とは?【機械学習】
IT技術
LightGBMとは?
LightGBM は、2016年に米マイクロソフト社が公開した勾配ブースティングに基づく機械学習手法です。
公開されてまだ3年足らずですが、「Kaggler」の上位6割以上が LightGBM を用いているという集計結果が報告されています。
これは、データサイエンティストとして、「知らなかった」では済まされません。
LightGBM を実装できるようになり、ステップアップしていきましょう!
それでは、計算原理から実装まで、順を追って説明していきます。
LightGBM の計算原理
LightGBM 公開前の勾配ブースティングは、「XGboost」が主流でした。
勾配ブースティングには、「予測精度は高いが、計算時間が長い」という特徴があります。
当時、勾配ブースティングの主流であった「XGboost」に対し、LightGBM の「予測精度を保ったまま計算時間を大きく削減できる」という特徴に注目が集まり、急速に広まりました。
LightGBM では、計算時間を削減するために色々な工夫がなされており、XGboost と比較すると以下の2点が大きく異なります。
計算時間削減のための工夫(その1)
1点目は、「Level-wise」から「Leaf-wise」に変更されている点です。
「Level-wise」は、各層ごとに一括で決定木の分岐を行います。
その一方、「Leaf-wise」は、分岐させるべき葉に絞って分岐を行います。
葉の数が減ることで、計算時間が短くすることができます。
計算時間削減のための工夫(その2)
二点目は、「葉の分岐点を探す際にヒストグラムを採用している」という点です。
これまでは、すべてのデータを読み込んで分岐点を探していました。
この読み込み時間に占める割合が非常に多いのですが、ヒストグラムで分岐点の狙いをつけることで、高速処理が可能となりました。
このように葉の数を減らし、葉の生成時間を短くすることで、計算時間が大幅に短縮されました。
それでは、LighGBM の実装に移ります。
LightGBM の実装
LightGBM ライブラリのインストール
まずは、AnacondaPrompt から LightGBM ライブラリをインストールします。
1conda install -c conda-forge lightgbm
または、jupyternotebook からインストールしましょう。
1pip install LightGBM
これでインストールは完了です!
コードの実装
次に、必要なライブラリを読み込みます。
1# 必要なライブラリのインストール
2import pandas as pd
3import numpy as np
4import matplotlib.pyplot as plt
5import lightgbm as lgb
6import time
7
8from pandas import DataFrame
9from sklearn.model_selection import train_test_split
10from sklearn.metrics import mean_squared_error
今回は、「ボストン住宅価格」のデータセットを用います。
データセットを確認し、正しく結合できていることを確認します。
1# ボストン住宅価格データセットの読み込み
2from sklearn.datasets import load_boston
3
4boston = load_boston()
5
6# 説明変数を読み込む
7X_array = boston.data
8# 目的変数を読み込む
9y_array = boston.target
10# データフレームの作成
11df = DataFrame(X_array, columns = boston.feature_names).assign(Price=np.array(y_array))
ボストン住宅価格のデータセット
ボストン住宅価格のデータセットの詳細
CRIM | 犯罪発生率(町毎の一人当たりの犯罪率) |
---|---|
ZN | 住宅区画の割合(25,000 平方フィート以上) |
INDUS | 小売業以外の商業が占める土地面積の割合 |
CHAS | チャールズ川沿いかどうか (ダミー変数 1: 川沿い 0: それ以外) |
NOX | 窒素酸化物の濃度(pphm) |
RM | 1戸当たりの平均部屋数 |
AGE | 1940年よりも前に建設した物件の割合 |
DIS | ボストンにある5つの雇用施設までの重み付き距離 |
RAD | 環状高速道路へのアクセス指数 |
TAX | 10,000ドル当たりの固定資産税の割合 |
PTRATIO | 町毎の生徒と教師の比率 |
B | 1000(Bk – 0.63)^2 の値。Bkは町毎の黒人の割合。 |
LSTAT | 低所得者の割合 (%) |
Price | 家賃 |
上表がデータセットの詳細です。
家賃を目的変数とし、それ以外を説明変数とします。
訓練データとテストデータに分割
次に、「訓練データ」と「テストデータ」に分けます。
LightGBMは、専用のデータセットに入れることで処理速度が上がります。
今回の評価基準は、RMSE としています。
1# 訓練データとテストデータに分ける
2train_set, test_set = train_test_split(df, test_size = 0.2, random_state = 123)
3# 説明変数と目的変数に分ける
4x_train = train_set.drop('Price', axis = 1)
5y_train = train_set['Price']
6x_test = test_set.drop('Price', axis = 1)
7y_test = test_set['Price']
8# LightGBM用のデータセットに入れる
9lgb_train = lgb.Dataset(x_train, y_train)
10lgb.test = lgb.Dataset(x_test, y_test)
11# 評価基準を設定する
12params = {'metric' : 'rmse'}
回帰結果の確認
LightGBM の回帰結果を確認します。
1# 訓練データから回帰モデルを作る
2gbm = lgb.train(params, lgb_train)
3# テストデータを用いて予測精度を確認する
4test_predicted = gbm.predict(x_test)
5predicted_df = pd.concat([y_test.reset_index(drop=True), pd.Series(test_predicted)], axis = 1)
6predicted_df.columns = ['true', 'predicted']
7# 予測値を図で確認する関数の定義
8def Prediction_accuracy(predicted_df):
9 RMSE = np.sqrt(mean_squared_error(predicted_df['true'], predicted_df['predicted']))
10 plt.figure(figsize = (7,7))
11 ax = plt.subplot(111)
12 ax.scatter('true', 'predicted', data = predicted_df)
13 ax.set_xlabel('True Price', fontsize = 20)
14 ax.set_ylabel('Predicted Price', fontsize = 20)
15 plt.tick_params(labelsize = 15)
16 x = np.linspace(5, 50)
17 y = x
18 ax.plot(x, y, 'r-')
19 plt.text(0.1, 0.9, 'RMSE = {}'.format(str(round(RMSE,3))),transform = ax.transAxes, fontsize = 15)
20# 予測値を図で確認する
21Prediction_accuracy(predicted_df)
精度良く予測できていることが分かります。
結果から分かるように、データ数が少ない部分はどうしても精度が下がってしまいます。
特徴量の重要度の確認
次に、特徴量の重要度を確認します。
1# 特徴量の重要度を確認
2lgb.plot_importance(gbm, height = 0.5, figsize = (8,16))
上位3項目がボストンの家賃に関わるのは、納得ができると思います。
このことから、違和感のないモデルができていると判断できます。
決定木の可視化
次に、決定木を確認してみます。
※ 決定木を見ることで、リバースエンジニアリングに繋がることはあまりありません。
ここから先は、「graphviz」のインストールが必要となりますが、興味のある方は調べてみてください。
1# 決定木の分岐の可視化
2# 最後の数字でleaf番号を指定
3lgb.create_tree_digraph(gbm, 1)
LightGBM の決定木が「Leaf-wise」となっていることが確認できました。
重要度の高い特徴量が先頭に集まっていることが確認できます。
XGboost との比較
最後に、上記データを用いて「LightGBM」と「XGboost」を比較しました。
回帰モデル | 予測精度(RMSE) | 計算速度 |
LightGBM | 3.283 | 275 ms |
XGboost | 3.768 | 355 ms |
今回は、計算時間に大きな差が出ませんでしたが、データ数が少ないためと考えています。
数万行を超えるデータの場合は、分単位で差が出ることを確認できているので、皆さんもぜひ試してみてください!
さいごに
以上となりますが、どうだったでしょうか?
簡単なコードで強力な回帰ツールを扱うことが可能となるので、各自、色々なデータに使ってみてください。
今回は、ハイパーパラメータにデフォルト値を使っています。
ブースティング系は、ハイパーパラメータの調整による精度向上分は小さいと言われており、特徴量追加等が有効であると言われています。
インターネットなどで調べると、色々な工夫が出てきますので、理解を深めていただければと思います。
こちらの記事もオススメ!
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
今日の1冊
関連記事
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit