Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Avatar for Hiromasa Kaneko

Hiromasa Kaneko

April 09, 2019
Tweet

More Decks by Hiromasa Kaneko

Other Decks in Technology

Transcript

  1. 勾配ブースティングとは︖ アンサンブル学習の一つ ブースティングの一つ クラス分類でも回帰でも可能 クラス分類手法・回帰分析手法は何でもよいが、 基本的に決定木を用いる • Gradient Boosting Decision

    Tree (GBDT) クラス分類モデルで誤って分類されてしまったサンプルや、 回帰モデルで誤差の大きかったサンプルを、改善するように (損失関数の値が小さくなるように) 新たなモデルが構築される 1
  2. 準備: 損失関数 (Loss Function) [回帰] 2 サンプルごとに、モデルが予測をミスした量を計算する関数 L(y(i), f(x(i))) (

    ) ( ) ( ) ( ) ( ) ( ) ( ) ( )2 1 , 2 i i i i L y f y f = − x x 回帰係数の場合 y(i) : i 番目のサンプルにおける目的変数の値 x(i) : i 番目のサンプルにおける説明変数ベクトル f : 回帰モデル f(x(i)) : i 番目のサンプルにおける目的変数の推定値 ( ) ( ) ( ) ( ) ( ) ( ) ( ) , i i i i L y f y f = − x x ・・・など、いろいろとあります
  3. 準備: 損失関数 (Loss Function) [分類] 3 サンプルごとに、モデルが予測をミスした量を計算する関数 L(y(i), f(x(i))) クラス分類の場合も

    いろいろあります y(i) : i 番目のサンプルにおけるクラス x(i) : i 番目のサンプルにおける説明変数ベクトル f : クラス分類モデル f(x(i)) : i 番目のサンプルにおける推定されたクラス ( ) ( ) ( ) ( ) , , 1 , ln K i i j k j k k L y f p p = = − x Adaboost におけるサンプルの重み w(i) Adaboost や w(i) の詳細はこちら https://datachemeng.com/adaboost/ 特に決定木のときは交差エントロピー誤差関数 K : クラスの数 pj,k : サンプル i が含まれる 葉ノード j における、 クラス k のサンプルの割合
  4. 準備: 損失関数 (Loss Function) [分類] 4 サンプルごとに、モデルが予測をミスした量を計算する関数 L(y(i), f(x(i))) (

    ) ( ) ( ) ( ) ( ) ( ) , log i i i c L y f p = − x x ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) 1 exp exp i k i k K i j j f p f = =  x x x K クラスを分類する多クラス分類のとき、クラスごとにK 種類の y (1 or −1) の変数を作成して、K 個の二クラス分類モデルを作成 (あるクラスにおいて、対象のサンプルが 1、それ以外のサンプルが −1) c : y(i) の実際のクラスに対応 する二クラス分類モデルの番号 k 番目の二クラス分類モデルを fk とすると、
  5. 準備: 損失関数の勾配 [回帰] 5 損失関数の勾配: L(y(i), f(x(i))) を f(x(i)) で偏微分して、

    マイナスの符号をつけたもの “勾配” ブースティングの名前の由来 ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )2 1 , 2 i i i i L y f y f = − x x ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) , i i i i i L y f y f f ∂ − = − ∂ x x x 例)
  6. 準備: 損失関数の勾配 [分類] 6 ( ) ( ) ( )

    ( ) ( ) ( ) ( ) ( ) , i i i k i k L y f q p f ∂ − = − ∂ x x x 損失関数の勾配: L(y(i), f(x(i))) を f(x(i)) で偏微分して、 マイナスの符号をつけたもの “勾配” ブースティングの名前の由来 ( ) ( ) ( ) ( ) ( ) ( ) , log i i i m L y f p = − x x 例) k 番目の二クラス分類モデルでは、 q : k が y(i) の実際の クラスに対応すれば q = 1, そうでなければ q = 0
  7. 決定木の勾配ブースティングのアルゴリズム 最初の決定木モデル f (0) をいつも通り構築する m = 1, 2, …,

    M として以下を繰り返す • サンプル i ごとに損失関数の勾配を計算 • 損失関数の勾配を y として、決定木モデルを構築 • 決定木モデルの葉ノードを Rm,j (j は葉ノードの番号) とする • 葉ノードごとに、以下を最小化する γ m,j を計算 • 以下のようにモデル f (m) を計算 (η は学習率) f (m)(x(i)) = f (m-1)(x(i)) + η (x(i) が含まれる Rm,j における γ m,j ) 7 ( ) ( ) ( ) ( ) ( ) ( ) , 1 , , i m j i m i m j R L y f γ − +  x x が含まれる 決定木の詳細はこちら https://datachemeng.com/decisiontree/
  8. Python で勾配ブースティングを実⾏するには scikit-learn の gradient boosting • 回帰: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html •

    分類: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html XGBoost (eXtreme Gradient Boosting) • https://xgboost.readthedocs.io/en/latest/python/python_intro.html LightGBM (Light Gradient Boosting Model) • https://lightgbm.readthedocs.io/en/latest/ ・・・など ⁃ すべて決定木に基づく勾配ブースティング ⁃ XGBoost, LightGBM には、オーバーフィッティングを防いだり、 計算速度を上げるための⼯夫あり 8
  9. XGBoost の主な⼯夫 9 決定木モデルを構築するときの評価関数 E に以下の式を加える 決定木の詳細はこちら https://datachemeng.com/decisiontree/ 2 2

    T λ γ + w T : 最終ノードの数 w : すべての葉ノードの値 (葉ノードのサンプルの y の平均値) が 格納されたベクトル γ, λ : ハイパーパラメータ  ノード数を小さくする  モデルの更新を小さくする オーバーフィッティングの低減 さらに、m での決定木の構築に、m-1 での決定木の勾配情報を利用して 計算速度向上も
  10. LightGBM の主な特徴 Gradient-based One-Side Sampling (GOSS) • m 回目の学習のとき、勾配の絶対値の大きな a

    × 100 % の サンプルと、それ以外のサンプルから b ×100 % をランダムに選択 したサンプルのみを用いる • ランダムに選択されたサンプルの勾配は (1-a)/b 倍して利用 Exclusive Feature Bundling (EFB) • 0 でない値をもつサンプルのかぶりが少ない変数は、一緒にして “bundle” として扱う ⁃ 例えば 0 から 10 の値をもつ変数 A と 0 から 20 の値をもつ 変数 B があるとき、B に一律に 10 足して、A と B とを 合わせたものが bundle • 変数からではなく、bundle から決定木を作成 • ヒストグラムで値をざっくり分けてから決定木の分岐を探索 10 オーバーフィッティングの低減 & 計算速度向上
  11. デモの Python プログラムあります︕ XGBoost や LightGBM を利用したい⽅は、まずはそれぞれを インストールする必要があります (Anaconda 利用を想定)

    • XGBoost: https://anaconda.org/anaconda/py-xgboost • LightGBM: https://anaconda.org/conda-forge/lightgbm demo_of_gradient_boosting_classification_default_hyperparam.py, demo_of_gradient_boosting_regression_default_hyperparam.py ではデフォルトのハイパーパラメータで実⾏されます。 method_flag で お好きな手法の番号にして実⾏してください demo_of_gradient_boosting_classification_with_optuna.py, demo_of_gradient_boosting_regression_with_optuna.py では optuna でハイパーパラメータの最適化をしてから各手法が実⾏されます。 optunaをインストールする必要があります • optuna: https://optuna.org/ 11 こちら https://github.com/hkaneko1985/gradient_boosting へどうぞ︕
  12. データセットを変えて、プログラムをご利用ください optuna を用いたハイパーパラメータの最適化はこちらの examples https://github.com/pfnet/optuna/tree/master/examples を参考にしました • ただ、デフォルトのパラメータでも良好なモデルを構築できたり、 ベイズ最適化するよりテストデータの推定結果がよくなったりすることも あります。デフォルトのパラメータとベイズ最適化したパラメータとで

    両⽅比較するとよいです。 今回のデモのプログラムでは以下のデータセットを利用しています • 回帰: ボストンのデータセット https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html • 分類: あやめのデータセット https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html x (説明変数), y (目的変数) のデータを変えるだけで (19, 20⾏目あたり)、デモのプログラムをそのまま利用できます。 ご活用ください︕ 12
  13. 参考文献 A. Natekin, A. Knoll, Gradient boosting machines, a tutorial,

    Front. Neurobot., 7, 1-21, 2013 https://doi.org/10.3389/fnbot.2013.00021 T. Hastie, R. Tibshirani, J. Friedman, The Elements of Statistical Learning: Data mining, Inference, and Prediction, Second Edition, Springer, 2009 https://web.stanford.edu/~hastie/ElemStatLearn// T. Chen, C. Guestrin, XGBoost: A Scalable Tree Boosting System, arXiv:1603.02754, 2016 https://arxiv.org/abs/1603.02754 G. Ke, Q. Meng, T. Finley, T. Wang, W. Chen, W. Ma, Q. Ye, T. Y. Liu, LightGBM: A Highly Efficient Gradient Boosting Decision Tree, NIPS Proceedings, 2017 https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree 13