CatBoost は決定木ベースの勾配ブースティングライブラリであり、数値特徴量に対して自動的に量子化(ビン分割)を行うことで高速化と過学習抑制を実現しています。その量子化を制御する主要パラメータが border_count
です。本記事では、border_count
の意味やデフォルト値、調整方法、実践的な使い方例と注意点を解説します。
量子化とビン分割とは?(わかりやすく解説)
- 量子化(Quantization)
- 連続値の特徴量を「小さなグループ」にまとめる処理です。
- 例えるなら、0~100までの数字が並ぶ無数の値を、10段階のメモリに合わせて「0~9」「10~19」…と区切って代表値を使うイメージです。
- これにより「細かい差」を丸めて「大まかな傾向」に注目できるようになります。
- ビン分割(Binning)
- 量子化の具体的な手法のひとつで、特徴量の値域を複数の「箱(ビン)」に分けます。
- 例えば RSI の場合、0~100 を 5 つのビンに分けると {0–19,20–39,40–59,60–79,80–100} の 5 箱に割り振ります。
- それぞれのビンは「代表値」(中央値や分位点)で扱われ、モデルはその代表値を基に分割を行います。
- なぜビン分割が有効?
- ノイズ除去:細かい値の揺らぎを吸収し、安定した特徴に変える。
- 分割候補の削減:候補が減り、モデルが小さな差で無駄に分割しなくなる。
- 計算高速化:探索すべき分割点が少ないほど学習が速くなる。
- CatBoost での自動ビニング
- CatBoost は内部で各連続特徴量を自動的にビン分割し、
border_count
で箱数を制御します。 - これにより、ユーザーが手動でビン分割を用意しなくても、適度な粗さで特徴量を近似できます。
- CatBoost は内部で各連続特徴量を自動的にビン分割し、
border_count とは
- 役割:数値(連続値)特徴量をどれだけ細かく分割(ビニング)するかを指定するパラメータ。
- コマンドライン引数:
-x
または--border-count
- 別名:
max_bin
連続値をそのまま扱うと分割候補が無数に膨らみ、学習時にノイズに適合してしまうリスクがあります。border_count
は「特徴量を何段階の代表値にまとめるか」を決めることで、計算効率の向上と過学習の抑制を同時に実現します。
デフォルト値:CPU と GPU の違い
CatBoost のデフォルト設定では、処理装置(CPU/GPU)や学習モードによって border_count
の値が切り替わります。
処理装置/モード | デフォルトの border_count |
---|---|
CPU | 254 |
GPUPairLogitPairwise/YetiRankPairwise | 32 |
GPU(上記以外のモード) | 128 |
たとえば、CPU 学習時は特徴量ごとに最大254段階のビン分割を行い、GPU の一般的なモードでは128段階となります。

CatboostをGPUで学習した時と、CPUで学習したときで結果が変わる原因の一つだね(‘Д’)
border_count の調整方法
1. グローバル設定
Python/R API やコマンドラインで一律に設定します。
from catboost import CatBoostClassifier
model = CatBoostClassifier(
iterations=500,
learning_rate=0.1,
border_count=64, # 64段階に抑制
task_type='GPU'
)
model.fit(X_train, y_train)
2. 特徴量ごとの個別設定
per_float_feature_quantization
引数を使い、特定の特徴量のみビン数を変えられます。
from catboost import Pool, CatBoostClassifier
pool = Pool(
data=X_train,
label=y_train,
per_float_feature_quantization=[
'0:border_count=32', # 特徴量ID=0 を32段階に
'3:border_count=512' # 特徴量ID=3 を512段階に
]
)
model = CatBoostClassifier(iterations=300)
model.fit(pool)
実践例:GPU での高速化
GPU で学習速度を最優先したい場合、border_count
を32に下げることで分割候補数が減り、計算コストを大幅に削減できます。
model = CatBoostClassifier(
iterations=1000,
task_type='GPU',
border_count=32, # 分割を32段階に制限
learning_rate=0.05
)
model.fit(X_train, y_train)
多くの場合、桁違いの高速化が得られる一方で、精度への影響は小さいと報告されています。
注意点・ベストプラクティス
- 情報損失のリスク
ビン数を過度に減らすと、特徴量の持つ微細な関係性が失われ、モデル精度が低下する可能性があります。 - まずはデフォルトから
CatBoost は内部で自動量子化を行っているため、通常はデフォルトのままで十分です。 - 他の正則化手段との併用
木の深さ制限(depth
)、リーフ当たり最小サンプル数(min_data_in_leaf
)、L2 正則化(l2_leaf_reg
)、早期停止などの手法と組み合わせて過学習に対処しましょう。 - クロスバリデーションによる検証
変更前後で交差検証を行い、速度・精度・メモリ使用量を比較して最適なborder_count
を決定してください。
まとめ
border_count
は数値特徴量のビン分割数を制御し、学習速度と過学習抑制に寄与する重要パラメータ。- CPU/GPU/学習モードによってデフォルト値が異なり、通常は「CPU:254」「GPU:128(PairLogit以外)」「GPU(PairLogit系):32」が使われる。
- 特別な要件がない限り、デフォルト設定で始め、必要に応じてグローバルまたは特徴量単位で微調整するのがベストプラクティス。
ぜひ次回の CatBoost チューニングで、border_count
を理解した上で最適化を試してみてください。
参考リンク
- Quantization settings — CatBoost 公式ドキュメント
- Speeding up the training — CatBoost 公式ドキュメント
オンラインコミュニティ
こちらのコミュニティで、AIや機械学習をトレードに活かすために日々探求しています。
興味のある方は覗いてみてください。