机器学习-lgb

https://www.nowcoder.com/discuss/205955

1 特征工程:最大限度地数据中提取特征以供模型和算法使用,包括特征处理,特征选择,降维。

2 lgb

2.1 基本介绍: 一个梯度boosting框架,使用决策树,分布式,训练效率,准确率高,内存低,处理数据地规模大。

2.2 xgb的缺点:每次迭代都要遍历数据很多次:预排序法: 要保存数据的特征值以及特征排序的结果;遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的时间大;在预排序后,特征对梯度的访问是一种随机访问,特征的访问顺序也不一样,对cache 优化很不友好。

2.3 LIghtGBM 的优化

2.3.1 基于Histogram 的决策树算法

基本做法是将连续的浮点特征值离散化为k个整数,同时构造一个宽度为k的直方图,在遍历数据的时候根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

优点:降低内存消耗,直方图不需要额外存储预排序的结果,只需要保存特征离散化后的值,而且只用8位整数型存储,内存消耗可以降低为原来的1/8,然后在计算上的代价大幅度降低。

2.3.2 带深度限制的·leaf-wise 的叶子生长策略

level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型的复杂度,不容易过拟合,但实际上level-wise 是低效的,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

leaf-wise 则是一种更为高效的策略,每次从所有叶子中,找到分裂增益最大的一个叶子,然后分裂。如此循环,因此同level -wise 相比,分裂次数相同的情况下,leaf-wise 可以降低更多的误差,得到更好的精度,缺点是可能会长出较深的决策树,产生过拟合,因此要增加一个最大深度的限制。

2.3.3 直方图做差加速

一个叶子的直方图可以由它的父亲节点的直方图与它兄弟节点的直方图做差得到,速度可以提升一倍

2.3.4 直接支持类别特征

0/1 展开降低了空间和时间的效率,

可以直接输入类别特征,不需要额外的0/1 展开,可以在决策树算法上增加了类别特征的决策规则。lgb 是第一个直接支持类别特征的GBDT 工具。

2.3.5 cache 命中率优化

2.3.6 多线程优化

2.3.7 特征并行和数据并行:

2.4 LightGBM和XGBoost有什么区别?他们的loss一样么? 算法层面有什么区别?

lgb: 基于histogram 的决策树算法,leaf-wise 的叶子生长策略,cache 命中优化率,直接支持类别特征,

xgb:预排序,level-wise 的阶级生长策略,特征对梯度的访问是一种随机访问

2.5 LightGBM有哪些实现,各有什么区别?

gdbt: :梯度提升决策树,串行速度慢,容易过拟合,

rf: 随机森林,并行速度快,

dart:训练较慢;goss:容易过拟合。

参考:https://zhuanlan.zhihu.com/p/25308051

https://www.jianshu.com/p/104c3e0622d3

https://www.lizenghai.com/archives/21833.html

3 lightgbm和xgboost区别。

GBDT : 梯度提升数的基础上发展而来,在构建树的每一步的过程都是去拟合上一步模型在训练集上的残差,恰好是loss的梯度。

特点:每次迭代获得的决策树模型都要乘以一个缩减系数,从而降低每棵树的作用,提升可学习空间,每次迭代拟合的是一阶梯度。

Xgboost 是GDBT的变种,xgboost 是对目标函数做二阶泰勒展开,从而求出下步要拟合的树的叶子节点的权重,再根据loss 求出每一次分裂节点的损失减小的大小,从而根据分裂损失选择合适的属性进行分裂。

先遍历所有节点的所有属性进行分裂,假设选择了这个a 属性的一个取值作为分裂节点,根据泰勒展开求得的公式可计算该树结构各个叶子节点的权重,从而计算损失减小的程度,从而综合各个属性选择使得损失减小最大的那个特征作为当前节点的分裂属性,依次类推,直到满足终止条件。

特点: 1 除了类似GBDT 的缩减系数外,xgboost 对每棵树的叶子节点个数和权重都做了惩随机罚,避免过拟合

