CatBoost
CatBoost 是 Yandex 的开源梯度提升库,它使用有序目标统计对类别特征进行编码,并构建对称树。
CatBoost 是用于决策树的开源梯度提升库,由 Yandex 开发并于 2017 年发布。它的名称来自“类别提升”(categorical boosting):它可以直接接受城市、产品 ID 或设备类型等类别列的原始字符串,并在内部将其转换为数字,因此表格数据训练前无需手动进行独热编码或目标编码。其 NeurIPS 2018 论文提出的两项方法——有序目标统计和有序提升——会避免在用于拟合每个训练行的数值中使用该行自身的标签,从而防止普通目标编码和标准提升中的信息泄漏及偏差。CatBoost 支持在 CPU和 GPU上训练,提供 Python、R 和命令行接口,并支持分类、回归和排序。
CatBoost 如何编码类别特征#
独热编码会为每个类别创建一列;对于商家 ID 或用户 ID 这类有数千种取值的特征,这种做法会变得难以管理。目标编码会用某个类别对应行的标签均值替换该类别,虽然表示紧凑,却会泄露答案:某行自己的标签也参与了描述该行的数值计算,因此模型学会了一种在新数据上失效的捷径。这是一种数据泄漏,会导致过拟合,而且在稀有类别上尤为严重。
CatBoost 的有序目标统计通过对训练行随机排列来解决这个问题。每行的类别编码只使用排列中位于该行之前的行的标签,并向先验值平滑,因此任何一行都不会看到自己的标签。CatBoost 会对多个排列重复这一过程,对取值很少的特征使用独热编码,并在训练过程中贪心地构造类别特征组合(例如城市与设备类型的交叉组合)作为新特征。
在 CatBoost Python 软件包中,类别列通过 cat_features 按名称传入。下面的示例为 50 种订阅方案分别设置隐藏的流失率,并检查模型能否从原始方案名称中推断出这些比率:
import numpy as np
import pandas as pd
from catboost import CatBoostClassifier
# Synthetic churn data: each of 50 plans has its own hidden churn rate
rng = np.random.default_rng(0)
rates = rng.uniform(0.05, 0.6, size=50)
plan_ids = rng.integers(0, 50, size=5000)
X = pd.DataFrame({"plan": [f"plan_{i}" for i in plan_ids], "tenure_months": rng.integers(1, 60, size=5000)})
y = rng.random(5000) < rates[plan_ids]
# Raw strings go in directly; CatBoost encodes them with ordered target statistics
model = CatBoostClassifier(iterations=200, depth=4, verbose=0, random_seed=0)
model.fit(X, y, cat_features=["plan"])
# Compare true and predicted churn for the safest and riskiest plans
lo, hi = rates.argmin(), rates.argmax()
probe = pd.DataFrame({"plan": [f"plan_{lo}", f"plan_{hi}"], "tenure_months": [30, 30]})
print("True churn rates: ", rates[[lo, hi]].round(2))
print("Predicted churn rates:", model.predict_proba(probe)[:, 1].round(2))脚本输出的真实比率为 0.05 和 0.60,预测比率为 0.06 和 0.59。模型从原始字符串列中推断出了每种方案的流失率,而每种方案的训练行数只有约 100 条。
有序提升与对称树#
标准梯度提升会在与早期树相同的训练行上计算新树的目标值,即损失梯度,这会使梯度产生偏差;CatBoost 作者将这种现象称为预测偏移。有序提升会再次运用排列技巧:每行的梯度来自只在排列中更早行上训练的模型。这是一项训练选项 boosting_type="Ordered",通常能提升小型数据集上的效果,但会降低速度。CPU 默认使用经典的 "Plain" 方案;对于不超过 50,000 行的数据集,GPU 训练默认使用 "Ordered",多分类模式除外。
CatBoost 默认构建对称树(也称为 oblivious tree),其中同一深度的所有节点都使用相同的分裂条件。因此,深度为 6(默认值)的树只需进行六次是或否判断,其结果构成一个 6 位索引,对应 64 个叶节点。这种结构可加快预测、限制每棵树的复杂度,属于一种正则化形式。数据集需要限制更少的树时,可以通过 grow_policy 参数切换为按深度或按叶节点生长。
实际应用#
- 信用风险:贷款机构会结合职业、地区和贷款用途等申请人类别字段,以及收入和债务等数值,预测违约情况,无需对数百种职业代码进行独热编码。
- 排序与推荐:CatBoost 提供 YetiRank 等排序损失函数,可在推荐系统中根据用户、商品和上下文特征预测相关性,从而为搜索结果或商品排序。
- 房产估值:定制训练的 YOLO26检测器可以从房源照片中统计泳池或太阳能板等设施,这些计数会作为数值列输入 CatBoost 价格模型,与社区和房产类型等类别列一起使用。
CatBoost 与 XGBoost 和 LightGBM#
这三个库都会依次构建由多棵树组成的集成模型,每棵树都修正前面树的误差;这一点使它们不同于随机森林,后者的树是独立训练的。










