表格数据上仍旧是SOTA:XGBoost、LightGBM 与 CatBoost
如果说图像、语音与自然语言处理的主战场,今天早已被深度学习改写,那么表格数据始终像是另一片节奏完全不同的疆域。这里没有统一的空间结构,也没有天然连续的局部模式,取而代之的,是混合类型字段、缺失值、异常值、长尾类别、业务规则、有限样本量,以及永远绕不开的工程成本。
也正因为如此,很多人第一次真正进入工业机器学习时,都会感到一种“时代错位”:一边是铺天盖地的 Transformer、扩散模型和多模态系统,另一边却是风控、广告、推荐、搜索、营销、医疗和工业监控中的大量项目,仍然在认真比较 XGBoost、LightGBM 和 CatBoost 等等。
这并不是怀旧,更不是树模型的历史残留。更准确的说法是:在大量结构化表格任务上,提升树至今仍是最常见的强 baseline,而且在很多场景里依然是最优选择或非常接近最优选择。 它们之所以长期不退场,不是因为业界保守,而是因为它们仍然有效。
本文不会展开整个集成学习框架,也不会详细讨论随机森林、Bagging 与原始 GBDT 的教学性推导。我想集中讨论的,是三种最有代表性的现代提升树工程系统:XGBoost、LightGBM 与 CatBoost。它们都出自 GBDT 这条谱系,但解决问题的重心完全不同:
- XGBoost 是通用、稳健、可控的方法论核心
- LightGBM 是把大规模训练吞吐和内存效率推到第一位的工业系统
- CatBoost 是围绕类别特征与目标泄漏问题重做专业体系
理解它们之间的差异,远比死记“谁更快、谁更准、谁支持类别特征”更重要。
这里说“仍旧是 SOTA”,并不是说它们在所有数据集、所有任务和所有输入模态下永远第一。更准确的限定是:在大量结构化表格任务上,它们依然是最强基线、常见最优解,或至少是离最优非常近的一类方法。
Tree 为什么还没有退场
在真正进入三种模型之前,先把一个根问题说清楚:为什么到了 2026 年,Tree-based boosting 在表格任务上仍然长期强势?
异构字段:表格从来不是均匀张量
图像是规则网格,文本是序列,语音是连续信号;但表格不是。表格里的每一列都可能拥有完全不同的语义:有的是连续数值,有的是高基数类别,有的是布尔字段,有的是时间戳、次数、占比,甚至还有字符串 ID 和少量文本。它不是一个自然同类的输入空间,而是一个被业务语义强行拼接起来的异构空间。
树模型恰恰适合这种不均匀性。它并不要求所有特征共享相同的几何结构,也不要求存在统一的平滑变换,而是直接通过“某个字段是否大于阈值”“某个类别是否落入某个集合”来切分样本空间。也就是说,对表格来说,Tree 的归纳偏置往往比神经网络更贴近原始问题的形状。
中小样本:现实世界的数据,未必大到足以端到端
深度学习的强项,很大程度上建立在海量数据、预训练资源和端到端表示学习能力之上。但很多真实业务并不具备这种条件。很多企业表格任务的样本量可能只有几万到几十万,特征数虽然不少,但字段质量参差不齐,且分布常带有明显长尾和业务偏差。
在这种情况下,一个带强归纳偏置、参数控制清晰、对中小样本更友好的提升树,往往更容易给出稳定结果。换句话说,不是所有任务都已经大到且复杂到必须靠重负载的表示学习才能解。
缺失与稀疏:工业数据的默认状态
真实表格数据里,“没有填写”“没有发生”“系统没有记录”“这个字段只对某类用户有效”几乎是默认状态,而不是例外。很多时候,缺失值本身就携带业务信息;稀疏特征本身就是表格的日常。
Tree-based 模型在这里显得特别自然。很多 boosting 框架可以直接把缺失值纳入分裂逻辑,而不需要你先进行一轮统一且往往粗糙的填补。对高维稀疏输入,树模型也常能更接近只在真正有信息的部分努力。
特征交互:先满足条件,再讨论下一步
很多表格任务的关键信号,并不来自单个字段,而来自字段之间的条件式交互。比如“逾期历史长且最近交易骤降”“设备型号属于某几类且地域在某几个城市”“点击频次高但客单价低”。这类模式既不是线性的,也不是简单的平滑非线性,而更像是一串带条件的 if-else 规则。
树模型的结构恰好就是这种语言:先切出一个局部区域,再在局部区域上继续细分。正因为如此,Tree 对“条件成立时再讨论下一步”这类问题特别敏感。
工程约束:解释性、训练成本与迭代效率
工业机器学习从来不只比极限精度。训练时间长不长、参数空间好不好搜、效果是否稳定、特征重要性是否清晰、能不能接 SHAP、线上延迟,部署价格,这些都是真正会改变模型选择的问题。
提升树之所以长期强势,还因为它们在这些维度上形成了极其成熟的生态。很多时候,团队真正需要的不是理论上最先进的真实SOTA,而是今天就能稳定地把活处理好。
从 Random Forest 到 GBDT:在正式内容开始之前
本文的主角不是随机森林,也不是原始 GBDT,但为了不让后面的讨论悬空,仍然需要做一个很短的铺垫。
Random Forest:Bagging 路线上的经典强基线
Random Forest 的核心思想是并行训练多棵树,再做投票或平均,本质上属于 Bagging 路线,技术重点在于降低方差。它依然是极强的 baseline,也非常适合作为入门模型和对照组。
但它不是本文的重点,因为我后面会单独写一篇关于集成学习的文章,把 Bagging、Boosting、随机森林与偏差-方差权衡放在一个统一框架里讲清楚。
GBDT:三种现代提升树的共同母体
如果说随机森林代表的是 Bagging,那么 GBDT(Gradient Boosting Decision Tree)代表的就是 Boosting:
\[F_t(x) = F_{t-1}(x) + \eta f_t(x)\]这里新增的树 $f_t$ 不再独立训练,而是专门去修补当前模型还没有拟合好的部分。直观上,它是在不断纠错;更严格地说,它是在函数空间里沿着损失下降方向逐步前进。
原始 GBDT 非常重要,因为 XGBoost、LightGBM 与 CatBoost 都站在这条主线上。但在今天的工程实践里,真正决定体验和性能的,往往已经不是Boosting 这个抽象思想,而是这些现代实现如何处理目标函数、分裂查找、缺失值、类别特征、内存布局与并行效率。
XGBoost:把 GBDT 从“经验好用”推进到“方法论完整”
XGBoost: A Scalable Tree Boosting System 的影响力,不只是因为它快,而是因为它把 GBDT 从一种经验上有效的方法,推进成了一套目标函数清楚、正则化明确、近似算法完整、稀疏处理成熟、工程实现扎实的提升树系统。
它为什么长期是很多人的默认第一站
如果你观察很多表格学习实践,会发现一个稳定现象:当任务还没有被完全摸透时,人们往往很愿意先试一个 XGBoost。原因并不神秘,它最吸引人的从来不是某一个指标上偶尔特别亮眼,而是那种整体上的平衡感。
它足够强、足够稳、目标函数足够灵活、超参数逻辑相对清晰,缺失值处理也相当自然。很多时候,XGBoost 真正提供的不是一个答案,而是一个可靠的Baseline:你先用它把问题的结构摸清楚,再决定是否需要更激进地追求速度、类别特征或某些专门优化。
数学身份:结构正则直接写进目标函数
XGBoost 最标志性的贡献之一,是把每一轮新增树的优化明确写成了带复杂度惩罚的目标:
\[\mathcal{L}^{(t)} = \sum_i l\big(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)\big) + \Omega(f_t)\]其中树的正则项写为:
\[\Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2\]这里 $T$ 是叶子数,$w_j$ 是第 $j$ 个叶子的权重。这个写法背后的思想非常重要:树不是长得越复杂越好,每多一个叶子都必须证明自己真的值得。 $\gamma$ 惩罚结构复杂度,$\lambda$ 则约束叶子权重不要过大。
训练核心:二阶展开、叶子权重闭式解与 split gain
XGBoost 的另一个关键点,是它并不只看一阶梯度,而是对损失做二阶近似:
\[\tilde{\mathcal{L}}^{(t)} \approx \sum_i \left[g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)\right] + \Omega(f_t)\]其中 $g_i$ 是一阶梯度,$h_i$ 是二阶梯度。这个二阶视角带来两个直接好处。
第一,给定树结构之后,叶子最优权重有闭式解:
\[w_j^* = -\frac{G_j}{H_j + \lambda}\]第二,候选分裂的收益也可以显式写出来:
\[\text{Gain} = \frac{1}{2}\left(\frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda}\right) - \gamma\]这件事的意义在于:XGBoost 里的是否分裂,不再只是一个直觉问题,而是一个明确的优化问题。收益必须足够大,才能覆盖结构复杂度惩罚。
工程核心:exact、approx、hist 与 weighted quantile sketch
很多人对 XGBoost 的印象还停留在精确 greedy 搜索,但这其实已经不是现代实践里最重要的视角了。按照官方 Tree Methods 文档,XGBoost 主要有三条分裂查找路线:
exact:精确 greedy 搜索,准确但慢,可扩展性最弱;approx:使用带权分位数 sketch 构造候选点;hist:先做全局分桶,再基于 histogram 训练,通常是今天最常用的路线。
这里尤其值得点名的是 weighted quantile sketch。它不是简单地“把连续特征随手离散化”,而是专门为带权分位数设计的近似结构,使候选切分点的构造与二阶优化逻辑相互一致。
这也是 XGBoost 非常典型的特色:它不一定最激进,但常常足够完整。
稀疏与缺失:把没出现当成建树的一部分
XGBoost 的 sparsity-aware split finding 会为每个节点学习缺失值的默认方向。也就是说,当某个样本在当前分裂特征上缺失时,走左还是走右,并不是预先硬编码好的,而是在训练中学出来的。
这带来两个非常现实的优势:第一,你不需要为了让模型能跑起来,先对所有缺失值做一轮非常粗糙的统一填补;第二,对高维稀疏输入,它更接近只在真正有信息的部分花计算量。
所以,XGBoost 支持缺失值这句话如果只作为一条功能介绍,其实是把它说浅了。更准确的说法是:它会把缺失视作分裂结构里需要一起优化的一部分。
今天怎么看 categorical support
过去常有人一句话概括:XGBoost 不原生支持类别特征。这个说法在今天已经过时了。按照官方 Categorical Data 教程,自 1.5 起 XGBoost 就支持 categorical data;按照 3.1 Release Notes,3.1 版本开始这项能力已经移除了 experimental 标签。
但这件事需要讲得更细一点:
- categorical split 依赖
hist或approx,不支持exact; - 模型保存通常应使用 JSON / UBJSON,否则类别信息可能丢失;
- 它支持 one-hot 与 partition-based split,但“类别特征处理”依然不是它最核心的设计中心。
也就是说,今天再说XGBoost 不能处理 categorical已经不准确;但如果因此就把它理解成 CatBoost 的替代品,也同样会理解过头。
它最强的场景
XGBoost 最自然的战场,大致是下面几类任务:
- 数值特征为主的表格任务;
- 需要一个稳健 baseline,再决定是否进一步追求吞吐或类别特征处理的项目;
- 需要特殊 objective 的任务,例如排序、生存分析、计数建模、分位数回归;
- 缺失值较多,希望模型原生吸收缺失结构信息的场景;
- 需要细粒度控制训练过程的工业系统。
误解与边界:稳健,不等于万能
关于 XGBoost,最常见的误解往往有这几种:
- “XGBoost 只是更快的 GBDT。” 这太低估它了。它真正重要的是把 boosting 做成了一套结构清楚、目标完整、工程成熟的系统。
- “XGBoost 不支持类别特征。” 这在今天已经过时,但它在类别特征上的方法论中心性仍不如 CatBoost 鲜明。
- “XGBoost 的强项还是 exact greedy。” 现代实践里,
hist往往才是主流。 - “缺失值就是 0。” 对树 booster 来说,这两个概念并不等价,缺失方向是在训练中学习出来的。
它的边界也很清楚:在超大规模、高维、极稀疏的宽表上,它的吞吐与内存效率往往不如 LightGBM 激进;在高基数类别任务上,它也不是最自然的第一选择。
一句话总结
XGBoost 的核心优势,不是永远最快,而是稳健、通用、可控。如果你不知道该从哪一种提升树先开始试,XGBoost 往往是最自然的起点。或者说如果你不知道你该用什么模型,这都是一个非常好的起点。
LightGBM:当瓶颈变成吞吐、内存与宽表规模
如果说 XGBoost 是完整而稳健,那么 LightGBM: A Highly Efficient Gradient Boosting Decision Tree 从一开始就显得更像一个鲜明的工程系统:它把设计重心放在了大规模训练速度、内存效率与宽表吞吐上。
它为什么从一开始就更工程化
LightGBM 之所以在广告、推荐、搜索排序、CTR 预估等任务里如此常见,并不是因为它简单地在 XGBoost 基础上再提一点速,而是因为它重新组织了整套训练流程。按照官方 Features 文档,它的优势来自一组相互协同的设计:histogram、histogram subtraction、leaf-wise 生长、GOSS、EFB、稀疏优化以及分布式友好性。
也就是说,LightGBM 的身份更接近面向大规模工业表格训练重构出来的一套 boosting 系统,而不是又一个 GBDT 库。
速度来源:histogram 与 histogram subtraction
LightGBM 会先把连续特征离散到有限个 bin 中,再在 histogram 上寻找最佳切分点。这样做的好处很直接:构建 histogram 的代价依然与样本数有关,但一旦 histogram 建好,真正寻找候选切分点时只需要扫描 bin,而不必反复扫描所有原始值。
更关键的提速点来自 histogram subtraction。父节点 histogram 已知时,只要显式构建其中一个子节点的 histogram,另一个子节点的 histogram 就可以通过“父节点减去兄弟节点”快速得到。这听起来像实现细节,但实际上是它训练速度的重要来源之一。
结构哲学:leaf-wise 为什么更猛,也为什么更危险
LightGBM 最著名、也最容易被误解的设计,是它默认采用 leaf-wise / best-first 生长,而不是更保守的按层生长。它每一步都挑当前带来最大 loss 降幅的叶子继续分裂,而不是把整层节点一起向下扩展。
这样做的结果非常直接:在同样叶子预算下,leaf-wise 往往能更快压低训练损失,也因此常在固定时间里给出更强的拟合能力。但问题也恰恰来自这里:更激进,通常也意味着更容易过拟合。
所以在 LightGBM 里,真正关键的控制项往往不是只看 max_depth,而是同时控制 num_leaves、min_data_in_leaf以及正则化和采样策略。很多初学者误以为设了 max_depth 就相当于把 LightGBM 变回 level-wise,这其实并不对,因为它的生长思路本身没有改变。
样本维度优化:GOSS 不只是 subsample
LightGBM 论文提出的 GOSS(Gradient-based One-Side Sampling),经常被误解成另一种随机抽样。但它和普通 subsample 的问题意识其实完全不同。
在 boosting 过程中,梯度绝对值大的样本通常意味着模型还没有把它们学好。于是 GOSS 的策略不是均匀随机删样本,而是:
- 保留一部分大梯度样本;
- 从小梯度样本中随机抽取一部分;
- 对后者做权重补偿,以尽量保持增益估计不被严重扭曲。
它背后的直觉很漂亮:真正不能轻易丢掉的,是那些当前还没学明白的样本。 这比简单 subsample 更贴合 boosting 的训练逻辑。
特征维度优化:EFB 为什么特别适合宽表
除了样本维度,LightGBM 还对特征维度做了结构性压缩,这就是 EFB(Exclusive Feature Bundling)。
它的观察是:很多稀疏特征彼此互斥,例如 one-hot 展开后的一组列,同一个样本通常只会有一列激活。既然这些特征几乎不会同时非零,那么就可以把它们打包到同一个 bundle 中处理,从而显著减少 histogram 构建成本。
这也是为什么 LightGBM 在推荐、广告、搜索排序这类高维稀疏宽表问题上显得如此自然。它最擅长处理的,往往不是几十列整齐的数值特征,而是成百上千、甚至更多被编码和拼接出来的工业宽表字段。
类别支持:它能处理 categorical,但不是 CatBoost 那种处理
LightGBM 原生支持 categorical feature,这当然非常有价值。但这件事必须讲清楚:它的类别特征路线和 CatBoost 完全不同。按照官方 Advanced Topics 文档,它本质上是基于类别统计量排序后的最优二分,而不是 ordered target statistics。
这意味着它解决的问题更偏向于:如何高效地做类别分裂;而不是像 CatBoost 那样,把类别编码泄漏与 boosting 偏差放在同一个原则下处理。
同时,几个边界必须记住:
- 类别特征通常应编码为非负整数;
- 负值会被当成缺失值;
- 高基数类别并不一定天然适合 native categorical,官方文档本身就提醒这件事要谨慎。
缺失值:zero_as_missing
LightGBM 默认支持缺失值,但 zero_as_missing 会改变“数值 0”和“缺失值”之间的语义边界。
这在稀疏矩阵、LibSVM 格式或者“未出现即为 0”的工业特征里尤其危险。如果 0 在业务里是一个有明确意义的状态,而你却把它当作缺失处理,那么模型看到的就不是你以为的那张表。
所以,关于 LightGBM,最值得强调的一句提醒其实不是“它很快”,而是:它很快,但它要求你对数据语义足够清醒。
它最强的场景
LightGBM 最自然的优势场景,大致是这些:
- 样本量很大,达到几十万、几百万甚至更高;
- 特征很多而且很稀疏;
- 训练吞吐和内存占用是主要矛盾;
- 任务属于 CTR、推荐、搜索排序、广告、风控宽表等典型工业问题;
- 需要快速完成大量实验迭代。
很多时候,LightGBM 的价值甚至不止体现在最终指标,而是体现在你可以更快跑完实验、调完参数、筛完特征。
误解与边界:快,不等于自动省心
关于 LightGBM,最常见的误解包括:
- “原生支持类别特征,就等于可以直接吃任意字符串列。” 实际上它仍然要求合理的整数编码。
- “leaf-wise 一定全面优于 level-wise。” 更准确的说法是:它通常更能压低 loss,但也更容易过拟合。
- “GOSS 就是 subsample 的别名。” 不是,它本质上是“保留难样本 + 重加权”。
- “高基数类别天然适合 LightGBM 的 native categorical。” 这件事必须谨慎。
- “
zero_as_missing只是个小开关。” 实际上它可能直接改变数据语义。
它的边界也很清楚:小数据上它并不总是最省心,尤其当验证协议、num_leaves 和正则约束没有控制好时,过拟合会来得更快。
一句话总结
LightGBM 最像“为大规模工业表格学习设计的高吞吐 boosting 系统”。它的优势中心是速度、内存和宽表适配,而不是更稳定。
CatBoost:把类别特征与目标泄漏问题一起重写
把三者放在一起看,CatBoost 的辨识度是最高的。它最有价值的地方,并不只是支持类别特征,而是像 CatBoost: unbiased boosting with categorical features 这篇论文强调的那样:它把类别特征处理与 boosting 本身的偏差问题,放到了同一个设计原则下重做。
它的问题意识为什么和另外两家不同
很多人第一次接触 CatBoost 时,只记住了它很擅长处理 categorical feature。这当然没错,但还不够。CatBoost 真正不同的地方在于,它并不是先问怎么更高效地切分类别,而是先问:训练阶段的统计量会不会把目标信息泄漏回输入?
这让它的关注点天然和另外两家不同。XGBoost 更强调目标完整性与可控性,LightGBM 更强调吞吐、内存与宽表效率,而 CatBoost 从一开始就在认真处理 prediction shift 与 target leakage。
第一层:ordered boosting 处理 prediction shift
传统 GBDT 在每一轮训练时,会使用当前模型在训练集上的残差或梯度。问题在于,这些残差本身已经受到同一批训练样本标签的影响,于是训练阶段和测试阶段看到的统计结构并不完全一致。CatBoost 把这种偏差称为 prediction shift。
它的解决思路是 ordered boosting:先对训练样本做随机排列;对于某个样本,在第 $t$ 轮中只使用排列里它之前的样本信息来构造训练统计量。直观上,就是尽量让训练样本更像真正的新样本。
这里需要补一个边界:CatBoost 官方参数里区分 Ordered 与 Plain 两种 boosting 类型,默认行为会受 CPU/GPU、样本规模和任务类型影响。因此,更准确的说法应当是:ordered boosting 是 CatBoost 的代表性机制,但不等于任何配置下都默认启用。
第二层:ordered target statistics 避开 target leakage
类别特征处理里最容易踩的坑,就是 target leakage。普通 target encoding 如果直接在全训练集上计算类别目标均值,那么当前样本自己的标签就会泄漏回自己的特征表示。
CatBoost 的 ordered target statistics 通过“只用当前样本之前的数据”来缓解这个问题。一个直观写法是:
\[\text{CTR}_i = \frac{\text{countInClass}_{<i} + \text{prior}}{\text{totalCount}_{<i} + 1}\]这里 $<i$ 表示只使用排列中当前样本之前出现的记录。它的意义非常明确:当前样本自己的标签不会泄漏进自己的编码里。
更进一步,CatBoost 还会构造类别组合特征。这让它对 user_id × item_id、city × device、ad_slot × hour 这类交互特别敏感,也解释了它为什么在高基数类别任务上经常表现得很自然。
第三层:SymmetricTree 让它拥有极强辨识度
CatBoost 的经典默认树结构是 SymmetricTree(也常被称为 oblivious tree)。它的特点是:同一层所有节点都使用同一个分裂条件,因此深度为 $d$ 的树会有 $2^d$ 个叶子。
这种结构带来三件事:
- 推理路径规整,在线预测通常很快;
- 结构更规则,自带一定正则化效果;
- 表达能力也会受到约束,并不是只赚不亏。
当前官方参数文档里,CatBoost 已经支持 grow_policy = SymmetricTree / Depthwise / Lossguide。因此,准确说法应当是:CatBoost 的经典默认形态来自对称树,但它并不只支持对称树。
时间与文本:has_time 和内置文本管线的真实意义
CatBoost 文档里还有两个很值得工业读者注意的点。
第一个是 has_time。如果数据天然有时间顺序,那么你未必希望训练阶段随意打乱样本,再去构造类别统计量。否则,很多未来信息就可能通过编码顺序或交叉验证流程回流进训练过程。has_time 的意义,正是在提醒你:顺序本身也是数据结构的一部分。
第二个是它的文本特征管线:tokenizers -> dictionaries -> feature calcers -> numerical features -> boosting。它支持的特征计算器包括 BoW、NaiveBayes、BM25 等。这很实用,因为很多表格任务确实会混入短文本字段、搜索词、标题、标签描述等输入。
但边界同样必须说清楚:CatBoost 的 text support 不是树模型版 BERT,而是把经典文本统计特征工程内置到了 boosting 系统里。
它最强的场景
CatBoost 最值得优先想到的场景,大致是下面这些:
- 类别特征很多,而且不少还是高基数类别;
- 用户 ID、商品 ID、设备、地域、渠道、广告位这类离散字段非常强;
- 不想自己手工写大量 target encoding / count encoding / cross feature 工程;
- 数据类型异质,数值、类别和少量文本并存;
- 希望少做预处理,快速拿到强 baseline。
误解与边界:擅长类别,不等于对所有表都最优
关于 CatBoost,最常见的误解包括:
- “CatBoost 只是自动 target encoding。” 实际上 ordered principle 同时作用在编码和 boosting 两层。
- “CatBoost 一定默认用 ordered boosting。” 这取决于当前配置与训练后端。
- “CatBoost 只能训练对称树。” 当前官方文档已经不是这样。
- “有了 CatBoost,就不用关心时序泄漏。” 仍然要做正确的时间切分。
- “CatBoost 的文本支持等于深度语义建模。” 不是,它仍然属于树模型语境下的文本特征工程。
它的边界也很清楚:在纯数值、超大规模、训练吞吐优先的任务里,LightGBM 往往更有吸引力;而当类别特征并不多时,CatBoost 的核心优势也未必能完全释放。
一句话总结
CatBoost 的真正价值,不是“也能吃类别特征”,而是把避免目标泄漏上升成了统一设计原则,并把这件事落实到类别编码和 boosting 训练过程里。
三条路线:它们究竟在优化什么
如果把三者的差异压缩到最核心的层面,可以概括成下面这张表。
| 模型 | 设计中心 | 树生长策略 | 类别特征处理 | 速度/内存 | 默认稳健性 | 最适合的任务 | 主要代价 |
|---|---|---|---|---|---|---|---|
| XGBoost | 通用 boosting、显式正则、目标灵活 | 较保守,常用 depth-wise | 支持 one-hot 和 partition split,但不是设计中心 | 中等偏稳 | 高 | 数值为主的表格、缺失值较多、需要稳健 baseline 或特殊 objective | 大规模宽表上吞吐未必占优 |
| LightGBM | 工业吞吐、内存效率、宽表优化 | 默认 leaf-wise / best-first | 原生类别切分,但不解决 target leakage | 通常最快、最省内存 | 中等 | 百万级样本、高维稀疏宽表、CTR、推荐、排序 | 小数据更易过拟合,语义坑更多 |
| CatBoost | 类别特征建模、泄漏控制、减少手工编码 | 经典默认是 SymmetricTree | ordered target statistics / CTR 是核心优势 | 训练通常慢于 LightGBM,推理很规整 | 高 | 高基数类别、ID 特征密集、异构表格、少量文本混入 | 训练成本更高,纯数值超大规模未必最优 |
所以,三者真正代表的并不是“谁比谁更高级”,而是三种完全不同的技术立场:
- XGBoost:稳健、通用、可控;
- LightGBM:高吞吐、宽表友好、工业效率优先;
- CatBoost:类别特征建模与泄漏控制优先。
真正落地时,应该怎么选
到了工程实践里,最重要的不是背模型历史,而是形成可执行的选型原则。
- 如果特征以数值为主,希望先拿到一个稳健、可控、生态成熟的 baseline,优先试 XGBoost。
- 如果面对的是超大规模、高维、稀疏宽表,训练吞吐和内存效率是第一矛盾,优先试 LightGBM。
- 如果类别特征、ID 特征、高基数离散列非常多,而且你不想自己手工写一堆编码逻辑,优先试 CatBoost。
- 如果任务带明确时间顺序,任何模型都不能替代正确的时间切分验证。 CatBoost 的 ordered 思想很有帮助,但评估协议比模型名字更重要。
- 如果不确定谁更适合,就把三者都当成一线候选,在同一份特征、同一套交叉验证、同一评价指标下公平比较。 真正值得信的是你自己任务上的 out-of-fold 结果。
换句话说,选型的关键不是先问谁最先进,而是先问:我的表是什么样的表?我的瓶颈究竟是泛化、吞吐、类别特征,还是特征工程成本?
结语
表格数据上的竞争,从来都不是一场纯粹的模型复杂度竞赛。很多时候,决定胜负的不是谁参数更多,而是谁更贴近数据结构、谁更适合工程约束、谁能更稳定地把信号从表里提出来。
XGBoost、LightGBM 与 CatBoost 之所以至今仍然重要,不是因为它们只是 GBDT 的三个库,而是因为它们分别代表了三种非常清晰的技术立场:
- XGBoost 代表 稳健、通用、可控;
- LightGBM 代表 高吞吐、宽表友好、工业效率优先;
- CatBoost 代表 类别特征建模与泄漏控制优先。
真正成熟的工程判断,从来不是教条地说谁永远最好,而是知道:在不同的表格形态和数据分布里,更好的定义本来就不一样。
参考资料
XGBoost
- XGBoost: A Scalable Tree Boosting System
- XGBoost Tree Methods
- XGBoost Parameters
- XGBoost FAQ
- XGBoost Categorical Data
- XGBoost 3.1 Release Notes
LightGBM
- LightGBM: A Highly Efficient Gradient Boosting Decision Tree
- LightGBM Features (v4.5)
- LightGBM Advanced Topics (v4.5)