【解説】CatBoostとは?〜カテゴリ変数を活かしながらデータリークを防ぐ最先端勾配ブースティング〜

解説

CatBoostは、Yandex社が開発した勾配ブースティングライブラリで、特にカテゴリ変数の取り扱いに優れたアルゴリズムとして注目されています。CatBoostは、他のGBDT系アルゴリズムと同様の枠組みを持ちながら、独自のエンコーディング手法を導入し、ターゲットエンコーディングに伴う「データリーク」(ターゲット情報の不適切な漏洩)を防止する工夫が施されています。本記事では、CatBoostの特徴や技術的背景、特にカテゴリ変数処理の際のデータリーク対策、そして実装例について詳しく解説します。


CatBoostの基本概念

勾配ブースティングの枠組み

CatBoostは、複数の決定木を順次構築することで予測モデルを生成する、従来の勾配ブースティングと同様の基本構造を持ちます。一般的な目的関数は次のように定義されます。$$\mathcal{L} = \sum_{i=1}^{n} l(y_i, \hat{y}_i) + \sum_{t=1}^{T} \Omega(f_t)$$

$l(y_i, \hat{y}_i)$ は各サンプルに対する損失関数、$\Omega(f_t)$ は各決定木の複雑さに対する正則化項です。


CatBoostの独自技術とデータリーク対策

CatBoostは、特に以下の点で他のGBDTライブラリと一線を画しています。

カテゴリ変数の効果的な処理

  • 自動エンコーディング
    CatBoostは、カテゴリ変数をあらかじめワンホットエンコーディングする必要がなく、内部でOrdinal Encodingやターゲット統計量を用いたエンコーディングを自動的に実施します。これにより、カテゴリ変数の持つ情報を最大限に活かすことが可能です。
  • データリークの防止
    カテゴリ変数のエンコーディングにおいて、ターゲットの情報が学習データ内に漏れてしまう「データリーク」のリスクがあります。CatBoostは、Ordered Target Encoding順序依存性の低減の仕組みを採用しており、各サンプルのエンコーディングをそのサンプル自身よりも前のデータのみで計算することで、データリークを防止しています。

バイアス低減のためのオーダリングテクニック

  • 順序統計の計算
    サンプルの順序をランダムにシャッフルし、目的変数の統計量(平均、標準偏差等)を計算することで、カテゴリ変数エンコーディング時に生じがちなバイアスを低減し、データリークを防ぐ設計となっています。

高速な学習と堅牢なデフォルト設定

  • 高速な計算
    CatBoostは、CPUやGPUでの並列計算に対応しており、Kaggleで言えばT4×2環境では自動で2つのGPUを使用してくれます。
    ※他のGBDTモデルに比べて学習に時間がかかりがちなので、恩恵はそれなりにありそうです。
  • チューニングなしで高精度
    XGBoostやLightGBMと比べて初期設定でも高い予測精度を発揮しやすい印象です。

3. CatBoostの実装例

CatBoostは、専用APIとscikit-learn互換のAPIが提供されています。以下に、両方の実装例を示します。

3.1 専用API(CatBoost API)を用いた実装例

from catboost import CatBoostRegressor, Pool
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston

# Bostonデータセットを例にデータ準備
boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2, random_state=42)

# 例としてカテゴリ変数のカラムを指定(実際には適宜選択)
# ※Bostonデータセットは連続値のみですが、カテゴリ変数がある場合はリストでカラム名を指定
cat_features = []

# Pool形式に変換(カテゴリ変数があればcat_featuresで指定)
train_pool = Pool(X_train, y_train, cat_features=cat_features)
test_pool = Pool(X_test, y_test, cat_features=cat_features)

# CatBoostRegressorの作成
model = CatBoostRegressor(
iterations=100,
learning_rate=0.1,
depth=6,
loss_function='RMSE',
verbose=10 # 学習ログを出力
)

# モデルの学習(内部でOrdered Target Encodingを用いてデータリーク防止)
model.fit(train_pool, eval_set=test_pool)

# 予測
y_pred = model.predict(X_test)

3.2 scikit-learn風APIを用いた実装例

pythonCopyfrom catboost import CatBoostRegressor
from sklearn.metrics import mean_squared_error

# scikit-learn風APIを用いたモデル作成(cat_featuresの指定はfit時に行う)
cat_model = CatBoostRegressor(
iterations=100,
learning_rate=0.1,
depth=6,
loss_function='RMSE',
verbose=0 # ログ出力を抑制
)

# モデルの学習
# X_trainにカテゴリ変数が含まれる場合、fitメソッドの引数cat_featuresにカラム名またはインデックスを渡す
cat_model.fit(X_train, y_train, cat_features=cat_features, eval_set=(X_test, y_test))

# 予測
y_pred = cat_model.predict(X_test)

# 評価
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.4f}")

まとめ

この記事では、CatBoostの特徴を中心に、以下の点を解説しました。

  • カテゴリ変数の効果的な取り扱い
    CatBoostは、Ordinal EncodingやOrdered Target Encodingを用いることで、カテゴリ変数の情報を最大限活用しつつ、データリーク(目的変数の情報の漏洩)を防止します。
  • 順序依存性の低減と高速な学習
    内部のオーダリングテクニックにより、バイアスを低減し、データリークを回避しながら高速な学習を実現しています。
  • 柔軟なAPI設計
    専用APIとscikit-learn互換APIが提供されており、ユーザーは用途や好みに応じた方法でモデル構築が可能です。

CatBoostは、特にカテゴリ変数が多いデータセットで効果を発揮する印象です。

コメント

タイトルとURLをコピーしました