跳到主要内容

有序类别提升

CatBoost回归

在定类列上用排列前缀的目标均值做分裂,再沿平方损失的残差加对称树,而不是先独热再跑一轮普通 GBDT。

更新日期 2026-08-29 机器学习

这篇能回答什么

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. 步骤 1 · 打开宽表并留下字符串城市

    不要在导入前把城市、区域改成哑变量。Sheet1 里这些列保持文本或整数码,算法才走有序统计。

  2. 步骤 2 · 把标识符挡在角色外

    画像里去掉房源 ID 与小区名称。193 个小区水平不是「高基数类别」,是准主键,纳入等于背诵房号。

  3. 步骤 3 · 选 CatBoost回归而非 GBDT

    目录里的梯度提升树回归不会自动做有序编码。Y 是总价时也不可点 CatBoost分类——分类估计的是档位频率。

  4. 步骤 4 · 定类列保持原生角色

    因变量:总价(万元)。定量特征:面积、楼层、总楼层、建筑年份。定类特征:城市、区域。不要先在表格里手工独热。

  5. 步骤 5 · 读残差三层而不是混淆矩阵

    合计应对上 300。A 层若仍是 50 条,先核对这 50 套是不是天价或录入错误,再决定要不要加轮。

工作台打开含城市区域的住房宽表
宽表进入工作台,城市与区域保持文本。
列画像确认城市为定类、总价为定量
总价为定量结局;城市、区域为定类,不要先独热。
目录中选定 CatBoost回归
选定 CatBoost回归,不要误点 GBDT 或 CatBoost分类。
为 CatBoost回归指定总价与城市区域
因变量为总价;特征同时包含定量尺与原生定类列。

如何阅读输出

下表是有序提升之后按残差绝对值切开的三层人数,不是房屋类型频数。合计 N=300。A 50 条(16.67%)残差最大,B 58(19.33%)居中,C 192(64.0%)已被拉到观测附近。C 的 64% 不能写成「准确率 64%」——本页没有类别可命中。预测值是加性模型给出的万元均值。

CatBoost回归结果表
项目类别统计量取值
CatBoost回归类别 A频数50
CatBoost回归类别 B频数58
CatBoost回归类别 C频数192
CatBoost回归合计有效样本 N300
CatBoost回归类别 A占比(%)16.67
CatBoost回归类别 B占比(%)19.33
CatBoost回归类别 C占比(%)64.0

左右滑动可查看完整表格

教学示例表在 StatsX 工作台中的计算结果口径。

CatBoost回归残差分层结果表
工作台人数应与上表三层一致:50 / 58 / 192。
CatBoost回归拟合或残差图
拟合图对照预测均值与观测总价;分层人数以表为准。

阅读顺序:合计 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.