# 勾配ブースティング決定木の手法をPythonで実装して比較していく！

> 当サイト【スタビジ】の本記事では、勾配ブースティングの各手法をPythonで実装して徹底比較していきます！勾配ブースティングの代表手法「Xgboost」「Light gbm」「Catboost」で果たしてどのような違いがあるのでしょうか？

- URL: https://toukei-lab.com/gradient-boosting
- 公開: 2022.11.29 / 更新: 2025.09.09
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、勾配ブースティングの各手法をPythonで実装して徹底比較していきます！勾配ブースティングの代表手法「Xgboost」「LightGBM」「CatBoost」で果たしてどのような違いがあるのでしょうか？
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

[Xgboost](/xgboost)に代わる手法として[LightGBM](/light-gbm)が登場し、さらに[Catboost](/catboost)という手法が2017年に登場いたしました。

これらは[弱学習器](/weak-learning)である[決定木](/%E6%B1%BA%E5%AE%9A%E6%9C%A8)を勾配ブースティングにより[アンサンブル学習](/ensemble)した非常に強力な機械学習手法群。

勾配ブースティングの仲間としてくくられることが多いです。

計算負荷もそれほど重くなく非常に高い精度が期待できるため、[Kaggle](/kaggle)などの[データ分析コンペ](/data-competition)や実務シーンなど様々な場面で頻繁に使用されているのです。

:::talk{who="robotan"}
最新のアルゴリズムがどんどん登場するけど、勾配ブースティング×決定木の組み合わせであることは変わらないんだね！
:::

:::talk{who="umatan"}
そうなんだよー！それだけ勾配ブースティング×決定木の組み合わせが強いということだね！
:::

この記事では、そんな<mark>最強の手法である「勾配ブースティング」について見ていきます！</mark>

勾配ブースティングの代表的な手法である「[Xgboost](/xgboost)」「[LightGBM](/light-gbm)」「[Catboost](/catboost)」をPythonで実装し、それぞれの<mark>精度と計算負荷時間</mark>を比較していきます！

:::talk{who="umatan"}
Pythonの勉強は以下の記事をチェック！
:::

<https://toukei-lab.com/python-learn>

## 勾配ブースティングとは

詳細の数式は他のサイトに譲るとして、この記事では<mark>概念的に勾配ブースティングが理解できるように解説</mark>していきます。

動画でも勾配ブースティング手法のXGBoostやLightGBMについて解説していますのであわせてチェックしてみてください！

