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

Dive into XGBoost

F6c0cb53d72908942998923f1a05c71b?s=47 Maxwell
May 23, 2018

Dive into XGBoost

A naive explanation of Boosting family.
If you find something wrong or have a question, please let me know.

F6c0cb53d72908942998923f1a05c71b?s=128

Maxwell

May 23, 2018
Tweet

Transcript

  1. XGBoost - State Of The Art Algorithm - Maxwell https://speakerdeck.com/hoxomaxwell

    https://twitter.com/Maxwell_110
  2. 1. XGBoost とは? 2. XGBoost へ至るまで・・・ ( Adaboost -> Gradient

    Boost -> XGBoost ) 3. XGBoost 再訪 4. XGBoost example
  3. 1. XGBoost とは? 2. XGBoost へ至るまで・・・ (Adaboost -> Gradient Boost

    -> XGBoost) 3. XGBoost 再訪 4. XGBoost example
  4. XGBoost とは? 「 Boosting Tree algorithm 」の一種で、 Kaggle で現在最も使われているモデルの1つ。 構造化データに対して、最高峰の精度を誇り、

    計算速度をあげるべく色々な工夫が施されている。 開発元は、DMLC ( Distributed Machine Learning Community ) https://github.com/dmlc
  5. DMLC Associate Professor of Washington Univ in CS Ph.D. student

    of Washington Univ in CS
  6. Main developer 後程、 XGBoost のアルゴリズムに関してお話をしますが、 基本的には、Chen 氏の著名な論文である、 「 XGBoost :

    A Scalable Tree Boosintg System 」 をもとにしています。 Arxiv http://dmlc.cs.washington.edu/data/pdf/XGBoostArxiv.pdf
  7. Github https://github.com/dmlc/xgboost R package Python package R や Python 用の

    wrapper package が提供されている。 C ++ などの開発言語に不慣れでも 安心して使用することができる。 R であれば、 > install.packages('xgboost') で一発でインストール可能。 是非、使ってみましょう!
  8. 1. XGBoost とは? 2. XGBoost へ至るまで・・・ (Adaboost -> Gradient Boost

    -> XGBoost) 3. XGBoost 再訪 4. XGBoost example
  9. と、その前に・・・ 後の理解のために、 「 3 つ の 基礎知識 」 を確認しておきましょう。

  10. 知識確認のために、ここでは、 = . − . + . + . で表される多項式にガウシアンノイズを加え、

    サンプリングしたデータに対し、多項式をフィッティングすることを考える。 多項式の最大の次数は 4 次であるが、 正解の式を知らない場合、その次数も含めて推定しなければならない。 ガウシアンノイズ ( ~ N(0, 0.7^2) ) を付加 最大次数が 3, 4, 6, 9 次 であった場合にそれぞれフィッティングした結果を 「学習データ」と「検証データ」の両方に対して検証していく。
  11. 基礎知識 1 : バイアス と バリアンス モデルの学習(フィッティング)の際は 期待二乗損失関数 を使用し多項式の係数を決定する。 =

    − , この期待二乗損失関数は、以下の形に分解ができる。 = ; − + ; − ; + − , 1 2 3 bias2 variance noise 但し、この式における ∙ とは、 データの取り方 に関して期待値をとったもの : 特徴量 : 目的変数 () : モデルによる予測値 (, ) : 特徴量と目的変数の同時分布 () : 理想的な回帰関数(最良の予測) データの取り方に対しての 予測値の期待値が理想的な予測値から どれだけ乖離しているかを表したもの 各データの取り方に対しての予測値が、 期待値からどれだけ変動するかを表したもの 予測したい事象に含まれる 本質的なノイズで、 理想的なモデルでは除去しきれない 誤差を表したもの 1 2 3
  12. bias^2 variance poly3 0.0463 0.0019 poly4 0.0003 0.0019 poly6 0.0003

    0.0028 poly9 0.0005 0.0041 bias と variance モデルの自由度(表現力) が高くなると、 bias が低くなり、 variance が大きくなる bias と variance を バランスよく小さくする モデル が 予測性能の意味で 最適なモデル (test の結果が良い)
  13. 1. 学習データ( train )の方では、9 次の多項式のあてはまり具合が一番良い 2. しかし、検証データ( test )では、正解である 4

    次の多項式が一番良い この時、6 次と 9 次の多項式は、「 過学習している 」ことになる。 基礎知識 2 : 過学習
  14. 2 次の正則化項( penalty )を加えた評価関数で、 各多項式の学習データに対する当てはまり具合をみてみると、 4 次の多項式のあてはまり具合が一番良くなっている! 結果として、4 次の多項式を一番良いモデルとして選択ができる。 正則化による過学習抑制の典型例

  15. 基礎知識 3 : 決定木 二値分類 ▲ と ▪ を X1

    と X2 で分類するタスク X1 >= 10 X1 < 10 X2 <= 7 X2 > 7 ACC : 95% 8 5 1 6 5 0 1 14 予測 観測 X 1 X 1 = 10 X 2 = 7 : 6 : 14 X 2 ( X1 , X2 ) = ( 3.9, 9.1 ) 過学習していない木 (深さ 2) X1 <= 4 X1 > 4 3 1 3 X2 <= 9 X2 > 9 1 1 2 X2 <= 10 X2 > 10 1 1 過学習した木 (深さ 5) 6 0 0 14 予測 観測 ACC : 100%  特徴量を非線形な境界を描くようにあつかえる  際限なく深い木にすることで、 学習データに対して 100% の精度に することができるが、過学習することが多い 学習データに対する精度を 幾らでも良くすることができるため、 バイアスは低いが、バリアンスは大きい
  16. では、本題に・・・

  17. コミッティ( committee ) 複数のモデルを何らかの方法で 組み合わせることにより、 単一のモデルを利用する場合よりも 性能を改善すること。  バギング( Bagging

    )  ブースティング( Boosting )
  18. バギング( Bagging, Breiman 1996 ) X から y を予測(分類・回帰)する問題に対して、 データを

    M 通りサンプリング(ブートストラップ)し、 それぞれに対して同一のモデル(例えば、決定木など)を あてはめることを考える。 : モデルの数(ブートストラップの回数) () : 各モデル(弱学習器と呼ぶ)の予測関数 () : 予測しようとする事象に対する最適な「真の予測関数」 () : モデルが正確でないことに起因する誤差関数 = = () = + () prediction Bootstrap weak learner raw data
  19. − () = = = = = < ここで、 簡単のために、誤差の平均が

    0、分散が同一値()、 かつ無相関であるとすれば、 入力データ X の分布に対する期待二乗和誤差に対して、 となることは、すぐに分かる。( 但し、[ ] は、データXの分布に対しての期待値 ) つまり、複数の弱学習器の予測値を平均することで、予測値のばらつきを低減できる。 上記は、モデルの誤差が無相関であるこということを仮定しており 厳密にはなりたたない(似たようなモデル間の誤差には必ず相関がある)。 そのため、上記ほどには予測値の平均のばらつきを低減することはできない。 とはいえ、バギングをすることで一定の効果があることは保証されている。 = = () = + () 前頁の式は、
  20. Random Forest 1. 弱学習器として、複雑な相互作用関係をとらえることのできる決定木を採用。 ( バイアスは小さいが、バリアンスが大きい決定木 をバギングすることで、 精度の向上が期待できる。 過学習は木の成長のさせ方などでも抑制。) 2.

    各決定木の学習の際、 元データからブートストラップ(復元抽出)で、 学習用データを作成し、これを使って決定木の学習を行う。 3. 学習させた複数個( 一般的には、数百 ~ 数千個 )の決定木の 予測値を平均したものを予測値とする。 4. 決定木における枝分かれの際に、全ての特徴量を使用するのではなく、 全特徴量の一部をランダムサンプルし、枝の分岐に使用する。 これにより、各決定木間の相関を低減させることができ、 予測値(各決定木の平均)の分散の低減を可能にしている。 5. 以上は、最もベーシックな Random Forest の特徴だが、 これら以外にも色々な工夫が施された亜種がたくさん存在する。 (例)Extremely Randomized Forest https://scikit-learn.org/stable/modules/ensemble.html#extremely-randomized-trees
  21. ~ 1997 ~ 2000 ~ 2006 ~ 2016 ~ 2019

    AdaBoost. M1 ( Classification task ) AdaBoost. M1 ( Regression task ) Gradient Boosting Tree Extreme Gradient Boosting What’s Next ? ブースティング( Boosting ) LightGBM CatBoost XGBoost に至るまでの Boosting の開発の流れを アルゴリズムの視点で追いかける
  22. AdaBoost ( AdaBoost.M1 ) 分類問題:Freund and Schapire ( 1997 )

    回帰問題:Friedman ( 2001 ) () = = () = + () () = = () = + () Random Forest AdaBoost. M1 1. 各弱学習器に対して重みが異なる! 2. 各弱学習器のフィッティングは、独立には行われない。 連続的に学習が行われる点が Random Forest と大きく異なる。
  23. データは、 = , , … , 個あり、 それぞれが重み係数 をもつ。 弱学習器である「決定木」は、

    = , , … , 個あり、 + 番目の決定木は、 番目の学習が終わってから、 学習を開始することになる。 各弱学習器は、 最終予測値にそれぞれ の重みで寄与する。 2 クラス分類問題を考える。 クラスのラベルは、 = − 次頁でお話をする内容の前提 ※・・・決定木の分割の仕方などのお話はしません。 ESL などの書籍を参考にしてください。 -1 +1
  24. あるデータ の重み に関して () () () () () () ()

    () = = () 1. = , … , のデータの重み の初期化 () = ( 上添え字 (1) は、最初の決定木であることを表す ) 2. = , … , について以下を「順に」行う ( a ) 弱学習器 () を誤差関数 を 最小化するようにフィッティング = = () ( ) ≠ ( ) ≠ は指示関数で、 括弧内が成立する時に 1 それ以外では 0 ( b ) 番目の学習器の重み を求める = = () = ln 1− ( c ) データ点の重み係数を更新する (+) = () ( ) ≠ 3. 左図の下式で最終モデルの予測を構成する AdaBoost. M1 のアルゴリズム 1 2 3 M
  25. AdaBoost .M1 のアルゴリズム : 補足 1. AdaBoost. M1 アルゴリズムは、 より一般的な「前向き段階的加法的モデリング」の一例として考えることができる。

    2. 「前向き段階的加法的モデリング」とは、 番目の弱学習器(木) () とその木の重み を更新する際に、 , = = , − + は、 番目の決定木の予測値。 . は 損失関数。 − () は − () = = − () で表される。 として扱ったもの。 3. AdaBoost .M1 は、損失関数として指数損失を用いたものと等価。( = ) 4. 回帰問題に対しては、例えば、二乗誤差などが考えられる。 ,
  26. Gradient Boosting Tree AdaBoost からの改良点(要点のみ) 1. 損失関数 ∙ が微分可能である時、 ,

    = , − + , − − − − と、近似できることを利用して、 損失関数の − 時点における = , , … , の各データ点の 負の勾配値 − = − , − − に 番目の決定木の予測値が近づくように、 時点 における 決定木の構造(分割点、分割終端ノードの各予測値) を決める。 2. 例えば、損失関数 ∙ が 最小二乗損失 である時、 − = − , − − = − − − − = − − と、 − 時点での残差というシンプルな形になっている。 つまり、 番目の決定木の予測値はこの残差に近づければよい。 最急降下法の適用により 汎用性が向上 ∙ の定義は前頁参照
  27. 1. XGBoost とは? 2. XGBoost へ至るまで・・・ (Adaboost -> Gradient Boost

    -> XGBoost) 3. XGBoost 再訪 4. XGBoost example
  28. Extreme Gradient Boosting GBT からの改良点(要点のみ) 1. 損失関数に正則化項を付加 「前向き段階的加法的モデリング」の形式を少し修正すると、 = =

    , − + 但し、 は決定木の予測値 ここで、損失関数 . を下記のように 正則化項 を含むように変更。 = , − + + = ( ) 正則化項 は、決定木の構造に関連した L1 及び L2 正則化項をもつ。 正則化項の採用により 過学習を抑制
  29. 2. 勾配に加えてヘッシアン(2階微分)を考慮 GBM の時に考えた損失関数の展開形式を少し修正すると、 , = , − + ,

    − − − − + , − − − − と 2 次の項まで含めた式に修正できる。 これに前頁の正則化項を加えて、 番目の決定木の構造を最適化するための目標値を計算する。 ヘッシアンを含めた最適化により 計算速度が向上
  30. 3. 決定木の分割時における 分割候補点の探索アルゴリズムの改善 4. 欠損値・疎なデータに対する効率的な決定木における ルーティング (どのノードにデータ点が分配されるかを効率的に計算) より詳しい内容を知りたい方は、 元論文を読むことをお勧めします https://arxiv.org/pdf/1603.02754.pdf

  31. 1. XGBoost とは? 2. XGBoost へ至るまで・・・ (Adaboost -> Gradient Boost

    -> XGBoost) 3. XGBoost 再訪 4. XGBoost example
  32. R Demo

  33. Thanks! Any questions ? You can find me at: kaggle@Maxwell