見出し画像

ブースティングとバギングの違いを知ろう

書籍『LightGBM予測モデル実装ハンドブック』の「第1章-2 予測モデルの概要-機械学習アルゴリズム」より、「決定木のアンサンブル学習」および「勾配ブースティングのライブラリ」を公開します。
前回ご紹介した「機械学習アルゴリズムの全体像」を先にお読みいただくことを推奨します。

決定木のアンサンブル学習

アンサンブル学習の手法には、弱学習器を直列に配置して順番に学習する「ブースティング(Boosting)」と、並列に配置して独立に学習する「バギング(Bagging)」の2つの学習方法があります。

ブースティング

ブースティング(Boosting)は複数の弱学習器を使って順番に学習して1つの予測モデルを作成する手法です。ブースティングの中で有名なアルゴリズムは勾配ブースティング(Gradient Boosting)[2]とアダブースト(AdaBoost)[3]の2つです。勾配ブースティングは弱学習器に決定木を使用するので、「勾配ブースティング木(GBDT:Gradient Boosting Decision Tree)」と記載することもありますが、本書は「勾配ブースティング」と記載します。
勾配ブースティングの学習は1つ手前の決定木の予測値を利用しながら、予測の精度を段階的に改善します。K本の決定木をブースティングする場合は、図1.9のようにK本ぶんの残差(=正解値−予測値)を計算し、それぞれの残差が最小化するような決定木の重みを学習します。図1.3の学習データの誤差をK本の決定木に対し、繰り返し計算するイメージで、手前の木の誤差修正のおかげで、ブースティングが進むほど残差は小さくなります。学習の詳細は5.2節を確認してください。

勾配ブースティングの予測はK本の決定木に予測したい特徴量xを入力し、初期値y^(0)に決定木kにおいて特徴量の条件に該当した葉の重みwk(x)(誤差を決定木で汎化した数値)を順番にK本ぶん加算します。予測の詳細は2.4節を確認してください。

バギング

バギング(Bagging:Bootstrap aggregatingの略)は互いに独立した複数の弱学習器を並列に作成し、学習器の予測を平均化して、1つの優れた予測を作る方法です。回帰の場合は予測が連続値なので、予測の平均を計算できますが、分類の場合は弱学習器のラベルで多数決を取りラベルを決めます。ランダムフォレストは弱学習器に決定木を使用した手法で、回帰のときは回帰木、分類のときは分類木を使用します。

バギングは、その名前の一部にもなっているBootstrap法で複数の多様な決定木を作って弱学習器とします。Bootstrap法は1回のサンプリングで同じレコードの重複抽出を許可します。加えて、決定木の作成に使用できる特徴量の数を制限して、決定木ごとに選択できる特徴量をランダムに変えます。ランダムフォレストは、学習データの「行」と「列」のデータサンプリングにランダム性を加えることで、多様性を持った決定木を作成し、それらの予測値を平均化して精度を高めるアルゴリズムです。独立した複数の決定木を組み合わせることで、決定木の弱点である過学習を緩和し、汎化性を向上させます。

勾配ブースティングのライブラリ

ここでは勾配ブースティングの実装ライブラリを簡単に紹介します。

scikit-learn

ライブラリscikit-learnは幅広く機械学習アルゴリズムをカバーし、勾配ブースティングのAPIも提供しています。

  1. sklearn.ensemble.GradientBoostingRegressor

  2. sklearn.ensemble.GradientBoostingClassifier

  3. sklearn.ensemble.HistGradientBoostingRegressor

  4. sklearn.ensemble.HistGradientBoostingClassifier

GradientBoostingRegressorやGradientBoostingClassifierは、内部で回帰木
(sklearn.tree.DecisionTree Regressor)を呼び出し、特徴量の条件分岐を作成します。そのため、大規模データだと学習に時間がかかってしまい、実務で使われることは多くありません。scikit-learnはLightGBMにインスパイアされたHistGradient Boosting[10]も提供しています。HistGradientBoostingは特徴量ごとのレコードの値をヒストグラムで粗くすることで、特徴量の条件分岐の計算を高速化したアルゴリズムです。実務ではこちらの方が好まれます。

xgboost

2014年発表のXGBoost[4]のアルゴリズムを実装したライブラリです。XGBoostはKaggleを始めとしたデータ分析コンペで上位を占め、現在でも人気が高いアルゴリズムです。

lightgbm

