集成模型:gbdt,xgboost,lightgbm,catboost

boosting集成算饭

  • [GBDT(Gradient Boosting Decision Tree)](#GBDT(Gradient Boosting Decision Tree))
  • [XGBoost(eXtreme Gradient Boosting)](#XGBoost(eXtreme Gradient Boosting))
  • LightGBM
    • 数学表达
    • 树模型与分裂方法
    • [LightGBM(Light Gradient Boosting Machine)概述](#LightGBM(Light Gradient Boosting Machine)概述)
    • [XGBoost(eXtreme Gradient Boosting)概述](#XGBoost(eXtreme Gradient Boosting)概述)
    • [LightGBM 与 XGBoost 的核心区别](#LightGBM 与 XGBoost 的核心区别)
    • 小结
  • CatBoost
    • 模型概述
    • [CatBoost 对类别变量的处理机制](#CatBoost 对类别变量的处理机制)
      • [1️⃣ 直接接受类别特征(无需 one‑hot)](#1️⃣ 直接接受类别特征(无需 one‑hot))
      • [2️⃣ Ordered Target Statistics(有序目标统计)](#2️⃣ Ordered Target Statistics(有序目标统计))
      • [3️⃣ 多种 CTR 计算方式](#3️⃣ 多种 CTR 计算方式)
      • [4️⃣ 缺失值的天然兼容](#4️⃣ 缺失值的天然兼容)
      • [5️⃣ 对称树与类别特征的协同](#5️⃣ 对称树与类别特征的协同)
    • 小结
  • 总结对比

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_depthnum_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 正则alphalambda),对叶子权重进行约束。
并行化 支持 特征并行 (列块)和 数据并行,但在特征并行时仍需同步排序信息,通信开销相对较大。
优势 - 对 小/中等规模数据高精度需求 场景表现稳健 - 支持 多种自定义目标函数评估指标 - 参数丰富,调参空间大,能细粒度控制模型复杂度
劣势 - 内存消耗训练时间 较高,尤其在 大规模稠密特征 下表现不佳 - 不直接支持类别特征,需要手动 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‑hotlabel‑encode,不直接支持
并行方式 同时支持 特征并行数据并行 ,通信开销更小,适合 分布式大规模 训练 支持特征并行和数据并行,但在特征并行时需同步排序信息,通信成本相对更高
速度 & 内存 训练速度快 5‑10 倍内存占用约 1/3(相对 XGBoost) 速度相对慢,内存占用大,尤其在 预排序 模式下
精度 在大多数公开数据集上 与 XGBoost 持平 ,在 类别特征稀疏特征 场景下甚至略有提升 小数据集对模型精度极端敏感 的任务上,默认参数 常能取得略高的 AUC/准确率
调参难易 参数较多(num_leavesmax_depthmin_data_in_leaffeature_fractionbagging_fractiongoss 等),但 默认配置已相当高效,上手相对容易 参数丰富(etamax_depthmin_child_weightsubsamplecolsample_bytree 等),调参空间大,学习曲线稍陡

小结

  • LightGBM 通过 直方图、叶子优先、GOSS/EFB、原生类别特征 等技术,实现了 极快的训练速度、低内存占用 ,在 大规模、稀疏、含类别特征 的业务场景(如广告点击率预估、搜索排序、金融风控)中表现尤为突出。
  • XGBoost 则采用 预排序 + 层级生长 ,在 小数据集对模型精度要求极高 的任务(如 Kaggle 竞赛的细粒度特征工程)中仍是强有力的基准。
  • 两者本质上都是 梯度提升树 ,在 目标函数、正则化 等方面保持一致;选择时主要权衡 速度/资源精度/解释性 的需求。

CatBoost

模型概述

项目 关键点
全称 CatBoost(Categorical Boosting)
核心算法 基于 梯度提升树(GBDT) ,采用 对称树(symmetric tree) 结构,使每层的所有叶子在同一次分裂中同步生成,保证模型的 预测速度快且易于并行
主要创新 1. 高效处理类别特征 (无需手动 one‑hot) 2. Ordered Boosting (有序提升)防止目标泄漏,提升模型的 泛化能力 3. 对称树 结构降低过拟合风险并提升 GPU/CPU 并行效率
优势 - 原生类别特征支持 ,无需手动编码 - Ordered Boosting 有效抑制目标泄漏,尤其在小样本或高基数类别时表现突出 - 对称树结构使得 推理速度快 ,且易于部署 - 对 缺失值 自动处理,无需额外填充
劣势 - 对 超参数 (如 depthlearning_ratel2_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表示排序位置。

  • 具体实现:

    1. 将训练样本随机打乱并划分为 K 个子块(默认 4)。
    2. 对于子块 i ,只使用 前 i‑1 子块的数据来计算该子块中每个类别的目标统计。
    3. 统计结果作为 数值特征 (称为 CTR(Click‑Through Rate)特征)加入模型。
  • 这种 有序统计 方式在 小样本、稀疏或高基数类别 场景下显著提升模型的 泛化能力,并且不需要额外的正则化手段来抑制过拟合。

3️⃣ 多种 CTR 计算方式

CatBoost 提供多种 CTR(Category Target Statistics) 计算方式,可通过 cat_features 参数的子选项进行配置,例如:

CTR 类型 计算方式 适用场景
Mean Target 目标均值(回归)或正类比例(分类) 基本使用,适用于二分类/回归
Counter 计数(出现次数) 稀疏类别、计数特征
Bucketized 将统计值离散化为若干桶 防止极端值影响
Feature Combination 多列类别组合的统计 捕捉交叉效应

用户可以在 CatBoostParams 中通过 cat_featuresctr_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减少特征维度。
相关推荐
d111111111d2 小时前
编码器测速详情解释:PID闭环控制
笔记·stm32·单片机·嵌入式硬件·学习·算法
麒qiqi2 小时前
【Linux 进程间通信】信号通信与共享内存核心解析
java·linux·算法
Piar1231sdafa2 小时前
【计算机视觉】YOLO11-DGCST:轴承表面划痕检测新方案
人工智能·计算机视觉
肆悟先生2 小时前
3.15 引用类型
c++·算法
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商的UCS主要有什么作用呢?
人工智能·自然语言处理·华为云·云计算
中维ZWPD2 小时前
打破工业软件分类桎梏:ZWPD的实践探索与创新突破
人工智能·3d·流程图
极客BIM工作室2 小时前
让AI自动“造房间”:SpatialGen是什么?
人工智能
serve the people2 小时前
TensorFlow 2.0 手写数字分类教程
人工智能·分类·tensorflow
free-elcmacom2 小时前
机器学习高阶教程<7>Transformer原理全景解读:从“序列困境”到“注意力革命”
人工智能·python·机器学习·transformer