有序类别提升
CatBoost回归
在定类列上用排列前缀的目标均值做分裂,再沿平方损失的残差加对称树,而不是先独热再跑一轮普通 GBDT。
这篇能回答什么
CatBoost回归要回答的是:一张混着城市、区域、房屋类型的宽表,怎样直接预测连续总价,并且不先把定类炸成哑变量。梯度提升树(GBDT)回归通常要你先整数编码或独热,再让浅树去拟合残差;独热后的 0/1 列很容易在后续轮次里「看见」自己的标签。CatBoost 的核心是有序目标统计:对某个城市取值,只用随机排列里排在当前行前面、且同一城市的样本,去估计该城市的总价均值,再拿这个均值当分裂依据。当前行自己的万元数不进分子。
教学表把拟合后的残差按绝对值分成三层(表头仍印着类别 A/B/C),用来看有序提升之后还有多少套房坐在大残差里。完整个案 300。高残差层 A 50 条(16.67%),中层 B 58(19.33%),低残差层 C 192(64.0%)。C 吞掉将近三分之二,说明对多数房源,有序均值加残差步已经把预测拉到观测附近;A 的 50 条才是还值得盯的难点,不是「三类客户」。
什么时候不该用
Y 是户型档或流失标签时改CatBoost分类,那里有序统计估计的是类频率,叶上加的不是残差均值。必须报告单位斜率与 VIF 时,回线性回归。特征几乎全是标准化后的面积与单价、没有定类列时,K近邻回归或支持向量机回归更贴距离与管道的假设。房源 ID、小区名称是标识符,不能当「高基数类别特征」。
如何选择方法
先问定类列是不是主角。10 个城市、49 个区域必须进模型时,有序统计直接分裂;普通 GBDT 把区域独热成稀疏列,提升轮次容易泄漏。只想平行平均、阈值还可以乱抽,走 ExtraTrees。只要学习率与早停、表里几乎没有字符串列,GBDT 回归足够。CatBoost 与 GBDT 都沿残差前进,差别在类别怎么进树,不在「谁更像提升」。
CatBoost回归:定量 Y + 可含大量定类 X;有序目标均值 + 对称树;输出残差三层与 RMSE。
GBDT 回归:同样拟合残差,但默认不提供有序类别编码。
XGBoost / LightGBM 回归:直方图或正则提升,类别列仍要你先处理。
线性回归:要 B 与区间估计;写不出城市的有序均值门槛。
输入、输出与限制
输入
因变量必须是定量。特征可以同时包含面积、楼层等连续尺,以及城市、区域、房屋类型、装修情况等字符串或整数码。定类列保持原生角色即可,不必事先独热。
因变量:正好 1 个定量列(本例总价(万元))。
特征:最少 2 个,最多 80 个;定量与定类可混用。本练习建议面积、楼层、总楼层、建筑年份,外加城市、区域。
输出
结果表把残差绝对值分成 A / B / C 三层:A 50、B 58、C 192,合计 300。另给出拟合/残差图与类别列上的贡献。RMSE、MAE、R² 以工作台数字为准;占用表本身不打印系数。
产品限制
有效行少于 25 时拒绝拟合。
对称(oblivious)树深度固定 6,同一层共用一个分裂。
学习率默认 0.1;迭代轮次可早停,但训练误差单独下降不算停则。
房源 ID、小区名称(本表约 193 个小区)拒绝进入特征。
排列种子固定后可复现;换一份排列,稀有区域的有序均值会微变。
案例
研究问题。 综合评价宽表除了面积,还有城市与 49 个区域。研究者想预测总价,又不想在 Excel 里先做 49 列独热,更不想让提升树在这些 0/1 列上记住本行房价。问题是:有序均值加残差步之后,还有多少套房的残差仍很大。
工作表「Sheet1」。完整个案 300。残差三层:A 50(16.67%)、B 58(19.33%)、C 192(64.0%)。C 的 64% 只说明多数点已被拉近,不是命中率。下载后:Y 勾总价(万元);特征勾面积、楼层、总楼层、建筑年份、城市、区域。装修、房屋类型可留作定类,小区名称必须排除。
在 StatsX 中操作
步骤 1 · 打开宽表并留下字符串城市
不要在导入前把城市、区域改成哑变量。Sheet1 里这些列保持文本或整数码,算法才走有序统计。
步骤 2 · 把标识符挡在角色外
画像里去掉房源 ID 与小区名称。193 个小区水平不是「高基数类别」,是准主键,纳入等于背诵房号。
步骤 3 · 选 CatBoost回归而非 GBDT
目录里的梯度提升树回归不会自动做有序编码。Y 是总价时也不可点 CatBoost分类——分类估计的是档位频率。
步骤 4 · 定类列保持原生角色
因变量:总价(万元)。定量特征:面积、楼层、总楼层、建筑年份。定类特征:城市、区域。不要先在表格里手工独热。
步骤 5 · 读残差三层而不是混淆矩阵
合计应对上 300。A 层若仍是 50 条,先核对这 50 套是不是天价或录入错误,再决定要不要加轮。




