boosting集成算饭
- [GBDT(Gradient Boosting Decision Tree)](#GBDT(Gradient Boosting Decision Tree))
- [XGBoost(eXtreme Gradient Boosting)](#XGBoost(eXtreme Gradient Boosting))
- LightGBM
- CatBoost
- 总结对比
GBDT(Gradient Boosting Decision Tree)
GBDT是一种基于决策树的集成学习算法,采用负梯度来表示损失函数。其核心思想是每一轮迭代都训练一个新的弱学习器(通常是决策树),来拟合当前模型的负梯度(即残差)。
损失函数
假设我们有一个损失函数 L ( y , F ( x ) ) L(y, F(x)) L(y,F(x)),其中 y y y是真实值, F ( x ) F(x) F(x)是模型的预测值。我们的目标是最小化这个损失函数:
min F E x , y [ L ( y , F ( x ) ) ] \min_{F} \mathbb{E}_{x, y}[L(y, F(x))] FminEx,y[L(y,F(x))]
在梯度提升中,我们通过逐步添加基学习器(通常是决策树)来构建模型。每一步,我们添加一个新的基学习器 h t ( x ) h_t(x) ht(x)来改进当前的模型 F t − 1 ( x ) F_{t-1}(x) Ft−1(x):
F t ( x ) = F t − 1 ( x ) + α t h t ( x ) F_t(x) = F_{t-1}(x) + \alpha_t h_t(x) Ft(x)=Ft−1(x)+αtht(x)
其中, α t \alpha_t αt是学习率,控制每一步的步长。
梯度下降
为了找到最优的 h t ( x ) h_t(x) ht(x),我们可以使用梯度下降的方法。具体来说,我们希望 h t ( x ) h_t(x) ht(x)能够最大程度地减少损失函数 L ( y , F t − 1 ( x ) + h t ( x ) ) L(y, F_{t-1}(x) + h_t(x)) L(y,Ft−1(x)+ht(x))。我们可以对损失函数进行泰勒展开,保留一阶项:
L ( y , F t − 1 ( x ) + h t ( x ) ) ≈ L ( y , F t − 1 ( x ) ) + ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) h t ( x ) L(y, F_{t-1}(x) + h_t(x)) \approx L(y, F_{t-1}(x)) + \frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} h_t(x) L(y,Ft−1(x)+ht(x))≈L(y,Ft−1(x))+∂Ft−1(x)∂L(y,Ft−1(x))ht(x)
为了最小化这个近似损失函数,我们需要选择 h t ( x ) h_t(x) ht(x)使得:
h t ( x ) = − ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) h_t(x) = -\frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} ht(x)=−∂Ft−1(x)∂L(y,Ft−1(x))
L ( y , F t − 1 ( x ) + h t ( x ) ) ≈ L ( y , F t − 1 ( x ) ) − ( ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) ) 2 L(y, F_{t-1}(x) + h_t(x)) \approx L(y, F_{t-1}(x)) - \left( \frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} \right)^2 L(y,Ft−1(x)+ht(x))≈L(y,Ft−1(x))−(∂Ft−1(x)∂L(y,Ft−1(x)))2
通过选择 h t ( x ) = − ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) h_t(x) = -\frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} ht(x)=−∂Ft−1(x)∂L(y,Ft−1(x)),我们可以最大程度地减少损失函数。
负梯度的意义
因此,GBDT 在每一步中,基学习器 h t ( x ) h_t(x) ht(x)的目标是拟合当前模型的负梯度。具体来说,我们计算当前模型的负梯度:
r t , i = − ∂ L ( y i , F t − 1 ( x i ) ) ∂ F t − 1 ( x i ) r_{t,i} = -\frac{\partial L(y_i, F_{t-1}(x_i))}{\partial F_{t-1}(x_i)} rt,i=−∂Ft−1(xi)∂L(yi,Ft−1(xi))
然后,我们训练一个新的基学习器 h t ( x ) h_t(x) ht(x)来拟合这些负梯度 r t , i r_{t,i} rt,i。这样,新的模型 F t ( x ) F_t(x) Ft(x)可以表示为:
F t ( x ) = F t − 1 ( x ) + α t h t ( x ) F_t(x) = F_{t-1}(x) + \alpha_t h_t(x) Ft(x)=Ft−1(x)+αtht(x)
数学证明
为了更严格地证明这一点,我们可以考虑损失函数 L ( y , F ( x ) ) L(y, F(x)) L(y,F(x))的梯度下降过程。我们希望找到 h t ( x ) h_t(x) ht(x)使得:
F t ( x ) = F t − 1 ( x ) + α t h t ( x ) F_t(x) = F_{t-1}(x) + \alpha_t h_t(x) Ft(x)=Ft−1(x)+αtht(x)
能够最大程度地减少损失函数。我们可以对损失函数进行泰勒展开,保留一阶项:
L ( y , F t − 1 ( x ) + α t h t ( x ) ) ≈ L ( y , F t − 1 ( x ) ) + α t ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) h t ( x ) L(y, F_{t-1}(x) + \alpha_t h_t(x)) \approx L(y, F_{t-1}(x)) + \alpha_t \frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} h_t(x) L(y,Ft−1(x)+αtht(x))≈L(y,Ft−1(x))+αt∂Ft−1(x)∂L(y,Ft−1(x))ht(x)
为了最小化这个近似损失函数,我们需要选择 h t ( x ) h_t(x) ht(x)使得:
h t ( x ) = − ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) h_t(x) = -\frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} ht(x)=−∂Ft−1(x)∂L(y,Ft−1(x))
这样,新的模型 F t ( x ) F_t(x) Ft(x)可以表示为:
F t ( x ) = F t − 1 ( x ) − α t ∂ L ( y , F t − 1 ( x ) ) ∂ F t − 1 ( x ) F_t(x) = F_{t-1}(x) - \alpha_t \frac{\partial L(y, F_{t-1}(x))}{\partial F_{t-1}(x)} Ft(x)=Ft−1(x)−αt∂Ft−1(x)∂L(y,Ft−1(x))
这正是梯度下降的更新公式。
树模型与分裂方法
GBDT使用回归树(CART)作为基学习器,分裂时通常采用贪心算法,选择使损失函数下降最多的特征和分割点。分裂标准可以是MSE或Gini系数。
小结
GBDT 采用负梯度来表示损失函数的原因是为了利用梯度下降的方法,逐步优化模型。每一步,基学习器 h t ( x ) h_t(x) ht(x)的目标是拟合当前模型的负梯度,从而最大程度地减少损失函数。这种方法不仅理论上有坚实的基础,而且在实际应用中也表现出色。
XGBoost(eXtreme Gradient Boosting)
XGBoost是GBDT的改进版本,引入了正则化项和二阶导数信息,提升了效率和精度。其核心思想是通过逐步添加决策树来最小化损失函数。XGBoost 的损失函数由两部分组成:损失函数(Loss Function)和正则化项(Regularization Term)。
损失函数(Loss Function)
假设我们有一个数据集 D = { ( x i , y i ) } i = 1 n D = \{(x_i, y_i)\}_{i=1}^n D={(xi,yi)}i=1n,其中 x i x_i xi是特征向量, y i y_i yi是标签。XGBoost 的目标是通过逐步添加决策树来最小化以下损失函数:
L ( ϕ ) = ∑ i = 1 n l ( y i , y ^ i ) + ∑ k = 1 K Ω ( f k ) \mathcal{L}(\phi) = \sum_{i=1}^n l(y_i, \hat{y}i) + \sum{k=1}^K \Omega(f_k) L(ϕ)=i=1∑nl(yi,y^i)+k=1∑KΩ(fk)
其中:
- y ^ i \hat{y}_i y^i是第 i i i个样本的预测值。
- l ( y i , y ^ i ) l(y_i, \hat{y}_i) l(yi,y^i)是损失函数,衡量预测值 y ^ i \hat{y}_i y^i与真实值 y i y_i yi之间的差异。
- f k f_k fk是第 k k k棵决策树。
- Ω ( f k ) \Omega(f_k) Ω(fk)是正则化项,用于控制模型的复杂度,防止过拟合。
正则化项(Regularization Term)
正则化项 Ω ( f k ) \Omega(f_k) Ω(fk)通常包括两部分:叶子节点的权重和叶子节点的数量。具体形式如下:
Ω ( f k ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_k) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 Ω(fk)=γT+21λj=1∑Twj2
其中:
- T T T是叶子节点的数量。
- w j w_j wj是第 j j j个叶子节点的权重。
- γ \gamma γ和 λ \lambda λ是正则化参数,用于控制模型的复杂度。
损失函数的具体形式
XGBoost 使用二阶泰勒展开来近似损失函数,从而简化优化过程。具体来说,对于第 t t t次迭代,损失函数可以表示为:
L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) \mathcal{L}^{(t)} = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) L(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)
对 l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) l(yi,y^i(t−1)+ft(xi))进行二阶泰勒展开:
l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) ≈ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) \approx l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) l(yi,y^i(t−1)+ft(xi))≈l(yi,y^i(t−1))+gift(xi)+21hift2(xi)
其中:
- g i = ∂ l ( y i , y ^ i ( t − 1 ) ) ∂ y ^ i ( t − 1 ) g_i = \frac{\partial l(y_i, \hat{y}_i^{(t-1)})}{\partial \hat{y}_i^{(t-1)}} gi=∂y^i(t−1)∂l(yi,y^i(t−1))是损失函数的一阶导数。
- h i = ∂ 2 l ( y i , y ^ i ( t − 1 ) ) ∂ ( y ^ i ( t − 1 ) ) 2 h_i = \frac{\partial^2 l(y_i, \hat{y}_i^{(t-1)})}{\partial (\hat{y}_i^{(t-1)})^2} hi=∂(y^i(t−1))2∂2l(yi,y^i(t−1))是损失函数的二阶导数。
将泰勒展开代入损失函数:
L ( t ) ≈ ∑ i = 1 n [ l ( y i , y ^ i ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \mathcal{L}^{(t)} \approx \sum_{i=1}^n \left[ l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \Omega(f_t) L(t)≈i=1∑n[l(yi,y^i(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)
忽略常数项 l ( y i , y ^ i ( t − 1 ) ) l(y_i, \hat{y}_i^{(t-1)}) l(yi,y^i(t−1)),损失函数简化为:
L ( t ) ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \mathcal{L}^{(t)} \approx \sum_{i=1}^n \left[ g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right] + \Omega(f_t) L(t)≈i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft)
优化目标
为了最小化损失函数,我们需要找到最优的 f t f_t ft。假设 f t f_t ft将样本 x i x_i xi映射到叶子节点 j j j,即 f t ( x i ) = w q ( x i ) f_t(x_i) = w_{q(x_i)} ft(xi)=wq(xi),其中 q ( x i ) q(x_i) q(xi)是样本 x i x_i xi被分配到的叶子节点, w q ( x i ) w_{q(x_i)} wq(xi)是该叶子节点的权重。
将 f t ( x i ) f_t(x_i) ft(xi)代入损失函数:
L ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 \mathcal{L}^{(t)} \approx \sum_{i=1}^n \left[ g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2 \right] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 L(t)≈i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1∑Twj2
将损失函数按叶子节点分组:
L ( t ) ≈ ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T \mathcal{L}^{(t)} \approx \sum_{j=1}^T \left[ \left( \sum_{i \in I_j} g_i \right) w_j + \frac{1}{2} \left( \sum_{i \in I_j} h_i + \lambda \right) w_j^2 \right] + \gamma T\\ =\sum_{j=1}^T \left[G_{j}w_{j}+\frac{1}{2}(H_{j}+\lambda)w_{j}^{2} \right] + \gamma T L(t)≈j=1∑T i∈Ij∑gi wj+21 i∈Ij∑hi+λ wj2 +γT=j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
其中 I j I_j Ij是分配到第 j j j个叶子节点的样本集合, G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h i G_{j}=\sum_{i \in I_j} g_i,H_{j}=\sum_{i \in I_j} h_i Gj=∑i∈Ijgi,Hj=∑i∈Ijhi。为了最小化 L ( t ) \mathcal{L}^{(t)} L(t),对 w j w_j wj求导并令导数为零:
∂ L ( t ) ∂ w j = G j + ( H i + λ ) w j = 0 \frac{\partial \mathcal{L}^{(t)}}{\partial w_j} = G_{j} + \left( H_{i}+ \lambda \right) w_j = 0 ∂wj∂L(t)=Gj+(Hi+λ)wj=0
解得最优的 w j w_j wj:
w j ∗ = − G i H i + λ w_j^* = - \frac{G_{i}}{H_{i}+ \lambda} wj∗=−Hi+λGi
将 w j ∗ w_j^* wj∗代入损失函数,得到最小化后的损失函数值:
L ( t ) = − 1 2 ∑ j = 1 T G i 2 H i + λ + γ T \mathcal{L}^{(t)} = - \frac{1}{2} \sum_{j=1}^T \frac{G_{i}^2}{H_{i} + \lambda} + \gamma T L(t)=−21j=1∑THi+λGi2+γT
树模型与分裂方法
XGBoost同样使用CART树,但分裂时采用近似算法(如分位数划分)加速计算。分裂增益公式为:
G = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ \mathcal{G} = \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 G=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
其中, G G G和 H H H分别是一阶和二阶导数。
小结
XGBoost 的损失函数由两部分组成:损失函数和正则化项。通过二阶泰勒展开和优化,XGBoost 能够高效地找到最优的决策树结构,从而逐步提升模型的预测性能。正则化项的引入有效防止了过拟合,使得模型具有更好的泛化能力。
参考:xgboost链接
LightGBM
LightGBM针对大规模数据优化,通过直方图算法和单边梯度采样(GOSS)减少计算量。
数学表达
目标函数与XGBoost类似,但引入了GOSS和EFB(互斥特征捆绑)技术。GOSS保留梯度大的样本,随机采样梯度小的样本:
V j ( d ) = 1 n ( ∑ x i ∈ A g i + 1 − a b ∑ x i ∈ B g i ) \mathcal{V}j(d) = \frac{1}{n} \left( \sum{x_i \in A} g_i + \frac{1-a}{b} \sum_{x_i \in B} g_i \right) Vj(d)=n1(xi∈A∑gi+b1−axi∈B∑gi)
其中, A A A是梯度大的样本, B B B是随机采样的梯度小的样本。
树模型与分裂方法
LightGBM使用直方图算法,将连续特征离散化为桶,分裂时基于直方图计算增益。支持leaf-wise生长策略,优先分裂增益最大的叶子节点。
LightGBM(Light Gradient Boosting Machine)概述
| 项目 | 关键点 |
|---|---|
| 核心算法 | 基于 梯度提升树(GBDT) 的框架,采用 直方图(Histogram) 近似来加速特征分裂。 |
| 特征离散化 | 连续特征先划分为 k 个 bin(默认 255),在每个 bin 中累计统计量(梯度、二阶梯度),再在离散化后的柱状图上寻找最优切分点,显著降低内存和计算复杂度[[1]][[2]]。 |
| 树的生长策略 | Leaf‑wise(叶子优先) 生长:每次在当前增益最大的叶子上继续分裂,能够得到更深、更精细的树结构;为防止过拟合,通常通过 max_depth 、num_leaves 等参数限制叶子数量[[3]][[4]]。 |
| 采样与特征压缩 | - GOSS(Gradient‑Based One‑Side Sampling) :保留梯度大的样本,随机抽取梯度小的样本,显著减少训练样本量而不损失太多信息[[5]][[6]]。 - EFB(Exclusive Feature Bundling):将互斥(不同时出现)的稀疏特征捆绑为一个特征,进一步降低维度[[7]]。 |
| 类别特征支持 | 直接接受 categorical_feature,内部会把同一类别映射为离散的 bin,无需手动 one‑hot,提升效率并减少内存占用[[8]][[9]]。 |
| 并行化 | 同时支持 特征并行 (不同特征的直方图并行构建)和 数据并行 (不同数据块并行计算),通信开销极小,适合 大规模分布式 环境[[10]][[11]]。 |
| 正则化 | 通过 lambda_l1、lambda_l2 实现 L1/L2 正则,亦支持 DART(Dropout‑like) 随机丢弃树以提升鲁棒性[[12]]。 |
| 优势 | - 训练速度快(相同硬件下常比 XGBoost 快 5‑10 倍)[[13]] - 内存占用低(直方图压缩)[[14]] - 对大数据、稀疏特征、类别特征友好[[15]] - 支持 GOSS、EFB 等加速采样技术[[16]] |
| 劣势 | - 叶子优先生长在 极端深树 时可能导致 过拟合 ,需要调参限制叶子数 - 对 极小数据集 或 对模型精度要求极高 的场景,可能略逊于 XGBoost(默认参数下)[[17]] |
XGBoost(eXtreme Gradient Boosting)概述
| 项目 | 关键点 |
|---|---|
| 核心算法 | 同样基于 GBDT,但在每轮迭代中使用 预排序(pre‑sorted) 或 近似直方图(可选)来寻找最佳切分点。 |
| 树的生长策略 | Level‑wise(层级) 生长:每层同时分裂所有叶子,得到相对平衡的树结构,防止单棵树过深。 |
| 特征分裂 | 预排序需要为每个特征保存 排序索引 ,在遍历所有可能切分点时计算增益,精度更高但 内存占用大 、计算成本高 。 |
| 缺失值处理 | 通过 默认方向(default direction)在分裂时决定缺失值走向,需手动指定或使用默认策略。 |
| 正则化 | 在目标函数中显式加入 L1/L2 正则 (alpha、lambda),对叶子权重进行约束。 |
| 并行化 | 支持 特征并行 (列块)和 数据并行,但在特征并行时仍需同步排序信息,通信开销相对较大。 |
| 优势 | - 对 小/中等规模数据 、高精度需求 场景表现稳健 - 支持 多种自定义目标函数 与 评估指标 - 参数丰富,调参空间大,能细粒度控制模型复杂度 |
| 劣势 | - 内存消耗 与 训练时间 较高,尤其在 大规模稠密特征 下表现不佳 - 不直接支持类别特征,需要手动 one‑hot 或 label‑encode |
LightGBM 与 XGBoost 的核心区别
| 维度 | LightGBM | XGBoost |
|---|---|---|
| 特征分裂方式 | Histogram(直方图) :先离散化为 bin,累计统计后在离散值上遍历切分点,计算复杂度 O(k·num_bins),内存占用低 | Pre‑sorted :对每个特征完整排序,遍历所有切分点,计算复杂度 O(num_samples·log num_samples),内存占用高 |
| 树生长策略 | Leaf‑wise(按增益最大叶子继续分裂),能更快降低损失,但需限制叶子数防止过拟合 | Level‑wise(层级生长),树更平衡,天然防止过深树导致的过拟合 |
| 采样/特征压缩 | GOSS (梯度采样)+ EFB(互斥特征捆绑),显著提升大数据训练速度[[28]][[29]] | 主要依赖 列抽样 (colsample_bytree)和 行抽样(subsample),没有专门的梯度采样机制 |
| 类别特征 | 原生支持 categorical_feature,无需 one‑hot,内部自动离散化 | 需要手动 one‑hot 或 label‑encode,不直接支持 |
| 并行方式 | 同时支持 特征并行 与 数据并行 ,通信开销更小,适合 分布式大规模 训练 | 支持特征并行和数据并行,但在特征并行时需同步排序信息,通信成本相对更高 |
| 速度 & 内存 | 训练速度快 5‑10 倍 ,内存占用约 1/3(相对 XGBoost) | 速度相对慢,内存占用大,尤其在 预排序 模式下 |
| 精度 | 在大多数公开数据集上 与 XGBoost 持平 ,在 类别特征 、稀疏特征 场景下甚至略有提升 | 在 小数据集 、对模型精度极端敏感 的任务上,默认参数 常能取得略高的 AUC/准确率 |
| 调参难易 | 参数较多(num_leaves、max_depth、min_data_in_leaf、feature_fraction、bagging_fraction、goss 等),但 默认配置已相当高效,上手相对容易 |
参数丰富(eta、max_depth、min_child_weight、subsample、colsample_bytree 等),调参空间大,学习曲线稍陡 |
小结
- LightGBM 通过 直方图、叶子优先、GOSS/EFB、原生类别特征 等技术,实现了 极快的训练速度、低内存占用 ,在 大规模、稀疏、含类别特征 的业务场景(如广告点击率预估、搜索排序、金融风控)中表现尤为突出。
- XGBoost 则采用 预排序 + 层级生长 ,在 小数据集 或 对模型精度要求极高 的任务(如 Kaggle 竞赛的细粒度特征工程)中仍是强有力的基准。
- 两者本质上都是 梯度提升树 ,在 目标函数、正则化 等方面保持一致;选择时主要权衡 速度/资源 与 精度/解释性 的需求。
CatBoost
模型概述
| 项目 | 关键点 |
|---|---|
| 全称 | CatBoost(Categorical Boosting) |
| 核心算法 | 基于 梯度提升树(GBDT) ,采用 对称树(symmetric tree) 结构,使每层的所有叶子在同一次分裂中同步生成,保证模型的 预测速度快且易于并行。 |
| 主要创新 | 1. 高效处理类别特征 (无需手动 one‑hot) 2. Ordered Boosting (有序提升)防止目标泄漏,提升模型的 泛化能力 3. 对称树 结构降低过拟合风险并提升 GPU/CPU 并行效率 |
| 优势 | - 原生类别特征支持 ,无需手动编码 - Ordered Boosting 有效抑制目标泄漏,尤其在小样本或高基数类别时表现突出 - 对称树结构使得 推理速度快 ,且易于部署 - 对 缺失值 自动处理,无需额外填充 |
| 劣势 | - 对 超参数 (如 depth、learning_rate、l2_leaf_reg)的调优相对敏感 - 在 极端大规模稀疏特征(> 10⁸ 行)上,训练速度略逊于 LightGBM 的直方图实现 |
CatBoost 对类别变量的处理机制
1️⃣ 直接接受类别特征(无需 one‑hot)
- 在创建
Pool(CatBoost 的数据容器)时,只需把类别列的 列索引或列名 通过cat_features参数标记,CatBoost 会把这些列视为 离散变量,内部自动完成离散化与分裂。
python
from catboost import CatBoostClassifier, Pool
cat_features = ['city', 'device_type'] # 列名或列号
train_pool = Pool(data=X_train, label=y_train,
cat_features=cat_features)
model = CatBoostClassifier(iterations=500,
learning_rate=0.05,
depth=6,
loss_function='Logloss')
model.fit(train_pool, eval_set=Pool(X_val, y_val, cat_features=cat_features))
2️⃣ Ordered Target Statistics(有序目标统计)
-
核心思想 :在每一次迭代中,对每个类别值计算 目标统计量 (如均值、概率),但统计时只使用 当前样本之前的训练数据 (即"有序"),避免使用当前样本的标签信息导致 目标泄漏 。
x ^ k i = ∑ j = 1 n [ x j = x k ] ⋅ y j + a ⋅ p ∑ j = 1 n [ x j = x k ] + a \hat{x}k^i = \frac{\sum{j=1}^n [x_j = x_k] \cdot y_j + a \cdot p}{\sum_{j=1}^n [x_j = x_k] + a} x^ki=∑j=1n[xj=xk]+a∑j=1n[xj=xk]⋅yj+a⋅p 其中, p p p是先验值, a a a是平滑参数, k k k表示排序位置。 -
具体实现:
- 将训练样本随机打乱并划分为 K 个子块(默认 4)。
- 对于子块 i ,只使用 前 i‑1 子块的数据来计算该子块中每个类别的目标统计。
- 统计结果作为 数值特征 (称为 CTR(Click‑Through Rate)特征)加入模型。
-
这种 有序统计 方式在 小样本、稀疏或高基数类别 场景下显著提升模型的 泛化能力,并且不需要额外的正则化手段来抑制过拟合。
3️⃣ 多种 CTR 计算方式
CatBoost 提供多种 CTR(Category Target Statistics) 计算方式,可通过 cat_features 参数的子选项进行配置,例如:
| CTR 类型 | 计算方式 | 适用场景 |
|---|---|---|
| Mean Target | 目标均值(回归)或正类比例(分类) | 基本使用,适用于二分类/回归 |
| Counter | 计数(出现次数) | 稀疏类别、计数特征 |
| Bucketized | 将统计值离散化为若干桶 | 防止极端值影响 |
| Feature Combination | 多列类别组合的统计 | 捕捉交叉效应 |
用户可以在 CatBoostParams 中通过 cat_features 或 ctr_description 自定义这些统计方式。
4️⃣ 缺失值的天然兼容
- 类别列中的缺失值(
NaN、空字符串等)会被视为 单独的类别,参与 CTR 统计,无需额外填充或删除。
5️⃣ 对称树与类别特征的协同
- CatBoost 的 对称树 (每层所有叶子在同一次分裂中同步生成)使得 每一次分裂只使用同一组 CTR 特征 ,从而保持树结构的 平衡性 与 解释性。
- 对称树的这种结构在处理 高基数类别 时尤为高效,因为每层只需一次 全局排序(基于 CTR)即可决定分裂点,避免了对每个类别单独遍历的开销。
小结
- CatBoost 通过 有序目标统计(Ordered CTR) 、对称树结构 与 原生类别特征标记 ,实现了 无需手动 one‑hot 、防止目标泄漏 、高效且稳健 的类别特征处理。
- 与 LightGBM、XGBoost 相比,CatBoost 在 小样本、稀疏或高基数类别 场景下往往表现更好,且对缺失值的兼容性更强。
总结对比
- 树模型:GBDT和XGBoost使用CART树,LightGBM和CatBoost使用直方图和对称树。
- 分裂方法:XGBoost和LightGBM采用近似算法,CatBoost通过有序提升优化梯度计算。
- 特征处理:CatBoost直接支持类别特征,LightGBM通过EFB减少特征维度。