boosting_type 是 LightGBM 最核心的参数之一,决定了模型的训练方式和数据利用策略。下面详细介绍每种类型的算法原理、优缺点和适用场景。

1. gbdt (Gradient Boosting Decision Tree) - 默认值

算法原理:

  • 最经典的梯度提升树
  • 每轮迭代:用全部样本计算梯度 → 训练一棵新树 → 拟合负梯度方向
  • 树的生长策略:Leaf-wise(叶子节点分裂),即每轮找到所有叶子中增益最大的叶子进行分裂

核心流程:

1. 初始化模型(如均值)

2. 计算所有样本的负梯度(残差)

3. 用全部样本构建一颗决策树来拟合残差

4. 更新模型:新模型 = 旧模型 + 学习率 × 新树

5. 重复 2-4 步,直到达到最大迭代次数

优点:

  • 准确率最高(相比其他 boosting_type)
  • 对所有样本公平

缺点:

  • 计算开销大(每轮都要用全部样本)
  • 训练速度慢(大数据集)

适用场景:

  • 中小数据集(< 10万行)
  • 对精度要求极高的场景
  • 需要完整梯度信息的情况

2. goss (Gradient-based One-Side Sampling)

算法原理(核心创新):

  • 每轮迭代时,只使用部分样本来训练树
  • 采样策略
    • 按梯度绝对值降序排列所有样本
    • 保留 top a% 的大梯度样本(通常 a=20%)
    • 从剩下的 b% 中随机采样(通常 b=20%)
    • 对采样的小梯度样本乘以权重 (1-a)/b 进行补偿

数学解释:

设 a = 0.2, b = 0.2
训练数据 = 全部大梯度样本(20%) + 全部小梯度采样(20% × 80% = 16%)
实际使用样本 = 20% + 16% = 36%
小梯度样本权重 = (1-0.2)/0.2 = 4(补偿损失信息)

优点:

  • 训练速度极快(通常只用 30%~50% 的样本)
  • 精度损失很小(通过权重补偿)
  • 内存占用低

缺点:

  • 超参数 top_rate 和 other_rate 需要调参
  • 当样本量极小时效果略差

适用场景:

  • 大数据集(> 100万行)
  • 训练时间受限的环境
  • 快速迭代实验

3. dart (Dropouts meet Multiple Additive Regression Trees)

算法原理(结合 Dropout):

  • 每轮迭代时,不是只训练一棵新树
  • 而是:随机丢弃之前训练的一部分树 → 计算缺失梯度 → 训练新树补全
  • 灵感来自深度学习的 Dropout 机制

核心流程:

1. 第 t 轮:已有 t-1 棵树

2. 随机选择一定比例(drop_rate)的树,暂时移除

3. 计算这些树被移除后的"新残差"

4. 训练新树来拟合这个"新残差"

5. 将新树加入模型,并缩放学习率

优点:

  • 极强的防过拟合能力
  • 在浅层树上表现优于 GBDT
  • 模型泛化能力更强

缺点:

  • 训练速度比 gbdt 慢 20%~50%(需要额外的计算)
  • 超参数多(drop_ratemax_dropskip_drop 等)
  • 小数据集上可能不如 GBDT

适用场景:

  • 过拟合严重的情况
  • 数据集较小但特征多
  • 需要正则化强度大的场景

如果选择场景1,其与XGBOOST训练的核心差异还有哪些?

1. 树的生长策略:Leaf-wise vs Level-wise (最核心差异)

这是两者最本质的区别,直接决定了模型的形状和效率。

  • XGBoost (Level-wise / 按层生长)

    • 逻辑:每一层树分裂时,同时分裂这一层上所有的叶子节点。
    • 图解:像盖楼,必须盖完第 1 层的所有房间,才能盖第 2 层。
    • 缺点:很多叶子节点的分裂增益很小,甚至可能是负增益(过拟合),但为了保持树的层级平衡,XGBoost 依然会进行无用的分裂计算。
    • 优点:由于同一层的特征计算可以并行化,Level-wise 容易进行多线程优化。
  • LightGBM (Leaf-wise / 按叶子生长)

    • 逻辑:每次迭代,只选择当前所有叶子中增益最大的那一个叶子进行分裂。
    • 图解:像爬山,哪里高往哪里爬。树的生长是不规则的,可能左边很深,右边很浅。
    • 优点:在相同的叶子数(num_leaves)下,Leaf-wise 产生的误差比 Level-wise 更小,收敛更快。
    • 缺点:可能导致树长得很深,容易过拟合。因此 LGBM 必须限制 max_depth 或 num_leaves

