はじめに
テーブルデータの予測では、XGBoost・LightGBM・CatBoost の3つが定番です。それぞれ「LightGBM は速い」「CatBoost はカテゴリ変数に強い」といった特徴がよく語られますが、実務でどれを選ぶかとなると判断に迷うことも多いと思います。
この記事では、規模の異なる3つのオープンデータで3つを同じ条件で動かし、よく言われる特徴が実際に当てはまるかを確かめます。そのうえで、実務での使い分けをまとめます。
3つのライブラリの概要
3つとも勾配ブースティング決定木(GBDT)の実装で、主な違いは木の作り方とカテゴリ変数の扱いです。
| ライブラリ | 開発元 | 木の成長方式 | カテゴリ変数 |
|---|---|---|---|
| XGBoost | DMLC(Tianqi Chen ほか) | level-wise(深さごとに均等に成長) | category 型 + enable_categorical=True で対応 |
| LightGBM | Microsoft | leaf-wise(損失を最も減らす葉から成長) | category 型を渡せば対応 |
| CatBoost | Yandex | 対称木(同じ深さでは同じ分割条件) | 文字列のまま渡して対応 |
一般的には、次のような特徴がよく挙げられます。この記事では、これらが実際に当てはまるかを確かめます。
- XGBoost:実績と情報量が多いが、大きなデータでは LightGBM より学習が遅い
- LightGBM:学習が速い
- CatBoost:デフォルト設定でも精度が出やすく、カテゴリ変数に強いが、学習が遅い
検証条件
実務で最初に試すときと同じく、各ライブラリをデフォルト設定のまま使いました。
| データ | 内容 | 行数 | カテゴリ変数 |
|---|---|---|---|
| Adult(OpenML) | 年収が5万ドルを超えるかの2値分類 | 約4.9万行 | あり |
| California Housing(scikit-learn 同梱) | 住宅価格の回帰 | 約2.1万行 | なし |
| Airlines(OpenML、ID 1169) | フライトが遅延するかの2値分類 | 約54万行 | あり(空港は293種類) |
- 評価方法:train : test = 8 : 2 に分割して評価
- パラメータ:各ライブラリのデフォルト設定(チューニングなし)
- 評価指標:分類は AUC、回帰は RMSE、あわせて学習時間・推論時間
- カテゴリ変数:Adult と Airlines は、カテゴリ変数をそのまま渡す(ライブラリ側で処理させる)方法と、One-hot エンコーディングの2通りで比較
- バージョン:XGBoost 3.4.1、LightGBM 4.7.0、CatBoost 1.2.10、Python 3.13
- 実行環境:MacBook Air 2022 (M2) メモリ 16GB
なお、デフォルトの木の本数は XGBoost・LightGBM が100本、CatBoost が1000本と異なります。今回の比較は「何も設定せずに使った場合」の比較です。
結果
デフォルト設定での精度は3つのデータすべてで CatBoost が最も高く、学習の速さはデータの規模によって XGBoost と LightGBM が入れ替わりました。以下の数値は、特に記載がない限りカテゴリ変数をそのまま渡した場合のものです。
1. 精度:CatBoost が最も高い
| ライブラリ | Adult AUC(高いほど良い) | California RMSE(低いほど良い) | Airlines AUC(高いほど良い) |
|---|---|---|---|
| XGBoost | 0.9275 | 0.4657 | 0.7226 |
| LightGBM | 0.9304 | 0.4668 | 0.7203 |
| CatBoost | 0.9311 | 0.4436 | 0.7246 |
CatBoost は3つのデータすべてで最も高い精度でした。特に California では、誤差が他の2つより約5%小さく、差がはっきり出ました。
XGBoost と LightGBM は、Adult では LightGBM、California と Airlines では XGBoost が上回り、勝ち負けが一定しませんでした。差はいずれも0.003以下と小さく、ほぼ同等と言えます。
2. 学習時間:データが大きくなると LightGBM が速くなる
| ライブラリ | Adult(約4.9万行) | California(約2.1万行) | Airlines(約54万行) |
|---|---|---|---|
| XGBoost | 0.19秒 | 0.15秒 | 0.98秒 |
| LightGBM | 0.48秒 | 0.36秒 | 0.92秒 |
| CatBoost | 15.07秒 | 1.13秒 | 78.19秒 |
小さめのデータでは XGBoost が最も速く、LightGBM はその約2.5倍の時間がかかりました。一方、Airlines ではわずかに LightGBM が速くなりました。Adult から Airlines へ行数が約11倍になったとき、XGBoost の学習時間は約5倍に増えましたが、LightGBM は約2倍の増加にとどまっています。
CatBoost は、Adult と Airlines で XGBoost の約80倍の時間がかかりました。1回の学習なら問題になりにくいですが、日次で再学習する、試行錯誤を何十回も繰り返すといった運用では差が積み上がります。
3. カテゴリ変数:種類が多いならそのまま渡す方が有利
| データ | ライブラリ | AUC(そのまま → One-hot) | 学習時間(そのまま → One-hot) |
|---|---|---|---|
| Adult | XGBoost | 0.9275 → 0.9298 | 0.19秒 → 0.27秒 |
| Adult | LightGBM | 0.9304 → 0.9296 | 0.48秒 → 0.49秒 |
| Adult | CatBoost | 0.9311 → 0.9309 | 15.07秒 → 3.79秒 |
| Airlines | XGBoost | 0.7226 → 0.7172 | 0.98秒 → 8.09秒 |
| Airlines | LightGBM | 0.7203 → 0.7114 | 0.92秒 → 2.77秒 |
| Airlines | CatBoost | 0.7246 → 0.7225 | 78.19秒 → 21.26秒 |
Airlines には空港(293種類)のように種類の多いカテゴリ変数があり、One-hot にすると列数が約600列に増えます。このデータでは、One-hot にすると3つとも精度が下がり、XGBoost と LightGBM は学習時間も大きく延びました。種類の多いカテゴリ変数は、One-hot にせずそのまま渡す方が、精度・速度の両面で有利です。
なお、One-hot にしたときの学習時間は LightGBM が XGBoost の約3分の1で、列数が多いほど LightGBM の速さが活きる結果でした。
CatBoost だけは One-hot にすると学習時間が約4分の1になり、精度の低下も小さく抑えられました。CatBoost の学習時間が気になる場合の対策になります。
4. 推論時間:実務上の差はほぼない
最も行数の多い Airlines(テストデータ約10.8万行)でも、予測にかかった時間は 0.04〜0.12秒でした。バッチ処理で予測する用途では、どれを選んでも推論時間が問題になることはまずありません。
一般的な特徴との照らし合わせ
よく言われる特徴は概ね当てはまりましたが、LightGBM の速さはデータの規模が大きくなって初めて現れました。
| 一般的に言われる特徴 | 結果 | 根拠 |
|---|---|---|
| CatBoost はデフォルト設定でも精度が出やすい | 当てはまる | 3つのデータすべてで精度が最も高い |
| CatBoost はカテゴリ変数に強い | 当てはまる | そのまま渡した場合に最も高い精度。種類の多いカテゴリでも精度の低下が小さい |
| CatBoost は学習が遅い | 当てはまる | XGBoost の約80倍 |
| LightGBM は学習が速い | 条件付きで当てはまる | 約5万行以下では XGBoost より遅い。約54万行や列数が多い場合は XGBoost 以上に速い |
| XGBoost は大きなデータでは LightGBM より遅い | 当てはまる | 約54万行では LightGBM よりわずかに遅く、One-hot(約600列)では約3倍の時間 |
なお、LightGBM の開発元の論文では、1,000万行規模のデータで速度を評価しています。今回の Airlines(約54万行)でも傾向は見えましたが、さらに大きなデータでは差が広がる可能性があります。
実務での使い分け
今回の結果を踏まえると、場面ごとに次のように選ぶのがおすすめです。
| 場面 | おすすめ | 理由 |
|---|---|---|
| 店舗・商品・地域など、種類の多いカテゴリ変数がある | CatBoost | 前処理なしで扱え、精度も最も高かった。One-hot にしても精度の低下が小さい |
| データが数十万行以上ある、または列数が多い | LightGBM | 行数や列数が増えても学習時間の増加が小さかった |
| データが数万行程度で、学習を高速に回したい | XGBoost | 小さめのデータでは学習が最も速かった |
普段 LightGBM や XGBoost を使っている場合でも、精度を確認する候補として CatBoost を一度試してみる価値があります。今回はデフォルト設定のまま、3つのデータすべてで最も高い精度が出ました。また、店舗や商品のように種類の多いカテゴリ変数は、One-hot にせずそのまま渡す方が有利でした。
なお、今回はデフォルト設定での比較です。チューニングを行うと精度の差が変わる可能性があるため、本番で使うモデルは適宜比較して決めてください。