2 类似随机森林,XGBoost 在构建树的过程中,对每棵随机选择一些属性作为分裂属性。

3 分裂算法:(1) 精确的分裂:把每个属性的每个取值都当作一次阈值进行遍历,采用的决策树是CART(2)近似分裂算法: 

对每个属性的取值进行分裂,按照各个桶之间的值划分阈值,xgboost 提出了一个特殊的分桶策略,一般分桶策略是每个样本的权重都是相同的,但是xgboost 使每个样本的权重为损失函数在该样本点的二阶导。

4 xgboost 添加了对稀疏数据的支持,在计算分裂收益的时候只利用没有missing 值的那些样本,但是在推理的时候,也就是在确定了树的结构,需要将样本映射到叶子节点的时候,需要对含有缺失值的样本进行划分,xgboost 分别假设该样本属于左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为该样本的分裂方向。

5 xgboost 实现了并行化,不是类似rf 那样树和树之间的并行化,xgboost 和boosting 方法一样,在树的粒度上是串行的,但是在构建树的过程中,也就是在分裂节点的时候支持并行化,比如同时计算多个属性的多个取值作为分裂特征及其值,然后选择收益最大的特征及其取值对节点分裂。

6 xgboost 在实现时,需要将所有数据导入内存,做一次pre-sort,这样在选择分裂节点时比较迅速,

缺点: level-wise 建树方式对当前层的所有叶子节点一视同仁,有些叶子节点分裂收益非常小,对结果没影响,但是还是要分裂,加重了计算代价。

预排序方法空间消耗比较大,不仅要保存特征值,也要保存特征的排序索引,同时时间消耗也大,在遍历每个分裂点时都要计算分裂增益。

LightGBM:

1 采用leaf-wise 策略:在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,容易过拟合,容易陷入比较高的深度中,需要对最大深度做限制,从而避免过拟合。

2 lgb 使用了基于histogram 的决策树算法,这一点不同与xgboost 中的exact 算法,histogram 算法在内存和计算代价上都有不小优势,内存优势: 直方图算法的内存消耗为:data *feature*1bytes ,(对特征分桶后只需要保存特征离散化后的值),xgboost 的exact 算法的内存消耗为:2*data*feature*4bytes,因为xgboost 既要保存原始的feature 的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。计算优势: 预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为data ,而直方图算法只需要遍历桶就行了,时间为bin

3 直方图做差加速

一个叶子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算

4 lgb 支持直接输入categorical 的feature

在对离散特征分裂时,每个取值都当作一个桶,分裂时的增益算的是是否属于某个category的gain ,类似于one-hot 编码,

5 但实际上xgboost 的近似直方图算法页类似于lgb 的,为什么会慢,

xgboost 在每一层都动态构建直方图,因为xgboost 的直方图算法不是针对每个特定的feature,而是所有feature 共享一个直方图(每个·样本的权重是二阶导,所以每一层都要重新构建直方图,而lgb 对每个特征都有一个直方图,所以构建一次直方图就够了。

6 lgb 哪些方面做了并行:

feature parallel

一般的feature parallel 就是对数据做垂直分割,然后将分割后的数据分散到各个worker 上,各个worker 计算其拥有的数据的best split point,之后再汇总得到全局最优分割点,但是lgb 说这种方法通讯开销比较大,lgb 的做法是每个worker 有拥有所有数据,再分割。

data parallel 

传统的data parallel 是将对数据集进行划分,也叫平行分割,分散到各个workers 上,workers 对得到的数据做直方图,汇总各个workers 的直方图得到全局的直方图,但是通讯开销太大,lgb 的做法是使用Reduce  Scatter 机制,不汇总所有直方图,只汇总不同workers 的feature 的直方图,在这个汇总的直方图上做split,最后同步。

参考:https://www.cnblogs.com/mata123/p/7440774.html

四:随机森林和GBDT 的区别

https://blog.csdn.net/login_sonata/article/details/73929426

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值