2016年発表のLightGBM[6]を実装したライブラリです。XGBoostの改良点を受け継ぎつつ、ヒストグラムを活用することで、XGBoostよりも高速に学習できるため実務でも広く使われます。精度は同程度ですが、使える目的関数や評価指標が増え、ハイパーパラメータもXGBoostより細かい調整が可能です。

catboost

2017年発表のCatBoost[11]を実装したライブラリで、target encodingで指定したカテゴリ変数の特徴量を数値に変換します。target encodingはカテゴリ値ごとの目的変数の平均値を使って数値に変換します。また、oblivious decision treesと呼ばれる、深さと左右の条件分岐が同じ決定木を使用します。

なお、ライブラリxgboostは「Learning API」と「scikit-learn API」を、ライブラリlightgbmは「Training API」と「scikit-learn API」をそれぞれ提供しています。scikitlearn APIは、scikit-learnでの操作と互換性のあるインターフェースを提供しています。ハイパーパラメータ名などのわずかな差がありますが、今回のハンズオンはTraining APIを使用します。

アルゴリズムとライブラリの表記
XGBoost、LightGBM、CatBoostなど大文字を含むときはアルゴリズムを指します。これらのアルゴリズムは独自の改良を加えて、実装ライブラリも発表しています。ライブラリを指すときはxgboost、lightgbm、catboostなど小文字で記載します。

ワンポイント

参考文献

[1] scikit-learn algorithm cheat- sheet
https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
[2]Friedman, J.H. (2001). Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29, 1189-1232.
https://projecteuclid.org/journals/annals-of-statistics/volume-29/issue-5/Greedy-function-approximation-A-gradient-boosting-machine/10.1214/aos/1013203451.full
[3]Yoav Freund, Robert E. Schapire (1996), Experiments with a New Boosting Algorithm
https://cseweb.ucsd.edu/~yfreund/papers/boostingexperiments.pdf
[4]Tianqi Chen, Carlos Guestrin (2014), XGBoost: A Scalable Tree Boosting System
https://arxiv.org/abs/1603.02754
[5]XGBoost(Introduction to Boosted Trees)
https://xgboost.readthedocs.io/en/stable/tutorials/model.html
[6]Guolin Ke ,et al. (2016), LightGBM: A Highly Efficient Gradient Boosting Decision Tree
https://proceedings.neurips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf
[7]LightGBM(Features)
https://lightgbm.readthedocs.io/en/latest/Features.html
[8]LightGBM(Parameters)
https://lightgbm.readthedocs.io/en/latest/Parameters.html
[9]LightGBM(Parameters Tuning)
https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html
[10]Histogram-Based Gradient Boosting(1.11.5. Histogram-Based Gradient Boosting)
https://scikit-learn.org/stable/modules/ensemble.html#histogram-based-gradient-boosting
[11]Liudmila Prokhorenkova ,et al. (2017), CatBoost: unbiased boosting with categorical features
https://arxiv.org/abs/1706.09516
[12]Scott Lundberg, Su-In Lee (2017), A Unified Approach to Interpreting Model Predictions
https://arxiv.org/abs/1705.07874
[13]Welcome to the SHAP documentation
https://shap.readthedocs.io/en/latest/index.html
[14]Dominik Janzing ,et al. (2019), Feature relevance quantification in explainable AI: A causal problem
https://arxiv.org/abs/1910.13413
[15]TreeEnsemble instance has no attribute 'values' in LightGBM
https://github.com/slundberg/shap/issues/480
[16]Unclear documentation regarding min_data_in_leaf and min_sum_hessian_in_leaf
https://github.com/microsoft/LightGBM/issues/3816
[17]Explanation of min_child_weight in xgboost algorithm
https://stats.stackexchange.com/questions/317073/explanation-of-min-child-weight-in-xgboost-algorithm
[18]Optuna
https://optuna.readthedocs.io/en/latest/
[19]XGBoost:Custom Objective and Evaluation Metric
https://xgboost.readthedocs.io/en/stable/tutorials/custom_metric_obj.html
[20]LightGBM:Custom Objective and Evaluation Metric
https://github.com/microsoft/LightGBM/blob/master/examples/python-guide/advanced_example.py
[21]Histogram-Based Gradient Boosting(1.11.5.4. Categorical Features Support)
https://scikit-learn.org/stable/modules/ensemble.html#histogram-based-gradient-boosting
[22]optimal split for categorical features
https://github.com/Microsoft/LightGBM/issues/699

