LightGBM训练时的boosting_type核心参数介绍
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_rate,max_drop,skip_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模式)会对特征值进行预排序。 - 分裂点只能选取在具体的特征值上。
- 决策边界是垂直于坐标轴的直线。
- 传统算法(以及 XGBoost 的
-
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,且都关闭了采样:
- 速度:LGBM 依然更快。因为 Leaf-wise 做的计算更少,Histogram 算法常数更低,且 EFB 降低了特征维度。
- 精度:LGBM 通常更高。因为 Leaf-wise 是“精准打击”,而 Level-wise 是“地毯式轰炸”。
- 内存:LGBM 更省内存。Histogram + EFB 功不可没。
- 上手难度:LGBM 更低。原生支持类别特征,不需要繁琐的数据预处理。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)