如何阅读输出
下表是有序提升之后按残差绝对值切开的三层人数,不是房屋类型频数。合计 N=300。A 50 条(16.67%)残差最大,B 58(19.33%)居中,C 192(64.0%)已被拉到观测附近。C 的 64% 不能写成「准确率 64%」——本页没有类别可命中。预测值是加性模型给出的万元均值。
| 项目 | 类别 | 统计量 | 取值 |
|---|---|---|---|
| CatBoost回归 | 类别 A | 频数 | 50 |
| CatBoost回归 | 类别 B | 频数 | 58 |
| CatBoost回归 | 类别 C | 频数 | 192 |
| CatBoost回归 | 合计 | 有效样本 N | 300 |
| CatBoost回归 | 类别 A | 占比(%) | 16.67 |
| CatBoost回归 | 类别 B | 占比(%) | 19.33 |
| CatBoost回归 | 类别 C | 占比(%) | 64.0 |
左右滑动可查看完整表格
教学示例表在 StatsX 工作台中的计算结果口径。


阅读顺序:合计 N → 高残差层人数(本例 A=50)→ 城市/区域贡献是否只是把常见组合推进 C 层 → 验证 RMSE 是否还在降。不要把 A/B/C 写成「三类客户」。统计显著在本页不适用:提升不给有序均值配 t 检验。
学习率 0.1 配很多轮,训练 RMSE 几乎总能再降一点,A 层可能被「记住」而不是被解释。应划验证集或早停。对称树深度 6 写死了交互深度,不要写成「已拟合任意深 CatBoost」。换一份排列,稀有区域的有序均值会微变,A 层可能差几套——报告时应写固定种子。面积贡献高多半是定义性相关,不能当因果。
理论与公式
把城市或区域列记为 x。先抽一个排列 \sigma,再对第 k 个位置计算「排在它前面、且同一水平」的总价均值,并用先验均值 p 与平滑 a 收缩:
树在 \hat{x} 上做数值分裂,因此 49 个区域不必变成 49 个哑元。随后按平方损失做加性提升:第 m 棵对称树拟合当前残差,叶上加的是该叶残差均值再乘学习率 ν:
本例 n=300,三层人数 50/58/192。分类版 CatBoost 把 y 换成类示性、把损失换成交叉熵——那是另一页。普通 GBDT 回归没有这套前缀均值,区域通常要先独热;独热列上的分裂可以「看见」本行标签,有序统计按定义看不到。本页占用清点的是残差分层,不是损失函数本身。
注意事项
A 层仅 50 条时,先分辨录入错误与稳定难户型,再决定加轮。
先独热再跑 CatBoost,等于丢掉有序分裂,还可能把房价泄漏进 0/1 列。
小区名称、房源 ID 不是类别特征,强行纳入会让模型记住房号。
C 层占 64% ≠ 模型更准,只说明多数残差已被压小。
对称树深度 6 是产品常数,交互再深也进不了模型。
有序均值依赖排列;换种子,稀有区域编码会微变,不能当因果「换城市导致总价变」。
常见问题
参考文献
Prokhorenkova, L., Gusev, G., Vorobev, A., Dorogush, A. V., & Gulin, A. CatBoost: unbiased boosting with categorical features[C]//NeurIPS. 2018.
Friedman, J. H. Greedy function approximation: A gradient boosting machine[J]. Annals of Statistics, 2001, 29(5): 1189–1232.
Dorogush, A. V., Ershov, V., & Gulin, A. CatBoost: gradient boosting with categorical features support[J]. arXiv:1810.11363.