CatBoostとは?LightGBMやXGBoostとの違いをわかりやすく解説
ビジネスの現場で扱うデータの多くは、きれいに数値だけで構成されているわけではありません。
例えば、顧客データであれば「顧客セグメント」「地域」「業種」「契約プラン」、マーケティングデータであれば「キャンペーン」「広告チャネル」「流入元」、アンケートデータであれば「回答カテゴリ」や「属性情報」など、いわゆるカテゴリ型の変数が多く含まれています。
こうした表形式のビジネスデータに対して精度の高い予測モデルを作る手法として、近年はLightGBMやCatBoostといったブースティング系の機械学習アルゴリズムがよく使われるようになっています。
Exploratoryでも、ユーザーの皆さまからの要望を受け、LightGBMをv14.5以降で、CatBoostをv15.5以降でサポートしました。
そこで今回は、特にカテゴリ変数を多く含むデータに強いと言われるCatBoostについて、できるだけわかりやすく解説します。
CatBoostは、以下のような変数を含むデータで力を発揮しやすい機械学習アルゴリズムです。
- 顧客セグメント
- 地域
- 商品カテゴリ
- 業種
- プラン種別
- キャンペーン
- 広告チャネル
- アンケート回答
この記事では、以下の点について解説します。
- CatBoostが生まれた背景
- XGBoostやLightGBMとの違い
- CatBoostがカテゴリ変数に強い理由
- CatBoostが得意なデータ
- CatBoostをいつ使うべきか
なお、LightGBMについて詳しく知りたい方は、以前書いたこちらの記事もあわせてご覧ください。
CatBoostが解決しようとする問題
例えば、以下のようなデータをもとに、顧客の解約(Churn)を予測したいとしましょう。
| 顧客区分 | 地域 | プラン | 業種 | 月額売上 | 解約 |
|---|---|---|---|---|---|
| SMB | 西日本 | Starter | 小売 | 120 | TRUE |
| Enterprise | 東日本 | Business | 金融 | 2500 | FALSE |
| Mid-Market | 関西 | Pro | SaaS | 850 | FALSE |
このようなデータでは、
- 月額売上 → 数値
- 顧客区分 → カテゴリ
- 地域 → カテゴリ
- 業種 → カテゴリ
となります。
実際の業務データでは、数値変数よりもカテゴリ変数のほうが多いことも珍しくありません。
しかし機械学習モデルは、
Starter
Business
Pro
のような文字列をそのまま扱うことはできないため、何らかの手段でカテゴリ変数を数値に変換します。
ここがCatBoostの出発点です。
ランダムフォレスト:多数の独立した木
ランダムフォレストは、多数の決定木を独立に作成し、その結果を平均化するモデルです。
それぞれの木は以下のステップを踏みます。
- データセットをランダムにサンプリングする
- 分割時に変数(特徴量)をランダムに選択する
- それぞれの木は独自の予測を出力する
最終的な予測は、単にそれらの平均(回帰の場合)または多数決(分類の場合)によって決まります。
重要な考え方は、多数の独立した木を用いることで、単一の木(決定木)と比較して分散を抑え、安定性を向上させるという点にあります。
ただし、それぞれの木が互いに学習し合うことはありません。
そのため、最新のブースティング系モデルに比べて精度がでにくいことが多いです。
XGBoost:間違いを修正する木
XGBoostは 勾配ブースティング(Gradient Boosting) いう手法を使用します。独立した木を構築する代わりに、前の木が犯した間違い(エラー)を修正するように、逐次的(シークエンス) に木を構築していきます。
まず最初の木を構築して予測を行い、誤差(または損失)を計算します。もしそれが回帰問題であれば、誤差は実測値と予測値の差である「残差」となります。これが「勾配(Gradient)」と呼ばれるものます。
| 行 | 実測値 | 予測値 | 勾配(残差) |
|---|---|---|---|
| 1 | 10 | 7 | 3 |
| 2 | 15 | 14 | 1 |
| 3 | 8 | 9 | -1 |
次の木は、実測値そのものではなく、この勾配の値を予測するために構築されます。なぜなら、勾配は損失を減らすために予測をどのように動かすべきかをモデルに教えるからです。
そして、最初の木の予測値と2番目の木の予測値を組み合わせることで、モデルとしての新しい予測値とします。
新しい予測値 = 1つ目の木の予測結果 + 学習率 × 2つ目の木の予測結果
概念的には、モデルは以下のように進化します。
1本目の木 → 最初の予測
2本目の木 → 最初の木の予測の間違いを修正
3本目の木 → これまでの木による予測の間違いを修正
4本目の木 → 継続して修正
このプロセスにより、ランダムフォレストよりも一般的には精度の高いモデルが得られることが多いです。
しかし、データセットが大きくなるにつれ、このようなブースティング型の学習方法、つまりたくさんの木を一本一本順次作っていくやり方は、非常に高い計算コストがかかります。
LightGBM:高速化を追求したモデル
そこで出てきたのがLightGBMです。このモデルも、XGBoostと同じブースティング系のモデルなのですが、「より速く、より大規模なデータでも使えるようにする」ために開発されました。
そのため、木を作るさいに
- ヒストグラム分割
- Leaf-wise成長
- GOSS
- EFB
などといった様々な工夫がされています。
特に、
- データ件数が多い
- 説明変数が多い
- 学習速度が重要
というケースではパフォーマンスという点で非常に大きな成果を発揮するため、現在、実務で最もよく使われている機械学習のモデルの一つです。
詳細はこちらの記事をご参照ください。
CatBoostは何が違うのか?
さて、そんなときに出てきたのがCatBoostです。このモデルもXGBoostやLightGBMと同じブースティング系のモデルです。そのため、基本的な学習の流れはXGBoostやLightGBMと同じです。
しかし最大の特徴は、「カテゴリ変数をうまく扱うために設計されている」ということです。
特に、
- 商品カテゴリ
- キャンペーン
- 地域
- 店舗
- ユーザーが使用している機能
といった、カテゴリの数が非常に多い変数(高カーディナリティ変数)で威力を発揮します。
One-Hot Encodingの問題
カテゴリ変数を扱う最も一般的な方法はOne-Hot Encodingと呼ばれる手法です。
例えば、サブスクリプションのプランであれば、もともと以下のようになっているデータを、
| Plan |
|---|
| Starter |
| Pro |
| Business |
各値を列として展開することで、以下のようなデータに変換します。
| Starter | Pro | Business |
|---|---|---|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |
これはカテゴリの数が少ない場合は特に問題ないのですが、
しかし、
- 商品カテゴリが500
- 地域の数がが1000
だったりすると膨大な数の列を作る必要があります。
すると、
- メモリ消費が増える
- 学習が遅くなる
- 過学習しやすくなる
といった問題が発生してしまいます。
Target Encodingという考え方
CatBoostが出てくる前は、こうした問題に対処するさいに使われたのがターゲット・エンコーディングという手法です。
例えば、
| プラン | 解約率 |
|---|---|
| Starter | 67% |
| Business | 0% |
のように、
各カテゴリごとに目的変数を集計した値(割合や平均値)で置き換えます。
すると、
Starterの顧客は解約しやすい
という情報をモデルに直接与えることができます。
しかしこのやり方には大きな落とし穴があります。
情報漏洩(リーケージ)の問題
例えば、以下のようなデータがあったとしましょう。
| 顧客 | プラン | 解約 |
|---|---|---|
| A | Starter | 1 |
| B | Starter | 0 |
| C | Starter | 1 |
上記で見たように各プランごとの解約率を集計すると、Starterの解約率は67% (2 / 3 = 66.66...) です。
そこで顧客Aに、
Starter → 0.67
を割り当てます。
しかし、ここに問題があります。
というのも、割り当てた67%という値を計算するさいに、解約という変数の値を使っています。これは、この数値にモデルを作る際の答えである解約情報も含まれてしまっていることを意味します。
つまり、正解を使って説明変数を作っている状態になっているということです。
これが情報漏洩(リーケージ)という問題で、この問題があると、学習データでは精度が高く見える予測モデルも、本番データではうまく予測できないということがおきます。
Ordered Target Statistics(順序付きターゲット統計量)
CatBoostは情報漏洩(リーケージ)の問題を避けるため、「Ordered Target Statistics(順序付きターゲット統計量)」という方法を使います。
簡単に言うと、「自分より前の行だけを使ってカテゴリの統計量を計算する」という方法です。
先ほどと同じ例を使って見てみましょう。
データがランダムに次の順番に並んでいるとします。
| 順番 | 顧客 | プラン | 解約 |
|---|---|---|---|
| 1 | A | Starter | 1 |
| 2 | B | Starter | 0 |
| 3 | C | Starter | 1 |
| 4 | D | Starter | 1 |
また、事前情報(Prior)として全体の平均解約率が50%だったと仮定します。
CatBoostでは、この「プラン」というカテゴリ変数を次のように変換します。
| 順番 | 顧客 | プラン | 解約 | 変換後の値 |
|---|---|---|---|---|
| 1 | A | Starter | 1 | 0.50 |
| 2 | B | Starter | 0 | 1.00 |
| 3 | C | Starter | 1 | 0.50 |
| 4 | D | Starter | 1 | 0.67 |
何が起きているのでしょうか?
顧客Aの場合
Aより前にStarterの顧客はいません。
そのため、事前情報として設定した50%を使います。
A → Starterの過去データなし→ 0.50を使用
顧客Bの場合
Bより前にいるStarterの顧客はAだけです。
B → 過去のStarter顧客はAのみ→ 解約率 = 1 / 1 = 1.00
顧客Cの場合
Cより前にはAとBがいます。
C → 過去のStarter顧客はAとB→ 解約率 = (1 + 0) / 2 = 0.50
顧客Dの場合
Dより前にはA、B、Cがいます。
D → 過去のStarter顧客はA、B、C→ 解約率 = (1 + 0 + 1) / 3 = 0.67
ここで重要なのは、「各行の変換値を計算する際に、その行自身の目的変数を使っていない」という点です。
例えば、
- 顧客Cの変換値はAとBだけを使う
- 顧客Dの変換値はA・B・Cだけを使う
という仕組みになっています。
そのため、
「Starterプランは解約しやすい」
という有益な情報を活用しながら、
「自分自身の答えを説明変数に混ぜてしまう」
というリーケージを防ぐことができます。
これがCatBoostの「Ordered Target Statistics(順序付きターゲット統計量)」の考え方です。
Ordered Boosting(順序付きブースティング)
CatBoostには、Ordered Boosting(順序付きブースティング)という仕組みもあります。
通常のGradient Boostingでは、学習データ全体を使ってモデルを作り、その同じ学習データに対して予測を行い、誤差を計算します。そして、その誤差を修正するように次の木を作ります。
一見すると自然ですが、ここには微妙な問題があります。
学習データ上のある行を予測するとき、その行自身もモデルの学習に使われています。つまり、学習時には「その行をすでに見たことがあるモデル」でその行を予測していることになります。
一方、本番では、まだ正解が分からない未知のデータを予測します。このときモデルは、その行を使って学習しているわけではありません。
このように、学習時の予測と本番時の予測の条件が少しズレることを Prediction Shift(予測シフト)と呼びます。
CatBoostはこのズレを小さくするために、データをランダムな順番に並べ、各行を予測するときには、その行より前にあるデータだけを使って作られたモデルで予測する、という手法を使います。
例えば、データが A、B、C、D の順に並んでいる場合、Cの誤差を計算するときにはAとBだけから作られたモデルでCを予測します。C自身の正解は、その予測には使われません。
これにより、学習時の予測が本番で未知データを予測する状況に近くなります。
Ordered Boostingのメリットは、学習データに過度に合わせすぎることを抑え、テストデータや本番データに対してより安定した予測をしやすくすることです。
Ordered Target Statistics(順序付きターゲット統計量) が「カテゴリ変数を変換するときのリーケージ」を防ぐ仕組みだとすると、Ordered Boosting(順序付きブースティング) は「ブースティングで誤差を学習するときの予測シフト」を抑える仕組みだと言えます。
そしてこれら2つの手法が、CatBoostがカテゴリ変数の多いデータで高い性能を発揮する大きな理由なのです。
Symmetric Trees(対称木)
CatBoostのもう一つの特徴は、Symmetric Trees(対称木) を使うことです。
通常の決定木では、枝ごとに異なる分岐条件を選ぶことができます。
Root
/ \
条件A 条件B
/ \ / \
条件C 条件D 条件E 条件F
一方、CatBoostの対称木では、同じ深さにあるノードでは同じ分岐条件を使います。
Root
/ \
条件A 条件A
/ \ / \
条件B 条件B 条件B 条件B
この仕組みは、一見すると非効率に見えるかもしれません。実際、一本の木だけを見ると、枝ごとに別々の条件を選べる通常の決定木のほうが柔軟です。
しかし、CatBoostが「一本の完璧な木」を作るモデルではなく、小さめの木をたくさん足し合わせていくブースティングモデルです。
つまり、一本の木にすべてを表現させる必要はありません。
1本目の木で大まかなパターンを捉え、2本目の木で残った誤差を修正し、3本目以降でさらに細かいパターンを補っていくのがブースティングモデルです。
つまり、対称木の弱点である「一本あたりの柔軟性の低さ」は、多数の木を組み合わせることで補うというのがCatBoostの考え方です。
そして、このような対称木にすることで、木の構造がシンプルになり、予測が高速になり、メモリ効率も良くなります。また、木の自由度を制限することで、学習データに過度に合わせすぎることを抑える効果も期待できます。
つまり、CatBoostは、対称木という制約を受け入れる代わりに、
- 予測が速い
- メモリ効率が良い
- 木の構造が単純で安定しやすい
- 過学習を抑えやすい
- 多数の木を足し合わせることで表現力を補える
というメリットを得ることができるようになっているということです。
CatBoostでも防げないリーケージ
ここまで読むと、
「CatBoostならリーケージを完全に防げるのでは?」
と思いがちですが、残念ながらそうとは言い切れません。
というのも、CatBoostが防げるのは、Target Encodingに起因するリーケージだからです。
データそのものに、将来にしかわからないはずの情報が含まれている場合は、CatBoostでも防ぐことはできません。
例えば顧客解約予測で、
- 解約日
- 解約後の返金額
- 解約後のサポート問い合わせ回数
- 最終請求ステータス
- 解約理由
などを説明変数として使ってしまった場合です。
これらは解約した後でなければ分からない情報ですので、このような変数を使えば、どんなモデルでも不自然に高い予測精度が出すことができてしまいます。
そのため、「予測時点で利用できる情報だけを説明変数として使う」という基本原則は、CatBoostでも変わりません。
XGBoostとLightGBMのカテゴリ変数処理の違い
ところで、XGBoostやLightGBMでカテゴリ変数を使うと必ずしもリーケージが起きるというわけではありません。実は、XGBoostやLightGBMにもこうした問題を防ぎつつカテゴリ変数を説明変数として使うための仕組みがあります。
以下はRでの実装です。Exploratoryで使う場合も同じです。
| モデル | カテゴリ変数の変換 |
|---|---|
| XGBoost | カテゴリをグループ化して分割(One-Hotも使える) |
| LightGBM | カテゴリをグループ化して分割 |
| CatBoost | Uses ordered target statistics and ordered boosting |
例えば、LightGBMの場合、カテゴリをグループ化して分割を学習します。
Plan in {Starter, Pro}
vs
Plan in {Business, Enterprise}
そして、以下のような分岐を作ります。
if Plan is Starter or Pro:
go left
else if Plan is Business or Enterprise:
go right
一方、CatBoostでは、
Starter
↓
過去のStarterユーザーの平均解約率
のような統計量を利用します。
重要なのは、XGBoost、LightGBM、そしてCatBoostはカテゴリ変数の扱いに対して異なるアプローチを採用しているということです。
LightGBMは学習速度とスケーラビリティを重視し、CatBoostはカテゴリ変数の活用とリーケージ対策を重視しています。
CatBoostが得意とするデータ
CatBoostは、例として以下のようなデータで特に有効です。
顧客データ
- 顧客セグメント
- 地域
- 業種
- プラン
マーケティングデータ
- 広告チャネル
- キャンペーンID
- 流入元
商品データ
- 商品カテゴリ
- ブランド
- SKU
アンケートデータ
- 属性情報
- 回答カテゴリ
- セグメント情報
どのモデルを選べば良いのか?
さて最後に、ランダムフォレスト、XGBoost、LightGBM、CatBoost、いったどのモデルを選べば良いのでしょうか。
基本的には、まずは作ってみて予測精度を見ながらパラメーターをチューニングし、良いものを使うということになりますが、それでも最初に使うモデルはどれにしようかと迷うこともあるかもしれません。
そんなときは、次のように考えるとわかりやすいかと思います。
| 状況 | おすすめ |
|---|---|
| まず簡単に試したい | ランダムフォレスト |
| 高精度を狙いたい | XGBoost |
| 大規模データ | LightGBM |
| カテゴリ変数が多い | CatBoost |
このリストからは統計学習モデル(線形回帰、ロジスティック回帰、GLMなど)や決定木は外してあります。
そして繰り返しになりますが、以下のようなデータはカテゴリ変数が含まれていることが多いので、こうしたデータを扱ってる方はCatBoostは試す価値があると思います。
- 顧客データ
- マーケティングデータ
- アンケートデータ
- SaaSデータ
まとめ
以下の4つのモデルはすべて決定木をベースにしたアンサンブル学習ですが、それぞれ思想が異なります。
- ランダムフォレスト → 安定性重視
- XGBoost → 予測精度重視
- LightGBM → 速度とスケール重視
- CatBoost → カテゴリ変数重視
CatBoostの最大の特徴は、
カテゴリ変数の情報を活用しながら、Target Encodingで起こりがちなリーケージを抑える仕組みを持っている
ことです。
そのため、顧客分析、マーケティング分析、アンケート分析など、カテゴリ変数が多い業務データでは非常に有力な選択肢になります。
もしLightGBMやXGBoostしか使ったことがないなら、ぜひ一度CatBoostも試してみてください。
思った以上に高い予測性能が得られるかもしれません。
ExploratoryでCatBoostを試す
Exploratoryでは、v15.5よりCatBoostのサポートが追加されています。
アナリティクス・ビューの下で、UIを使って簡単にCatBoostのモデルを作ることができます。
- アナリティクス・ビューを開く
- CatBoostを選択
- 目的変数を指定
- 説明変数を指定
- 「実行」ボタンをクリック
さらに、「設定」のダイアログより、過学習を防ぎながら予測精度を上げるためのパラメーター・チューニングができるようになっています。
カテゴリ変数が多いデータを扱っている方は、ぜひ一度試してみてください。
以下のリンクよりExploratoryの最新版、v15.5をダウンロードし、今すぐCatBoostを使い始めることができます。
👉 Exploratory 最新版をダウンロード
https://exploratory.io/download
まだアカウントをお持ちでない場合は、こちらからサインアップして30日間の無料トライアルを開始できます。
トライアル期間が終了している場合でも、最新バージョンを起動して「トライアルを延長」をクリックすることで、お試しいただくことができます。
データサイエンス・ブートキャンプで機械学習をもっと実践的に学ぶ
CatBoostのような機械学習モデルは、使い方を知っているだけでは十分ではありません。
大切なのは、データの特徴に応じて適切なモデルを選び、結果を正しく解釈し、必要に応じてパラメーターを調整しながら、実際の意思決定につなげていくことです。
Exploratoryの「データサイエンス・ブートキャンプ」では、CatBoostを含む機械学習モデルを使った分析はもちろん、統計学、データ加工、可視化、分析結果の解釈まで、データサイエンスに必要な実践的なスキルを3日間で集中的に学ぶことができます。
このブートキャンプでは、以下のようなAI時代に必要なデータサイエンスの力を、実際に手を動かしながら身につけていきます。
- 統計学リテラシー
- 科学的思考
- データを加工・整理する力
- データを可視化して特徴を捉える力
- 統計モデル・機械学習モデルを使った分析
- 分析結果を解釈し、意思決定につなげる力
単にツールの使い方を学ぶだけでなく、問いを立て、データを準備し、可視化し、分析し、その結果をどう解釈するかまでを一通り体験していただきます。
CatBoostやLightGBMなどの機械学習モデルを、実務のデータ分析でより自信を持って使えるようになりたい方は、ぜひ以下のページをご覧ください。