::youtube{#AEhym-wo3mc}

まず、勾配ブースティングは「**勾配＋ブースティング**」に分解できます。

まずは、ブースティングから見ていきましょう！

機械学習手法には単体で強力な精度をたたき出す「強学習器（[SVM](/svm)とか）」と単体だと弱い「[弱学習器](/weak-learning)（[決定木](/%E6%B1%BA%E5%AE%9A%E6%9C%A8)とか）」あります。

<https://toukei-lab.com/weak-learning>

弱学習器単体だと、<mark>予測精度の悪い結果になってしまいますが複数組みあわせて使うことで強力な予測精度を出力するのです。</mark>

それを[アンサンブル学習](/ensemble)と言います。

そして[アンサンブル学習](/ensemble)には大きく分けて2つの方法「バギング」「ブースティング」があります（スタッキングという手法もありますがここではおいておきましょう）。

バギングは並列に[弱学習器](/weak-learning)を使って多数決を取るイメージ。

![バギング](/wp-content/uploads/2018/01/66c19942ab4ba346fdb64ccc04cde373-5.png)

バギング×[決定木](/%E6%B1%BA%E5%AE%9A%E6%9C%A8)は[ランダムフォレスト](/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88)という手法で、こちらも非常に強力な機械学習手法です。

一方、ブースティングとは前の弱学習器が上手く識別できなった部分を重点的に次の弱学習器が学習する直列型のリレーモデル。

以下のようなイメージです。

![勾配ブースティング](/wp-content/uploads/2019/07/xgboost.jpg)

そして、「[Xgboost](/xgboost)」「[LightGBM](/light-gbm)」「[Catboost](/catboost)」はどれもブースティング×決定木との組み合わせなんです。

続いて勾配とは何を示しているのか。

ブースティングを行う際に<mark>[損失関数](/loss-function)というものを定義してなるべく損失が少なくなるようなモデルを構築する</mark>のですが、その時使う方法が[勾配降下法](/gradient-descent)。

そのため勾配ブースティングと呼ばれているんです。

最適化手法にはいくつか種類がありますが、もし興味のある方は以下の書籍が非常におすすめなのでぜひチェックしてみてください！

::product[これなら分かる最適化数学―基礎原理から計算手法まで]{url="https://www.amazon.co.jp/dp/4320017862?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/415el2mAUJL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/4320017862?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E6%259C%2580%25E9%2581%25A9%25E5%258C%2596%25E6%2595%25B0%25E5%25AD%25A6%2F%3Ff%3D1%26grp%3Dproduct"}

## 勾配ブースティングをPythonで実装

勾配ブースティングについてなんとなーくイメージはつかめたでしょうか？

それでは実際に<mark>勾配ブースティング手法をPythonで実装して比較していきます！</mark>

使用するデータセットは画像識別のベンチマークによく使用される**Mnist**というデータです。

Mnistは以下のような特徴を持っています。

:::memo
・0\~9の手書き数字がまとめられたデータセット\
・6万枚の訓練データ用（画像とラベル）\
・1万枚のテストデータ用（画像とラベル）\
・白「0」～黒「255」の256段階\
・幅28×高さ28フィールド
:::

[ディープラーニング](/deep-learning)のパフォーマンスをカンタンに測るのによく利用されますね。

### Xgboost

さて、まずは[Xgboost](/xgboost)。

[Xgboost](/xgboost)は今回比較する勾配ブースティング手法の中でもっとも古い手法です。

基本的にこの後に登場する[LightGBM](/light-gbm)も[Catboost](/catboost)も[Xgboost](/xgboost)をもとにして改良を重ねた手法になっています。

```python title="Xgboost_mnist.py"
import xgboost as xgb
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split

# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train_base, labels_train_base), (X_test, labels_test) = mnist.load_data()

# Training set を学習データ（X_train, labels_train）と検証データ（X_validation, labels_validation）に8:2で分割する
X_train,X_validation,labels_train,labels_validation = train_test_split(X_train_base,labels_train_base,test_size = 0.2)

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_validation = X_validation.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_validation = X_validation.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_validation /= 255
X_test /= 255

# 訓練・テストデータの設定
train_data = xgb.DMatrix(X_train, label=labels_train)
eval_data = xgb.DMatrix(X_validation, label=labels_validation)
X_data = xgb.DMatrix(X_test, label=labels_test)

#経過時間計測
import time
start = time.time()

xgb_params = {
    # 多値分類問題
    'objective':'multi:softmax',
    # クラス数
    'num_class': 10,
    # 学習用の指標 (Multiclass logloss)
    'eval_metric': 'mlogloss',
    }
evals = [(train_data, 'train'), (eval_data, 'eval')]

gbm = xgb.train(
    xgb_params,
    train_data,
    num_boost_round=100,
    early_stopping_rounds=10,
    evals=evals,
    )

preds = gbm.predict(X_data)
from sklearn.metrics import accuracy_score
print('accuracy_score:{}'.format(accuracy_score(labels_test, preds)))

#経過時間
print('elapsed_timetime:{}'.format(time.time()-start))

```

どのモデルもIteration=100, eary-stopping=10で比較していきましょう！

結果は・・・以下のようになりました。

![Xgboost　Mnist](/wp-content/uploads/2020/04/xgboost_perfomance2.jpg)

0.9764は普通に高い精度！！

ただ、学習時間は1410秒なので20分以上かかってます

:::talk{who="robotan"}
結構時間がかかるんだな、、、
:::

[Xgboost](/xgboost)については以下の記事で詳しくまとめていますのでこちらもチェックしてみてください！

<https://toukei-lab.com/xgboost>

### Light gbm

続いて、[LightGBM](/light-gbm)！

[LightGBM](/light-gbm)は[Xgboost](/xgboost)よりも高速に結果を算出することにできる手法！

[Xgboost](/xgboost)を含む通常の決定木モデルは以下のように階層をあわせて学習していきます。

それをLevel-wiseと呼びます。

![level-wise学習法](/wp-content/uploads/2020/02/level-wise.jpg)\
（引用元：[Light GBM公式リファレンス](https://lightgbm.readthedocs.io/en/latest/Features.html)）

一方Light GBMは以下のように葉ごとの学習を行います。これをleaf-wise法と呼びます。

![leaf-wise学習法](/wp-content/uploads/2020/02/leaf-wise.jpg)\
（引用元：[Light GBM公式リファレンス](https://lightgbm.readthedocs.io/en/latest/Features.html)）

これにより、ムダな学習をしなくても済むためよりXGBoostよりも効率的に学習を進めることができます。

> Gradient Boosting Decision Tree (GBDT) is a popular machine learning algorithm, and has quite a few effective implementations such as XGBoost and pGBRT. Although many engineering optimizations have been adopted in these implementations, the efficiency and scalability are still unsatisfactory when the feature dimension is high and data size is large. A major reason is that for each feature, they need to scan all the data instances to estimate the information gain of all possible split points, which is very time consuming.\
> （引用元：[Google-“LightGBM: A Highly Efficient Gradient Boosting\
> Decision Tree”](https://proceedings.neurips.cc/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf)）

詳しくは以下の記事でまとめていますのでチェックしてみてください！

<https://toukei-lab.com/light-gbm>

それでは、[LightGBM](/light-gbm)の結果はどのようになるでしょうか・・・？

```python title="light GBM_mnist.py"
import lightgbm as lgb
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train, labels_train), (X_test, labels_test) = mnist.load_data()

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

# 訓練・テストデータの設定
train_data = lgb.Dataset(X_train, label=labels_train)
eval_data = lgb.Dataset(X_test, label=labels_test, reference= train_data)

params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'multiclass',
'num_class': 10,
'verbose': 5,
}

gbm = lgb.train(
    params,
    train_data,
    valid_sets=eval_data,
    num_boost_round=50,
)

preds = gbm.predict(X_test)
preds
y_pred = []
for x in preds:
  y_pred.append(np.argmax(x))

accuracy_score(labels_test, y_pred)
```

![Xgboost　Mnist](/wp-content/uploads/2020/04/Light-GBM_performance2.jpg)

Light gbmは、0.972！若干[Xgboost](/xgboost)よりも低い精度になりました。

ただ、学習時間は178秒なので、なんと[Xgboost](/xgboost)よりも8分の1ほどに短くなっています！

:::talk{who="robotan"}
さっきよりも全然早い！
:::

データサイエンスの<mark>特徴量精査のフェーズにおいて学習時間は非常に大事なので、この違いは大きいですねー！</mark>

### Catboost

続いて、[Catboost](/catboost)！

[Catboost](/catboost)は、「Category　Boosting」の略であり2017年にYandex社から発表された機械学習ライブラリ。

発表時期としては[LightGBM](/light-gbm)よりも若干後になっています。

[Catboost](/catboost)は質的変数の扱いに上手く、他の勾配ブースティング手法よりも高速で高い精度を出力できることが論文では示されています。

![Catboost performance](/wp-content/uploads/2020/03/catboost-performance.jpg)\
（引用元：”[CatBoost: gradient boosting with categorical features ](http://learningsys.org/nips17/assets/papers/paper_11.pdf)[support](http://learningsys.org/nips17/assets/papers/paper_11.pdf)”）

以下の記事で詳しくまとめていますのでチェックしてみてください！

<https://toukei-lab.com/catboost>

さて、そんな[Catboost](/catboost)のパフォーマンスはいかに！？

```python title="Catboost.py"
import pandas as pd
import numpy as np
from tensorflow.keras.datasets import mnist
from sklearn.model_selection import train_test_split

# Kerasに付属の手書き数字画像データをダウンロード
np.random.seed(0)
(X_train_base, labels_train_base), (X_test, labels_test) = mnist.load_data()

# Training set を学習データ（X_train, labels_train）と検証データ（X_validation, labels_validation）に8:2で分割する
X_train,X_validation,labels_train,labels_validation = train_test_split(X_train_base,labels_train_base,test_size = 0.2)

# 各画像は行列なので1次元に変換→X_train,X_validation,X_testを上書き
X_train = X_train.reshape(-1,784)
X_validation = X_validation.reshape(-1,784)
X_test = X_test.reshape(-1,784)

#正規化
X_train = X_train.astype('float32')
X_validation = X_validation.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_validation /= 255
X_test /= 255

# 訓練・テストデータの設定
from catboost import Pool

train_pool = Pool(X_train, labels_train)
validate_pool = Pool(X_validation, labels_validation)

#経過時間計測
import time
start = time.time()

from catboost import CatBoostClassifier
params = {
    'early_stopping_rounds' : 10,
    'iterations' : 100, 
    'custom_loss' :['Accuracy'], 
    'random_seed' :42
}
# パラメータを指定した場合は、以下のようにインスタンスに適用させる
model = CatBoostClassifier(**params)
cab = model.fit(train_pool, eval_set=validate_pool)
preds = cab.predict(X_test)
from sklearn.metrics import accuracy_score
print('accuracy_score:{}'.format(accuracy_score(labels_test, preds)))

#経過時間
print('elapsed_timetime:{}'.format(time.time()-start))

```

![Catboost　Mnist](/wp-content/uploads/2020/04/catboost_perform2.jpg)

・・・・

精度は、0.9567・・

処理時間は260秒・・

何とも<mark>中途半端な結果におわってしまいましたー！</mark>

総合的に見ると、[LightGBM](/light-gbm)が最も高速で実践的。

ただデータセットによって精度の良し悪しは変わるので、どんなデータでもこの手法の精度が高い！ということは示せない。

:::talk{who="umatan"}
データに合った手法を選んでいこう！
:::

## 勾配ブースティングまとめ

本記事では、**勾配ブースティング**について徹底的に比較してきました！

やはり[LightGBM](/light-gbm)が最も高速で実用的なようです。

:::talk{who="robotan"}
なるほどなー！違いが分かりやすい！
:::

:::talk{who="umatan"}
ぜひ自分でも実装して比較してみてねー！！
:::

[Xgboost](/xgboost)はデータセットが膨大な場合、<mark>処理時間がかかり過ぎて実用的じゃなくなるケースがあります。</mark>

ぜひ<mark>勾配ブースティングの違いを理解して、実装してみましょう！</mark>

LightGBMを使ったデータ分析については以下のUdemy講座で詳しくまとめていますのでよければチェックしてみてください！

#### [【初学者向け】データ分析コンペで楽しみながら学べるPython×データ分析講座](https://www.udemy.com/course/python-data/?referralCode=06466D9A805A034B1A97)

[![Udemy-course](/wp-content/uploads/2020/04/Udemy-me-min-1024x543.jpg)](https://www.udemy.com/course/python-data/?referralCode=06466D9A805A034B1A97)

<table class="table">
<tbody>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【講師】</th>
<td><span>僕自身！今なら購入時に「NZWCLGF4BTZENY6E」という講師クーポンコードを入れると90%オフ以上の割引価格になりますのでぜひご受講ください！</span></td>
</tr>
<tr>
<th>【時間】</th>
<td><span>4時間</span></td>
</tr>
<tr>
<th>【レベル】</th>
<td><span>初級～中級</span></td>
</tr>
</tbody>
</table>

このコースは、**なかなか勉強する時間がないという方に向けてコンパクトに分かりやすく必要最低限の時間で重要なエッセンスを学び取れるように**作成しています。

**アニメーションを使った概要編**と**ハンズオン形式で進む実践編**に分かれており、概要編ではYoutubeの内容をより体系的にデータ分析・機械学習導入の文脈でまとめています。

データサイエンスの基礎について基本のキから学びつつ、なるべく堅苦しい説明は抜きにしてイメージを掴んでいきます。

統計学・機械学習の基本的な内容を学び各手法の詳細についてもなるべく概念的に分かりやすく理解できるように学んでいきます。

そしてデータ分析の流れについては実務に即した[CRISP-DM](/crisp-dm)というフレームワークに沿って体系的に学んでいきます！

データ分析というと機械学習でモデル構築する部分にスポットがあたりがちですが、それ以外の工程についてもしっかりおさえておきましょう！

続いて実践編ではデータコンペの中古マンションのデータを題材にして、実際に手を動かしながら機械学習手法を実装していきます。

ここでは、探索的にデータを見ていきながらデータを加工し、その上で[Light gbm](/light-gbm) という機械学習手法を使ってモデル構築までおこなっていきます。

是非興味のある方は受講してみてください！

Twitterアカウント([@statistics1012](https://twitter.com/statistics1012?lang=ja))にメンションいただければ2000円以下になる講師クーポンを発行いたします！

::button[このコースを見てみる]{href="https://www.udemy.com/course/python-data/?referralCode=06466D9A805A034B1A97" note="＼30日以内なら返金無料／"}

またデータサイエンスを全般的にまとめて学びたい！という方には当メディアが運営するスクールであるスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」がオススメです！

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【Pythonの学習範囲】</th>
<td>データサイエンスを網羅的に学ぶ<br>
実践的なビジネスフレームワークを学ぶ<br>
実際に実データを使った様々なワークを行う</td>
</tr>
</tbody>
</table>

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解などもあわせて学べるボリューム満点のコース</mark>になっています！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}

機械学習、データサイエンス、統計学、Pythonの勉強に関しては以下の記事を参考にしてみてください！

<https://toukei-lab.com/machine-learning-study>

<https://toukei-lab.com/data-scientist>

<https://toukei-lab.com/statistics-freshman>

<https://toukei-lab.com/python-learn>