• トップ
  • ブログ一覧
  • Kaggler がよく使う「LightGBM」とは?【機械学習】
  • Kaggler がよく使う「LightGBM」とは?【機械学習】

    広告メディア事業部広告メディア事業部
    2020.07.15

    IT技術

    LightGBMとは?

    LightGBM は、2016年に米マイクロソフト社が公開した勾配ブースティングに基づく機械学習手法です。

    公開されてまだ3年足らずですが、「Kaggler」の上位6割以上が LightGBM を用いているという集計結果が報告されています。

    これは、データサイエンティストとして、「知らなかった」では済まされません。

    LightGBM を実装できるようになり、ステップアップしていきましょう!

    それでは、計算原理から実装まで、順を追って説明していきます。

    LightGBM の計算原理

    LightGBM 公開前の勾配ブースティングは、「XGboost」が主流でした。

    勾配ブースティングには、「予測精度は高いが、計算時間が長い」という特徴があります。

    当時、勾配ブースティングの主流であった「XGboost」に対し、LightGBM の「予測精度を保ったまま計算時間を大きく削減できる」という特徴に注目が集まり、急速に広まりました。

    LightGBM では、計算時間を削減するために色々な工夫がなされており、XGboost と比較すると以下の2点が大きく異なります。

    計算時間削減のための工夫(その1)

    1点目は、「Level-wise」から「Leaf-wise」に変更されている点です。

    出典:https://lightgbm.readthedocs.io/en/latest/Features.html

    「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)
    RM1戸当たりの平均部屋数
    AGE1940年よりも前に建設した物件の割合
    DISボストンにある5つの雇用施設までの重み付き距離
    RAD環状高速道路へのアクセス指数
    TAX10,000ドル当たりの固定資産税の割合
    PTRATIO町毎の生徒と教師の比率
    B1000(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)計算速度
    LightGBM3.283275 ms
    XGboost3.768355 ms

    今回は、計算時間に大きな差が出ませんでしたが、データ数が少ないためと考えています。

    数万行を超えるデータの場合は、分単位で差が出ることを確認できているので、皆さんもぜひ試してみてください!

    さいごに

    以上となりますが、どうだったでしょうか?

    簡単なコードで強力な回帰ツールを扱うことが可能となるので、各自、色々なデータに使ってみてください。

    今回は、ハイパーパラメータにデフォルト値を使っています。

    ブースティング系は、ハイパーパラメータの調整による精度向上分は小さいと言われており、特徴量追加等が有効であると言われています。

    インターネットなどで調べると、色々な工夫が出てきますので、理解を深めていただければと思います。

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    今日の1冊

    作ってわかる! アンサンブル学習アルゴリズム入門
    作ってわかる! アンサンブル学習アルゴリズム入門

     

    関連記事

    featureImg2020.06.23【機械学習】「スタッキング技術」を実装して予測精度を上げる機械学習におけるスタッキング技術とは?上位入賞者の公開コードに必ずと言っていいほど顔を出すのが「スタッキングされた学習...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事