对比总结:

  • XGBoost 为了并行计算,牺牲了一部分精度,做了很多“无用功”。
  • LightGBM 哪怕不采样,也只做“有用功”,单树精度更高。

2. 决策边界:直切 vs 倾斜

  • XGBoost (直切/Pre-sorted)

    • 传统算法(以及 XGBoost 的 exact 模式)会对特征值进行预排序
    • 分裂点只能选取在具体的特征值上。
    • 决策边界是垂直于坐标轴的直线。
  • LightGBM (倾斜/Histogram-based)

    • 虽然 XGBoost 后期也引入了 Histogram,但 LGBM 是默认且深度依赖 Histogram 的。
    • Histogram 算法会将连续特征值离散化为 k 个桶(通常 k=255)
    • 关键点:LGBM 在寻找分裂点时,使用的是 梯度的一阶导数 (Gradient) 信息,这在数学上相当于构建了带有斜率的决策边界
    • 结果:LGBM 的单棵树能拟合更复杂的模式,通常需要更少的树(n_estimators)就能达到同样的效果。

3. 通信优化:Histogram (直方图) 算法

即使不进行样本筛选,LGBM 默认使用 Histogram 算法,而 XGBoost 的默认算法(tree_method='hist' 之前)是基于特征的精确排序。

维度 XGBoost (Exact Approx) LightGBM (Histogram)
数据预处理 不需要预聚合 必须将特征转换为直方图
分裂点查找 遍历所有可能的切分点 遍历直方图的 k 个桶 (k=255)
计算复杂度 O(#data * #feature) O(#data * #feature) 但常数极小
内存占用 需要存储所有数据的排序索引 只需存储直方图统计量
稀疏特征 自动处理稀疏 (0值) 自动处理稀疏 (0值)

差异点

  • XGBoost 在每次分裂时都要重新计算特征的增益。
  • LGBM 的直方图在构建一次后,后续节点可以直接复用(只需减去离开节点的统计量,加上进入节点的统计量),速度呈指数级提升。

4. 类别特征处理

  • XGBoost

    • 不能直接处理类别特征。必须先手动进行 One-Hot Encoding 或 Label Encoding。
    • One-Hot 会导致特征空间爆炸,树生长变慢且不平衡。
  • LightGBM

    • 原生支持类别特征。
    • 底层逻辑:LGBM 专门针对类别特征设计了基于 Fisher 算法的分割策略feature_fraction 等)。它不需要 One-Hot,而是直接根据类别输出的目标值统计量进行排序和分组。
    • 优势:处理高基数类别特征(如 UserID、City)时,速度和精度远超 XGBoost。

5. 内存访问优化 (GOOS 的影子)

虽然你关掉了 goss,但 LGBM 的底层实现依然遵循 GOOS (Gradient-based One-Side Sampling) 的“兄弟”技术:EFB (Exclusive Feature Bundling)

  • XGBoost:每个特征独立存储,稀疏特征占用大量内存。
  • LightGBM
    • 很多特征是互斥的(例如:one-hot 编码后的 "性别=男" 和 "性别=女" 不会同时为 1)。
    • LGBM 会将这些互斥特征捆绑 成一个特征,大大减少了特征数量,降低了内存占用,并加速了计算。
    • :这是自动的,不取决于 boosting_type

6. 缺失值处理

  • XGBoost:在分裂时,尝试将缺失值分别归于左子树和右子树,看哪边增益大,就学习出一个默认方向。
  • LightGBM
    • 默认将缺失值归到一个固定的桶(通常是直方图的某一端)。
    • 分裂时直接计算该桶的增益。这种方式计算量更小,速度更快,但在某些极端数据分布下,精度可能略低于 XGBoost 的穷举法。

总结:为什么选 LGBM (即使在 'gbdt' 下)?

如果参数都设为 gbdt,且都关闭了采样:

  1. 速度:LGBM 依然更快。因为 Leaf-wise 做的计算更少,Histogram 算法常数更低,且 EFB 降低了特征维度。
  2. 精度:LGBM 通常更高。因为 Leaf-wise 是“精准打击”,而 Level-wise 是“地毯式轰炸”。
  3. 内存:LGBM 更省内存。Histogram + EFB 功不可没。
  4. 上手难度:LGBM 更低。原生支持类别特征,不需要繁琐的数据预处理。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