[デモのプログラムあり] 勾配ブースティングGradient Boosting、特に Gradient Boosting Decision Tree (GBDT), XGBoost, LightGBM

シェアする

勾配ブースティングGradient Boosting、特に Gradient Boosting Decision Tree (GBDT), XGBoost, LightGBM について、パワーポイントの資料とその pdf ファイルを作成しました。XGBoost, LightGBM などの勾配ブースティングは Kaggle などのコンペティションで上位の成績をあげた方々が利用していた手法あり、推定性能の高いモデルが構築できると注目されています。

pdfファイルはこちらから、パワーポイント(pptx)ファイルはこちらからダウンロードできます。

興味のある方はぜひ参考にしていただき、どこかで使いたい方は遠慮なくご利用ください。

また回帰分析やクラス分類において、scikit-learn の GBDT (回帰分析クラス分類)、XGBoostLightGBM のデモンストレーションのプログラムも準備しました。さらに、optuna を利用して、クロスバリデーションの結果をベイズ最適化することで、各モデルのハイパーパラメータを最適化するデモンストレーションのプログラムもあります。ただ、デフォルトのパラメータでも良好なモデルを構築できたり、ベイズ最適化するよりテストデータの推定結果がよくなったりすることもあります。デフォルトのパラメータとベイズ最適化したパラメータとで両方比較するとよいです。いずれにせよ、デモンストレーションのプログラムはこちらの Github からご利用ください。

https://github.com/hkaneko1985/gradient_boosting

一番下にプログラムに関する補足があります。

勾配ブースティング (Gradient Boosting) とは?

  • アンサンブル学習の一つ
  • ブースティングの一つ
  • クラス分類でも回帰でも可能
  • クラス分類手法・回帰分析手法は何でもよいが、基本的に決定木を用いる
    • Gradient Boosting Decision Tree (GBDT)
  • クラス分類モデルで誤って分類されてしまったサンプルや、回帰モデルで誤差の大きかったサンプルを、改善するように (損失関数の値が小さくなるように) 新たなモデルが構築される

スライドのタイトル

  • 勾配ブースティングとは?
  • 準備: 損失関数 (Loss Function) [回帰]
  • 準備: 損失関数 (Loss Function) [分類]
  • 準備: 損失関数の勾配 [回帰]
  • 準備: 損失関数の勾配 [分類]
  • 決定木の勾配ブースティングのアルゴリズム
  • Python で勾配ブースティングを実行するには
  • XGBoost の主な工夫
  • LightGBM の主な特徴
  • デモの Python プログラムあります!
  • データセットを変えて、プログラムをご利用ください
  • 参考文献

参考文献

プログラムに関する補足

  • サブモデルの数 (決定木の数) の決め方

基本的には early stopping で決めるようにしています。サブモデル (決定木) を増やしながら、バリデーションデータを推定したときの評価値を計算し、その値が変わらなくなったらそれ以上のサブモデルは増えません。バリデーションデータのサンプル数の割合は fraction_of_validation_samples で変更できます (デフォルトは 20 %)。ただ、early stopping をやらずに、サブモデルの数を決め撃ちすることもできます。fraction_of_validation_samples = 0 として、その次の number_of_sub_models でサブモデルの数を設定してください。この場合は early stopping は行われません。

  • 回帰分析で目的変数を標準化(オートスケーリング)する理由

XGBoost への対応のためです。XGBoost では決定木において評価関数 (回帰の場合は誤差の二乗和) に追加項があります。そして、それらに対する重み γ, λ があります。このとき、目的変数のスケールが異なると、γ, λ もそれに応じて変化させる必要があります。そのため、目的変数のスケールを等しくして、同じ範囲で γ, λ を最適化できるように目的変数をオートスケーリングしています。

  • LightGBM における決定木の葉ノードの最小サンプル数

決定木の葉ノードの最小サンプル数 min_child_samples のデフォルト値は 20 です。特にサンプル数が小さいときは、この数を小さくしたほうがよいかもしれません。一方で、この値を小さくすると、

  1. (かなり)オーバーフィットしてしまう
  2. (かなり)計算時間がかかってしまう

といった問題もあります。LightGBM はその名の通り Light なこと、つまりサンプル数や

変数の数が多いときでも計算時間が短いこと、も特徴の一つです。サンプル数が少ないときは、決定木の葉ノードの最小サンプル数で対応するよりは、他の gradient boosting や他の手法で対応するのがよいと考えています。今回のプログラムでは、特にサンプル数が小さいときに推定性能が低下してしまうときにも、XGBoost や scikit-learn の GBDT を使用することで比較できるようにしました。

以上です。

質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。

シェアする

フォローする