joda!!

jodaによるプログラミング芸

LightGBMについて 最低限の理解をしていく

はじめに

こちらの記事は、LightGBMについて自分用にまとめたものとなります。
「Kaggler」の上位6割以上が LightGBM を用いている
といわれるLightGBMとは何なのか、
まとめていきたいと思います。
理論は非常に難解であるということなので、
データ分析に問題なく利用できる程度の理解を目標とします。

目次

LightGBMとは?

概要

一言でまとめてしまうと、
LightGBMとは、機械学習の決定木モデルに勾配ブースティング
を組み合わせた学習アルゴリズム(GBDT) を更に改良したものとなります。
特徴として、GBDTなみの高い精度を持つにも関わらず、GBDTよりも処理を高速に行えます。 まずはLightGBMを理解するために不可欠な要素について理解していき、
その後、使い方を覚えます。

LightGBMを理解するために不可欠な要素
* 勾配ブースティング決定木(GBDT)
* GBDTの課題点

GBDTについて

GBDTは、

  • 勾配降下法
  • ブースティング
  • 決定木

を組み合わせたものとなっております。
順を追ってい見ています。

勾配降下法
勾配降下法は、ざっくりと以下のようにまとめます。

  1. 現在地での目的関数の勾配(偏微分)を求める
  2. 求めた勾配に応じて、学習率に則り移動する
  3. 目的関数の値の増減が閾値を下回れば学習終了、そうでなければ1へ戻る

ようは、誤差が最小になるように徐々にパラメータを変更していくということですね。

ブースティング
ブースティングは、アンサンブル(複数のモデルを利用する手法)の一つです。
「ある一つをベースモデルとして先に学習させ、
ベースモデルの誤判定を加味して次のモデルを学習する」
ということを繰り返し、最終的に全てのモデルを用いて全体の出力を構成します。
これにより徐々に過学習的に訓練データにフィッティングしていき、
また過学習していないモデルも含めて全体の意思決定を行うためバイアスが低下する傾向があります。

決定木
決定木とは、図1のようにある条件に対して、True or False で判定していき、
最終的に、特徴量から目的変数を予測するモデルとなっております。
f:id:jodawithforce:20211212154306p:plain 図1 (引用:http://qiita.com/yshi12/items/6d30010b353b084b3749

それでは、GBDTとは?
こちらの見出し冒頭で記載したように、

  1. 勾配降下法
  2. ブースティング
  3. 決定木

を組み合わせたものとなります。 一言でまとめますと、
勾配降下法とアンサンブル学習のブースティングを決定木に適用したもの
となります。
こちらに非常にわかりやすく記述してありました。
www.acceluniverse.com かいつまんでまとめると、
-予測値と実際の値の誤差を計算

-求めた誤差を利用して決定木を構築(ブースティング、 決定木)

-造った決定木をそれ以前の予測結果とアンサンブルして誤差を小さくする→精度があがる(勾配降下法)

これを繰り返していき、モデルを構築します。

GBDTの課題点

  • データセット削減のためのダウンサンプリングにおいて、
    データの分布が変わってしまうから精度が悪くなってしまう
    →訓練データの削減が難しい
  • Histgram-basedアルゴリズムでは疎なデータセットに対しても特徴量削減ができない
  • 外れ値の影響を受けやすい
  • ブースティング(前回の結果を利用してモデルを構築)するため、並列処理ができない
  • パラメータに影響されやすく、過学習を起こしやすい

というものがあります。

GBDTの課題点を解決したものがLightGBM

GBDTとその欠点がわかったところで、ようやくLightGBMが出てきます。
LightGBMは、上記の課題のうち、

  • データセット削減のためのダウンサンプリングにおいて、
    データの分布が変わってしまうから精度が悪くなってしまう

  • Histgram-basedアルゴリズムでは疎なデータセットに対しても特徴量削減ができない

  • 並列化できない

という問題点を改善したものになります。

GOSS

GOSSは、データのダウンサンプリングを可能にします。
GBDTは、ブースティングによって誤差を小さくしていき、モデルを構築します。
勾配降下法により、 目的変数との誤差を十分小さくできたときに、モデルは学習完了した、
ということになります。
目的変数との誤差を小さくできたツリーに関しては、成長をやめてしまっても構わないのですが、
このようにするとデータの分布が変わってしまう、という問題があります。
このため、する必要のない処理をおこなってしまい、無駄が生じます。
ここで考えられたのが、GOSSだそうです。
詳しい理論については現状理解できないのですが、
概要としては、
「勾配の大きなデータはそのまま、 小さいデータはランダムサンプリングする」
という方法を採り、
訓練不足のデータに対してデータの分布を損なうことなしに注目することができる、
というものだそうです。
要は、GOSS は GBDTの高速化に一役買っているということですね。

EFB

EFBは、疎なデータセットに対する特徴量削減を可能にします。
EFBに関しては、ほとんど内容を理解することができませんでした。
概要として、安全に特徴量削減を可能にするということを記憶し、
もっと学習が進んでから再び理解してみたいと思います。

LightGBMのハイパーパラメータ

・booster [default=gbtree]
モデルのタイプを選択
gbtree: ツリーベースのモデル
gblinear: 線形モデル

・silent [default=0]:
メッセージのモードの選択
1=メッセージを表示しない
0 = メッセージを表示する

・nthread [デフォルトで利用可能なスレッドの最大数]

eta [default=0.3]
GBMのlearning rate(学習率)
各ステップの重みを縮小することにより、モデルをより堅牢にする
よく使用される値:0.01〜0.2

・min_child_weight [default=1]
過剰適合の制御に使用されます。
値が大きすぎると、学習不足になる可能性があるため、
CVを使用して調整する必要があります。

・max_depth [default=6]
ツリーの最大深度。
よく使用される値:3–10

・max_leaf_nodes
ツリー内のノードの最大数。

・gamma [default=0]
分割を行うために必要な最小損失削減を指定する。

・max_delta_step [default=0]
最大デルタステップでは、各ツリーの重み推定を許可します。
値が0に設定されている場合、制約がない。

・subsample [default=1]
各ツリーのランダムなサンプルの設定。
値を小さくすると、オーバーフィッティングが防止されますが、
小さすぎる値はアンダーフィッティングにつながる可能性があります。

・lambda [default=1]
L2正則化重み

・alpha [default=0]
L1正則化重み

・scale_pos_weight [default=1]
収束が速くなるように、クラスの不均衡が大きい場合は、0より大きい値を使用する必要がある

・objective [default=reg:linear]
binary:logistic –バイナリ分類のロジスティック回帰
multi:softmax – softmax目標を使用したマルチクラス分類
multi:softprob –softmaxと同じですが、各クラスに属する各データポイントの予測確率

・eval_metric [ default according to objective ]
誤差の評価基準。
デフォルトは、objectiveに依存します。
rmse — root mean square error
mae — mean absolute error logloss — negative log-likelihood
error — Binary classification error rate (0.5 threshold)
merror — Multiclass classification error rate
mlogloss — Multiclass logloss
auc: Area under the curve.

追記

LightGBMといっても、
Python API のものと
scikit-learn API
があり、ハイパラなどちょこちょこ内容が違うらしい。
当ブログに記載のものは、Python APIのもの。

参考

nigimitama.hatenablog.jp

qiita.com

www.acceluniverse.com

data-analysis-stats.jp