有序提升与类别特征
CatBoost分类
在定类列上用有序目标统计决定分裂,而不是先独热编码再提升,从而减少标签泄漏并直接吃进城市、区域这类高基数字段。
这篇能回答什么
CatBoost 分类回答的是:「在一张混有城市、区域、房屋类型等定类列的表上,怎样把住房分到预先给定的互斥档,并且不先把类别炸成哑变量」。它的核心不是「又一棵梯度提升树」,而是有序类别分裂:对某个定类取值,只用排列中排在当前行前面的样本,去估计该取值对应的目标均值(或一类对其他类的频率),再拿这个统计量当分裂依据。后面的行看不到自己的标签,因此编码不会把答案写进特征。
适合:标签是定类(本教学结果记为类别 A/B/C 三档占用),特征里有 10 个城市、49 个区域、4 种装修这种中高基数定类,同时又有面积、单价等定量列。综合评价教学表正好是这种宽表。想解释「区域把预测推向哪一档」时,可随后接SHAP 模型解释。
什么时候不该用
没有预先给定的互斥标签时,这是监督分类,应改用K-Means 聚类分析做分群。目标若是连续总价,应走回归而不是把万元数硬切成三档再分类。房源ID、小区名称(本表 193 个小区)是准标识符,不能当原生类别特征。只想要一条可打印的 if-then 规则时,单棵决策树分类更合适。
如何选择方法
先看特征是不是「定类很多、而且水平数远大于 2」。若城市、区域必须进模型,CatBoost 用有序统计直接分裂;随机森林或 ExtraTrees 通常要先整数编码,GBDT 常先独热,独热会把 49 个区域变成稀疏列并在提升轮次里泄漏目标。若特征几乎全是标准化后的面积与单价、没有类别列,K近邻(KNN)分类或支持向量机(SVM)分类更贴距离与间隔的假设。
CatBoost分类:定类 Y + 可含大量定类 X;分裂用有序目标统计,输出各类占用与类别列上的贡献。
梯度提升树(GBDT)分类:同样是提升,但默认不提供有序类别编码,区域列要先处理。
ExtraTrees分类:分裂阈值在节点范围内乱抽,不计算有序目标均值。
SHAP 模型解释:已经有一棵树模型之后,再量化「区域把某套房子推向哪一档」。
输入、输出与限制
输入
目标必须是定类,至少两个互斥水平。特征可以同时包含定量(面积、楼层、单价)与定类(城市、区域、房屋类型、装修情况)。定类列保持字符串或整数码即可,不必事先独热。
特征变量:最少 2 个,最多 80 个;定量与定类可混用。
目标变量:正好 1 个定类变量,水平数为 2–20。
输出
结果表按类别给出占用频数与占比(%),并给出有效样本 N。教学示例把三档标签记为类别 A/B/C,占用之和等于 N。图为各类占用柱。另有文字洞察说明有没有某一档被挤占。特征贡献按 PredictionValuesChange 排序,定类列以其有序统计进入分裂,因此「区域」可以单独出现在贡献表里,而不是拆成 49 个哑元。
产品限制
有效行至少 30 条;拟合最多使用 15000 行(多种子下采样,种子 42)。
单列定类基数上限 256;超出则拒绝该列,不会静默并成「其他」。
看起来像编号的列(房源ID)以及小区名称这类准标识符会被拒绝。
有序目标统计使用固定排列;迭代 200、对称树深度 6、学习率 0.03,用户不能改成任意 CatBoost 网格。
占用表按预测标签汇总。写论文若要准确率或混淆矩阵,应同时导出逐行预测,不要把占用百分比当成命中率。
这些上限来自 StatsX 实现。SPSS 没有 CatBoost 过程;不要拿 SPSS 决策树的 CHAID 分箱或 Python catboost 默认 1000 轮来对格子。
案例
研究问题。 综合评价教学表有城市、区域、房屋类型、装修情况等定类列,以及面积、单价。希望用这些字段把住房分到预先给定的三个互斥档(结果表记为类别 A/B/C),并检查提升之后三类占用会不会塌到一档。
教学运行有效样本 208(全表 600 行,因缺失删除与拟合上限而少于此数)。特征侧使用城市(10 个水平)、区域(49 个水平)、房屋类型、装修情况作为原生定类,面积(平米)、楼层、单价(元/平米)作为定量;目标为三档标签。占用:A 78、B 76、C 54。下载后按同样角色复现本页表格。
在 StatsX 中操作
步骤 1 · 上传综合评价表
把评价 xlsx 拖进工作台,确认工作表为 Sheet1。房源ID 只作行号,不要进特征。
步骤 2 · 核对定类基数
列画像里城市约 10 个水平、区域约 49、装修 4 档,都可以作为原生类别。小区名称约 193 个,当作准标识符跳过。
步骤 3 · 点选 CatBoost分类
在目录搜「CatBoost」或「类别提升」。适合标记只说明表里有定类列,最终仍看你是否真有三档标签。
步骤 4 · 挂上原生类别与定量列
特征勾选城市、区域、房屋类型、装修情况、面积、楼层、单价;目标选三档标签列。不要先在 Excel 里把区域拆成 49 列 0/1。
步骤 5 · 读占用而不是「准确」
先对有效 N,再看 A/B/C 各占多少套。三档都超过 50 套时,后续分层讨论才站得住。




