1 導入と背景
1.1 勾配ブースティングの概要
勾配ブースティング(Gradient Boosting)は、アンサンブル学習の一種で、弱学習器(通常は決定木)を逐次的に追加し、前のモデルの残差を次のモデルが学習することで予測精度を向上させる手法である。損失関数の勾配方向に学習を進めることで、回帰、分類、ランキングなどの多様なタスクに適用できる。各ステップで新しい木が前の木の誤差を補正するため、過学習を防ぐための正則化と学習率の調整が重要となる。
1.2 CatBoostの開発経緯
CatBoostは、ロシアの検索エンジン大手Yandex社が2017年に公開したオープンソースの機械学習ライブラリである。名称は「Category Boosting」に由来し、カテゴリ特徴量の処理に特化している。従来の勾配ブースティング実装ではカテゴリ変数を事前に数値変換する必要があったが、CatBoostはそれを自動化し、かつ「順序付けされたブースティング」(Ordered Boosting)という独自アルゴリズムで過学習を抑制する。Yandex社内部のクリック予測や検索ランキングなどの実務課題を解決するために開発され、その後一般公開された。
1.3 競合ライブラリ(XGBoost、LightGBM)との比較
CatBoostは、同じ勾配ブースティングを実装するXGBoost(2014年公開)やLightGBM(2016年公開)と比較されることが多い。XGBoostはレベルワイズ木成長、LightGBMはリーフワイズ木成長を採用するのに対し、CatBoostは対称木(Oblivious Tree)を用いる。カテゴリ特徴量の自動処理と欠損値への頑健性がCatBoostの最大の差別化要因であり、特にカテゴリ変数が多いデータセットで優れた性能を発揮する。一方、数値特徴量のみのデータではLightGBMやXGBoostと同等ないし若干劣る場合もある。また、CatBoostはデフォルトパラメータでの性能が良好であり、初心者にも扱いやすいという利点がある。
2 コア技術
2.1 カテゴリ特徴量の処理
CatBoostは、カテゴリ変数(質的変数)をそのまま入力として受け付け、内部で自動的に数値変換を行う。一般的なターゲットエンコーディングとは異なり、データリークを防ぐ独自のオンライン方式を採用している。
2.1.1 ターゲットエンコーディングとオンライン方式
通常のターゲットエンコーディングでは、訓練データ全体の目的変数の平均値を用いてカテゴリ値を置き換えるが、これは過学習を引き起こす。CatBoostでは、各データ点に対して、その点より前の訓練データ(またはランダムな順序)のみを用いて平均値を計算するオンライン方式を採用する。この手法により、ターゲットリークを回避しつつ、カテゴリ情報を有効に抽出できる。
2.1.2 組み合わせ特徴量の自動生成
CatBoostは、複数のカテゴリ変数の組み合わせを自動的に生成し、それらを新たな特徴量として学習に利用する。例えば、「国」と「都市」の組み合わせなどが該当する。組み合わせは木の分割点として計算される際に動的に生成され、すべての可能な組み合わせを試すわけではないため、計算量の爆発を抑えている。
2.2 順序付けされたブースティング
2.2.1 従来の手法との差異
従来の勾配ブースティングでは、同じデータセットを用いて各反復の勾配を計算するため、外れ値やノイズに対して過学習しやすい。CatBoostの順序付けされたブースティング(Ordered Boosting)は、時系列的な順序付けの概念を導入し、各データ点に対する勾配をその点以前のデータのみを使って計算することで、この問題に対処する。
2.2.2 バイアス軽減のメカニズム
具体的には、訓練データをランダムに並べ替え、各データ点に対して、それより前のデータで学習したモデルを用いて勾配を計算する。これにより、各データ点が自身の影響を受けずに残差が計算されるため、目標リークが防止され、テストデータに対する汎化性能が向上する。ただし、計算コストはやや高くなる。
2.3 欠損値の処理
CatBoostは欠損値を自動的に扱う機能を内蔵している。数値特徴量の場合、欠損値は決定木の分割時に別の方向として扱われ、学習中に最適な分割基準を自動学習する。カテゴリ特徴量の欠損値は、特別なカテゴリとして扱われる。ユーザーは事前に欠損値補完を行う必要がなく、実務的な利便性が高い。
2.4 対称木構造と予測時間の最適化
CatBoostは対称木(Oblivious Decision Tree)を構築する。対称木は、同じ深さのすべての葉ノードで同一の分割条件を使用するため、木構造が単純化される。これにより、予測時の計算が高速化され(各木の評価を効率的に実行できる)、モデルの解釈性も向上する。ただし、表現力の面では非対称木に劣る可能性があるが、ブースティングの多数の木を組み合わせることで十分な性能を発揮する。
3 実践的な利用
3.1 インストールと基本設定
CatBoostはpipやcondaから簡単にインストールできる。Pythonで使用する場合の基本設定は以下の通りである。
pip install catboost
インストール後、CatBoostClassifier、CatBoostRegressor、CatBoostRankerというクラスでそれぞれ分類、回帰、ランキングタスクを実行する。デフォルトパラメータでも高い性能を発揮するため、初心者でもすぐに使い始めることができる。
3.2 主要パラメータ
3.2.1 学習反復回数と学習率
iterations(デフォルト1000):ブースティングの反復回数。多いほど精度向上が期待できるが、過学習のリスクも高まる。learning_rate(デフォルト0.03):各決定木の寄与を縮小する係数。学習率を下げると反復回数を増やす必要があるが、汎化性能が向上しやすい。
3.2.2 ツリーの深さと正則化
depth(デフォルト6):各木の深さ。深すぎると過学習、浅すぎると未学習になる。l2_leaf_reg(デフォルト3.0):葉ノードの値に対するL2正則化係数。大きいほど過学習を抑制。random_strength(デフォルト1.0):分割点にランダム性を加える強度。過学習防止に寄与する。
3.2.3 カテゴリ特徴量の指定方法
カテゴリ特徴量は、cat_featuresパラメータにカラム名またはインデックスのリストとして指定する。指定しない場合、CatBoostは自動的に数値でないデータ型をカテゴリと認識するが、明示的に指定することで処理の安定性が向上する。
model = CatBoostClassifier(cat_features=['gender', 'color'])
3.3 クロスバリデーションとハイパーパラメータチューニング
3.3.1 グリッドサーチとベイズ最適化
CatBoostでは、cvモジュールを用いたクロスバリデーションを実行できる。ハイパーパラメータのチューニングには、sklearnのGridSearchCVやRandomizedSearchCVの他、OptunaやHyperoptなどのベイズ最適化フレームワークを利用するのが一般的である。CatBoost独自のcatboost.utils.select_threshold関数なども提供されている。
3.3.2 早期停止(Early Stopping)
early_stopping_roundsパラメータを設定すると、検証セットの損失が一定回数改善しない場合に学習を自動的に停止する。これにより、過学習を防ぎつつ最適な反復回数を決定できる。
model = CatBoostClassifier(iterations=10000, early_stopping_rounds=50)
model.fit(X_train, y_train, eval_set=(X_val, y_val))
3.4 モデルの保存と読み込み
CatBoostは、save_modelメソッドでモデルをファイルに保存し、load_modelメソッドで読み込むことができる。cbm形式(CatBoost Model)が標準で、他の形式(ONNX、PMMLなど)へのエクスポートもサポートしている。
model.save_model('model.cbm')
loaded_model = CatBoostClassifier().load_model('model.cbm')
4 応用例と性能評価
4.1 分類タスクでの実装例
銀行の顧客データを用いたデフォルト予測などの二値分類や、アヤメの品種識別のような多値分類が典型的な使用例である。CatBoostはカテゴリ変数が多いデータセット(例:顧客の職業、地域など)で特に効果を発揮する。以下のコード例は、タイタニック号生存者データセットでの利用を示す。
from catboost import CatBoostClassifier
# データ準備 (仮定)
model = CatBoostClassifier(verbose=0)
model.fit(X_train, y_train, cat_features=['Sex', 'Embarked'])
accuracy = model.score(X_test, y_test)
4.2 回帰タスクでの実装例
住宅価格予測や気温予測など、連続値の予測に用いられる。カテゴリ変数として「築年数区分」「地域区分」などを扱う場合、CatBoostの自動処理が強みとなる。以下はボストン住宅価格データセットでの例(ただし、特徴量はほとんど数値のため、実際の効果は限定的)。
from catboost import CatBoostRegressor
model = CatBoostRegressor(depth=6, learning_rate=0.1, verbose=0)
model.fit(X_train, y_train)
4.3 ランキングタスクでの実装例
Yandexの検索エンジンで培われた技術により、ランキング学習(Learning to Rank)にも対応している。CatBoostRankerクラスを使用し、group_idでクエリ単位のグループを指定する。顧客のクリック予測や商品レコメンデーションに応用される。
from catboost import CatBoostRanker
# group_idは各クエリに対応するID
model = CatBoostRanker(loss_function='YetiRank', verbose=0)
model.fit(X_train, y_train, group_id=train_groups)
4.4 大規模データセットでのスケーラビリティ
CatBoostはマルチコアCPUによる並列学習をサポートしており、thread_countパラメータで制御できる。ただし、XGBoostやLightGBMと比較すると、極端に大規模なデータ(数百万行以上)ではメモリ使用量がやや多くなることがある。データを分割してミニバッチ学習する機能はないが、GPUサポートにより高速化が可能である。
4.5 GPUサポートによる高速化
CatBoostは、NVIDIA CUDA対応のGPU上で学習を実行できる(タスクとして分類・回帰がサポート)。GPU学習はCPU比で数倍から十数倍の高速化が期待でき、特にツリー深さやデータサイズが大きい場合に効果的である。有効にするにはtask_type='GPU'を指定する。
model = CatBoostClassifier(task_type='GPU', devices='0:1')
5 コミュニティとエコシステム
5.1 ドキュメントとチュートリアル
CatBoostの公式ドキュメントは<https://catboost.ai/>で公開されており、詳細なAPIリファレンス、チュートリアル、FAQ、ユースケースが提供されている。特に「パラメータチューニングガイド」や「カテゴリ特徴量の処理」に関する説明は、他ライブラリにはない独自情報が含まれる。また、GitHubリポジトリ(<https://github.com/catboost/catboost>)ではIssueやディスカッションが活発に行われている。
5.2 主要なアップデート履歴
CatBoostは定期的にバージョンアップを行っており、主なアップデートとして以下がある。
- v0.10(2017年):初のオープンソースリリース。
- v0.16(2018年):GPUサポートの強化、ランキング損失関数の追加。
- v1.0(2021年):安定版として大規模リリース、APIの統一、ONNXエクスポート機能の追加。
- v1.2(2023年):テキスト特徴量の自動処理、PyTorch統合の改善。
5.3 サポート言語(Python、R、コマンドラインなど)
CatBoostは、Python(主要)、R、コマンドラインインターフェース(CLI)、Julia、C++など多言語のAPIを提供している。これにより、様々な環境やワークフローに組み込むことが可能である。RユーザーはcatboostパッケージをCRANからインストールでき、CLI版はバイナリをダウンロードしてシェルスクリプトから直接利用できる。また、Jupyter Notebook上での可視化ツールも充実している。