CatBoost中的类别特征处理
CatBoost(Categorical Boosting)是Yandex开发的一种梯度提升算法,最显著的特点是其原生支持类别特征,无需手动编码。

核心特点
无需预编码
- 直接接受字符串/整数形式的类别特征
- 自动处理高基数类别特征
- 不需要One-Hot Encoding或Label Encoding
有序目标编码(Ordered Target Encoding)
CatBoost使用一种特殊的目标编码技术:
- 基于排序机制:使用排列组合思想,根据历史数据计算目标统计量
- 避免目标泄露:每个样本的编码仅基于其之前的样本(按随机排列顺序)
- 处理时间依赖性:类似时间序列,防止未来信息泄露
特征组合
CatBoost自动构建类别特征间的组合:
- 自动识别并组合类别特征
- 使用贪心算法找到最佳组合
- 提升模型表达能力
使用方式
from catboost import CatBoostClassifier, Pool
# 直接指定类别特征
train_data = [["a", 1, 2], ["b", 3, 4], ["c", 5, 6]]
train_labels = [1, 0, 1]
# 方式1:使用 Pool 对象指定
train_pool = Pool(
data=train_data,
label=train_labels,
cat_features=[0] # 第0列是类别特征
)
# 方式2:在模型参数中指定
model = CatBoostClassifier(
cat_features=[0], # 指定类别特征索引
iterations=100,
learning_rate=0.1
)
model.fit(train_data, train_labels)
参数设置
model = CatBoostClassifier(
# 类别特征处理参数
cat_features=None, # 类别特征索引或名称列表
one_hot_max_size=2, # 使用One-Hot编码的最大类别数
has_time=False, # 是否按时间顺序处理
# 类别特征扩展参数
auto_class_weights=None, # 类别权重处理
# 其他参数
depth=6,
iterations=500,
learning_rate=0.03
)
重要参数解释
| 参数 | 说明 | 默认值 |
|---|---|---|
cat_features |
指定类别特征的索引或列名 | None |
one_hot_max_size |
类别数≤此值时使用One-Hot,否则用目标编码 | 2 |
has_time |
是否按时间顺序处理类别编码 | False |
max_ctr_complexity |
类别特征组合的最大复杂度 | 4 |
ctr_border_count |
类别特征目标编码的边界数 | 32 |
优势与适用场景
优势:
- 开箱即用,减少数据预处理工作
- 处理高基数类别特征效果更好
- 自动特征组合
- 避免目标泄露
最佳实践:
- 数据中存在大量类别特征
- 类别特征基数高(如用户ID、地区代码)
- 需要自动处理缺失值和类别特征
- 追求较少的参数调优
注意事项
- 性能考虑:类别特征越多,训练时间可能增加
- 内存使用:高基数类别特征可能消耗更多内存
- 新数据预测:训练集中未出现的新类别会被处理为特殊值
CatBoost的类别特征处理是其核心竞争力,特别适合处理包含大量类别特征的表格数据。