如何阅读输出
下表是同一次教学运行的类别占用:A 78 套、B 76 套、C 54 套,合计 208。A 与 B 只差 2 套,C 略少但仍占 25.96%。把「占比」读成命中率是错的——占比分母是有效 N,分子是被分到该档的套数。
| 项目 | 类别 | 统计量 | 取值 |
|---|---|---|---|
| CatBoost分类 | 类别 A | 频数 | 78 |
| CatBoost分类 | 类别 B | 频数 | 76 |
| CatBoost分类 | 类别 C | 频数 | 54 |
| CatBoost分类 | 合计 | 有效样本 N | 208 |
| CatBoost分类 | 类别 A | 占比(%) | 37.5 |
| CatBoost分类 | 类别 B | 占比(%) | 36.54 |
| CatBoost分类 | 类别 C | 占比(%) | 25.96 |
左右滑动可查看完整表格
教学示例表在 StatsX 工作台中的计算结果口径。


本次 CatBoost 在有效样本 208 套上给出三类占用:A 78 套(37.50%)、B 76 套(36.54%)、C 54 套(25.96%)。三档都占到四分之一以上,没有出现「几乎全部被推进同一叶」的塌缩;占用不是命中率,不能写成分类精度。
解读顺序:有效 N 是否接近你删缺失后的行数 → 最小档是否过稀(本例 C 仍有 54 套)→ 有序统计有没有把稀有区域并进多数档。本例占用相对均匀,只能说明预测标签没有塌缩,不能推出「区域已经把三类完美切开」。写结果节时把 A/B/C 换成你的业务档名,并另附混淆矩阵。
理论与公式
设定类特征 x 在随机排列 \sigma 下第 k 个位置取值为 x_{\sigma(k)}。有序目标统计只用该位置之前、且取同一水平的样本,加上先验 p 与平滑 a:
多分类时 y^{i} 是「是否属于第 i 类」的示性,p^{i} 是该类的全局频率。树在 \hat{x} 上做数值分裂,因此 49 个区域不必变成 49 个哑元。有序提升进一步让第 t 棵树的残差只在排列前缀上计算,减轻「用自己的残差定义自己的叶」带来的预测偏移。StatsX 使用对称( oblivious)树:同一层所有节点共用一个分裂,便于把「区域的有序统计」读成整层规则。
占用表不是损失函数:它只清点 \hat y_m 落在各类的次数。先验 p 来自全样本类频率,因此若真实标签本身极偏,有序统计会把稀有水平往多数类拉;本教学占用相对均衡,与「先验把一切推向 C」的情形不同。
注意事项
有序统计依赖排列。产品固定种子后可复现,但换一份排列,稀有区域的编码会微变,占用可能差几套。
独热后再跑 CatBoost 等于丢掉它的类别分裂,还可能把标签泄漏进 0/1 列。
小区名称、房源ID 不是「高基数类别特征」,是标识符;强行纳入会让模型记住房号。
占用均衡 ≠ 分得准。三类都可以被同时分错而占用仍接近 1:1:1。
对称树深度固定为 6,交互再深也进不了模型,不要写成「已拟合任意深度 CatBoost」。
不能当因果:区域占用高,只说明有序统计在预测时重用了区域,不证明「换区域会导致档位变化」。
常见问题
参考文献
Prokhorenkova, L., Gusev, G., Vorobev, A., Dorogush, A. V., Gulin, A. CatBoost: unbiased boosting with categorical features[C]//Advances in Neural Information Processing Systems. 2018.
Dorogush, A. V., Ershov, V., Gulin, A. CatBoost: gradient boosting with categorical features support[J]. arXiv:1810.11363, 2018.
周志华. 机器学习[M]. 北京: 清华大学出版社, 2016.