はじめに
機械学習の分野で、勾配ブースティング(Gradient Boosting)は高い予測精度と扱いやすさから多くの場面で利用されています。その中でもCatBoostは、カテゴリ変数を自動的に処理できる点や過学習に強い点が評価され、分類問題でも広く使われています。本記事では、CatBoost分類モデルの概要からチューニング、実践的な設定まで詳しく解説します。
CatBoostとはなにか
CatBoost(Categorical Boosting)は、Yandex社が開発した勾配ブースティングライブラリです。主な特徴は以下のとおりです。
- カテゴリ変数処理の自動化
カテゴリカル特徴量をそのまま扱える独自のエンコーディング手法(Ordered Target Statistics)を内蔵し、前処理を大幅に省略できます。 - 過学習防止策の充実
早期停止・ランダム化ドロップアウト・Leaf-wise分割とDepth-wise分割の組み合わせなど、多様な手法で汎化性能を高めます。 - 高速な実行とGPU対応
CPUでもマルチスレッドに最適化され、高速に学習可能。さらにGPU学習にも対応し、大規模データでも効率的です。 - Python/R他から利用可能
Pythonのほか、R、CLI、Java、C++からも利用でき、幅広い環境で導入しやすい設計です。
CatBoostの特徴
- Ordered Boosting
通常の勾配ブースティングは残差を計算する際に全データを使いますが、CatBoostでは学習時に「未来情報の漏れ」を防ぐため、データをシャッフルしながら逐次的に統計量を更新します。 - 多様な損失関数
分類ではLogloss
、CrossEntropy
、多クラス分類用のMultiClass
など、目的に合わせて選択できます。 - 欠損値の自動処理
欠損値を特別なカテゴリとみなし、自動で最適な分岐を学習します。 - 特徴量重要度の可視化
モデル学習後に各特徴量の重要度(Feature Importance)を簡単に取得でき、解釈性にも優れています。 - 高速な推論
学習済みモデルはONNX形式やCoreML形式にエクスポート可能で、リアルタイム推論にも利用しやすいです。
パラメーターの説明
パラメーター | 説明 | デフォルト例 | 目安の調整範囲 |
---|---|---|---|
iterations | 木を何本作るか。大きいほど表現力が上がるが過学習のリスクも。 | 1000 | 500 ~ 5000 |
learning_rate | 各木の寄与度のスケーリング係数。小さいほど安定するが、必要本数が増える。 | 0.03 | 0.005 ~ 0.3 |
depth | 各決定木の深さ。大きいほど複雑な分岐を学習。 | 6 | 4 ~ 10 |
l2_leaf_reg | リーフのL2正則化係数。大きいほど過学習抑制。 | 3.0 | 1 ~ 10 |
border_count | 連続値を分割するビン数。精度と速度のトレードオフ。 | 128 | 32 ~ 254 |
od_type /od_wait | 早期停止(overfitting detector)の設定。 | Iter /50 | Iter /30 ~ 200 |
random_strength | 木の構築時のランダム性。大きいほどノイズを加えて汎化性能向上。 | 1.0 | 0.5 ~ 2.0 |
task_type | 学習をCPU/GPUどちらで行うか。 | CPU | CPU or GPU |
eval_metric | モデル評価指標(AUC, F1, Accuracyなど)。 | Logloss | 問題設定に応じて選択 |
use_best_model | 評価セット上で最良だったイテレーション数を採用するか。 | True | True /False |
verbose | 学習のログ出力レベル。大きいほど詳細な情報が表示される。 | Verbose=1(最低) | 0 ~ 3 |
※調整範囲はデータ量やタスク難易度に応じて前後するため、上記をガイドラインとしてご活用ください。
一般化性能を高めるためにできること
- 早期停止の活用
検証データセットで改善が止まったタイミングで学習を打ち切り、過剰な適合を防ぎます。 pythonコピーする編集するmodel = CatBoostClassifier( iterations=2000, od_type='Iter', od_wait=100, use_best_model=True, ... )
- クロスバリデーション
KFoldやTimeSeriesSplitを用いて複数の分割で学習・評価し、モデルの安定性を確かめます。 - パラメーターサーチ
GridSearchCVやRandomizedSearchCV、Optunaなどのライブラリで最適な組み合わせを探索します。 - データ拡張/アンダー・オーバーサンプリング
クラス不均衡が強い場合はSMOTEやランダムサンプリングでバランスを調整し、偏りを軽減します。 - 特徴量エンジニアリング
カテゴリ変数の組み合わせやラグ特徴量、相互作用特徴量を追加することで、モデルの表現力を向上させます。
ラベルとして使用する場合の学習パラメーター
分類タスクで「正解ラベルそのもの」を予測に使う場合のポイントです。
- 損失関数:
- 二値分類:
loss_function='Logloss'
- 多クラス分類:
loss_function='MultiClass'
- 二値分類:
- 評価指標:
- AUC最適化:
eval_metric='AUC'
(二値) - F1最適化:
eval_metric='TotalF1'
- AUC最適化:
- イテレーション数と早期停止:
正解ラベルでは過学習しやすいため、od_type='Iter'
+od_wait=50~100
を設定しておくと安全です。 - 学習率:
learning_rate=0.01~0.1
の範囲で小さめに設定し、iterations
を多めにとることで安定化を図ります。
pythonコピーする編集するmodel = CatBoostClassifier(
loss_function='Logloss',
eval_metric='AUC',
learning_rate=0.05,
depth=6,
iterations=1500,
od_type='Iter',
od_wait=80,
use_best_model=True,
random_state=42
)
確率値として使用する場合の学習パラメーター
モデルの出力確率そのものを重視する場合(スコアリングやリスク評価など)に留意すべき設定です。
- 予測確率の質:
posterior_sampling=True
を使うと確率分布にノイズを入れてキャリブレーションを改善できます。- 学習後に
model.calc_feature_statistics()
で確率分布の歪みを確認。
- パラメーター:
leaf_estimation_method='Newton'
を使うと確率推定の精度向上に寄与します。class_weights
でクラスごとの重みを調整し、マイノリティクラスの確率精度を高める。
pythonコピーする編集するmodel = CatBoostClassifier(
loss_function='Logloss',
eval_metric='Logloss',
learning_rate=0.03,
depth=4,
iterations=2000,
posterior_sampling=True,
leaf_estimation_method='Newton',
class_weights=[1, 3], # クラス1を3倍重視
random_state=0
)
- キャリブレーション:
学習後にsklearn.calibration.CalibratedClassifierCV
などで再キャリブレーションを行い、予測確率をさらに滑らかに調整しても良いでしょう。
まとめ
CatBoostはカテゴリ変数処理や過学習防止機能が充実した勾配ブースティングライブラリです。分類タスクでは「ラベル重視」「確率重視」の目的に応じてパラメーターを使い分けることで、モデルの性能と実用性を最大化できます。ぜひ本記事の設定例を参考に、実データでチューニングを進めてみてください。疑問点や改善例があれば、お気軽にコメント欄で共有してください!
オンラインコミュニティ
こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。