本書の目次

第1章 予測モデルの概要
 1.1 予測モデル
  イントロダクション
  テーブルデータの予測モデル
 1.2 機械学習アルゴリズム
  機械学習アルゴリズムの全体像
  決定木のアンサンブル学習
  勾配ブースティングのライブラリ
 1.3 環境構築
  サンプルコード
  Colaboratoryの初期設定とサンプルコードの格納

第2章 回帰の予測モデル
 2.1 データ理解
  住宅価格データセット
  1変数EDA
  2変数EDA
  回帰の評価指標
 2.2 線形回帰
  単回帰のアルゴリズム
  単回帰の予測値の可視化
  重回帰のアルゴリズム
  正則化
  特徴量の標準化
  重回帰の学習→予測→評価
  パラメータによる予測値の解釈
 2.3 回帰木
  決定木
  回帰木のアルゴリズム
  回帰木のアルゴリズム(学習)
  深さ1の回帰木の可視化
  深さ1の回帰木の予測値の検証
  回帰木の深さと予測値
  深さ2の回帰木の可視化
  回帰木の正則化
  回帰木の学習→予測→評価
 2.4 LightGBM回帰
  勾配ブースティング回帰のアルゴリズム
  深さ1のLightGBM回帰の可視化
  深さ1のLightGBM回帰の予測値の検証
  LightGBM回帰の学習→予測→評価
  SHAP概要
  SHAPによる予測値の説明

第3章 分類の予測モデル
 3.1 データ理解
  国勢調査データセット
  数値変数EDA
  カテゴリ変数EDA
  前処理
  分類の評価指標
  混同行列と正解率の検証
 3.2 ロジスティック回帰
  ロジスティック回帰のアルゴリズム
  ロジスティック回帰の学習→予測→評価
  パラメータによる予測値の解釈
 3.3 LightGBM分類
  勾配ブースティング分類のアルゴリズム
  LightGBM分類の学習→予測→評価
  SHAPによる予測値の説明
 3.4 検証データ評価
  検証データのモデル評価
  ホールドアウト法
  不均衡ラベルのホールドアウト法
  アーリーストッピング
  LightGBM分類(アーリーストッピング)の実装
  クロスバリデーション
  クロスバリデーションの実装

第4章 回帰の予測モデル改善
 4.1 データ理解
  ダイヤモンド価格データセット
  1数値変数EDA
  2数値変数EDA
  カテゴリ変数EDA
  前処理
  評価指標の選択
 4.2 線形回帰
  線形回帰の予測モデル
  Lasso回帰の予測モデル
 4.3 LightGBM回帰
  LightGBM回帰の予測モデル
  SHAPによる予測値の説明
  クロスバリデーションのモデル評価
  クロスバリデーション後の予測
 4.4 特徴量エンジニアリング
  新規特徴量の追加
  新規特徴量:数値変数×数値変数
  新規特徴量:数値変数×カテゴリ変数
  新規特徴量:カテゴリ変数×カテゴリ変数
  新規特徴量を追加した予測モデル
  クロスバリデーションのモデル評価
 4.5 ハイパーパラメータ最適化
  LightGBMのハイパーパラメータ
  Optunaを用いたハイパーパラメータ最適化の実装
  最適化ハイパーパラメータを用いた予測モデル
  クロスバリデーションのモデル評価
  LightGBMモデル改善の結果

第5章 LightGBMへの発展
 5.1 回帰木の計算量
  学習アルゴリズム
  回帰木の可視化
  回帰木の予測値の検証
 5.2 回帰木の勾配ブースティング
  学習アルゴリズム
  二乗誤差の重み
  勾配ブースティングの可視化
  勾配ブースティングの予測値の検証
 5.3 XGBoost
  XGBoostの改善点
  アンサンブル学習の目的関数
  XGBoostの目的関数
  葉の分割条件
  類似度によるデータ分割点の計算
  二乗誤差の重みと類似度
  XGBoostの可視化
  XGBoostの予測値の検証
  XGBoostの枝刈り
 5.4 LightGBM
  LightGBMの改善点
  ヒストグラムによる学習の高速化
  深さから葉への探索方法の変更
  カテゴリ変数のヒストグラム化
  LightGBMの可視化
  LightGBM(leaf-wise)の可視化
 5.5 学習時間の比較
  太陽系外惑星データセットと前処理
  ライブラリの学習時間比較

この記事が気に入ったらサポートをしてみませんか?