読んだ論文
・Chen, T., & Guestrin, C. (2016, August). XGBoost: A
scalable tree boosting system. In Proceedings of the 22nd
acm sigkdd international conference on knowledge
discovery and data mining (pp. 785-794). ACM.
・Friedman, J. H. (2001). Greedy function approximation: a
gradient boosting machine. Annals of statistics, 1189-1232.
XGBoost (eXtreme Gradient Boosting)
・gradient boosting の高速な実装
・Kaggle などの機械学習コンペで人気の手法らしい
話す内容
・gradient boosting とは
・XGBoost の原理: gradient tree boosting
(・XGBoost はどのような点が優れているか?)
gradient descent (steepest descent)
を求めるに対して
どのように?
→ を初期値とする.
を計算し、K回目の予測値を とする
・
・
・
→これと似たようなことを関数空間に対してやるのが
gradient boosting
gradient boosting
(復習)教師あり学習においては、訓練データ
に対して、学習器 を、目的関数
が最小になるように作る.
→各 に対して、t - 1 回目の予測器を
としたとき, が最小になるような
を考え、 とすればよさそう.
XGBoost の原理: gradient tree boosting
図の出典: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
目的関数が最小になるように決定木 を
どんどん足していく
・
・
・
→では、 は具体的にどのような形状の木であれば
いいのか?
決定木の場合の正則化項付き目的関数
L2正則化
木の葉の数
木の葉の数も含めて最小化することで、
決定木が複雑になりすぎて過学習して
しまうことを防ぐ
求める決定木 が 枚の葉から成り、それぞれの葉の重み
を とすると、 は
を最小化するものであるとよい
gradient descent では勾配(一次近似)を用いたが、
今回のgradient tree boostingでは二次近似を用いる
(その方が少ない回数で最適な関数になることが
先行研究で示されている)
定数項でない部分だけ取り出して
考えればよい
これが最小になるような が j 番目の葉の最適な重み
が最小になるような は
で、そのときの最小値は
これが小さければ小さいほど「良い木」!
の場合・・・
図の出典: https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
が小さいほど「良い木」といっても
全ての木の形状のパターンに対してこれを調べるのは無理・・・
→毎回(木を分ける前)ー (木を分けた後)が最大になるように
枝分かれをすればよい
が最大になるように枝分かれさせる
「正則化項を付ける」以外の過学習を防ぐ工夫
Shrinkage:
Column Subsampling:
以上、XGBoost の原理: gradient tree boosting の説明でした
XGBoost で用意されている枝分かれアルゴリズム
その1: Basic Exact Greedy Algorithm
あり得る全ての枝分かれの
中で、
スコアが最大値になるような
枝分かれを選んでいく
→データがメモリに完全に
おさまらない場合や、
メモリを分散させて
並列計算させる場合は
難しい
(上図は論文から借用)
XGBoost で用意されている枝分かれアルゴリズム
その2: Approximate Algorithm
(上図は論文から借用)
あらかじめ枝分かれの分け方の候補を決めておく!
分け方の候補の決め方は?
→Weighted Quantile Sketch というXGBoost独自のアルゴリズム
で計算
→このアルゴリズムにより、Approximate Algorithm は
Basic Exact Greedy Algorithm と同じ程度の精度を示せる
ユーザーは Basic Exact Greedy Algorithm と Approximate Algorithm
のどちらも選択可能
XGBoost の枝分かれアルゴリズムのさらなる特長:
Sparsity-aware Split Finding
現実のデータはsparse(疎な、ゼロの多い)であることが非常に多い
→データの値が欠けているとき、
デフォルトの枝分かれの方向を
決めておく
(右図は論文から借用)
(上図は論文から借用)
XGBoost のシステム設計
・それぞれの特徴量ごとに、値の大きさでソートされたデータ単位
(ブロック)でデータが管理される
→並列計算が可能に
・Cache-aware Access, Block Compression, Block Sharding により
out-of-core でも(外部記憶装置からデータを読み出す場合でも)
tree boosting が可能に
(詳しい仕組みは論文を読んでもよくわかりませんでした・・・)
・out-of-core でも gradient tree boosting できるのは
XGBoostだけらしい
(上図は論文から借用)
👉XGBoost は高速なだけでなく、
複数のメモリを並列して使う場合や、
データを外部記憶装置から読み出す場合なども含め、
あらゆる規模で使えるという点で優れている

Gradient Tree Boosting はいいぞ