一、lightGBM
1、简介
lightGBM全称为light Gradient Boosting Machine,2017年经微软推出,是XGBoost的升级版,在大规模数据集上运行效率更高。
GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。对于工业级海量的数据,普通的GBDT算法是不能满足其需求的
LightGBM的提出是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业场景。
2、优化
XGBoost模型的复杂度:
- 模型复杂度 = 树的棵数 X 每棵树的叶子数量 X 每片叶子生成复杂度
- 每片叶子生成复杂度 = 特征数量 X 候选分裂点数量 X 样本的数量
针对XGBoost的优化:
- Histogram算法,直方图算法 => 减少候选分裂点数量
- GOSS算法,基于梯度的单边采样算法 => 减少样本的数量
- EFB算法,互斥特征捆绑算法 => 减少特征的数量
- 总结:LightGBM = XGBoost + Histogram + GOSS + EFB
3、直方图(Histogram)算法
XGBoost的预排序(pre-sorted)算法:
- 将样本按照特征取值排序,然后从全部特征取值中找到最优的分裂点位
- 预排序算法的候选分裂点数量=样本特征不同取值个数减1
LightGBM的Histogram算法:
- 替代XGBoost的预排序算法
- 思想是先连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图,即将连续特征值离散化到k个bins上(比如k=255)
- 当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点
- XGBoost需要遍历所有离散化的值,LightGBM只要遍历k个直方图的值
- 候选分裂点数量 = k-1
4、GOSS算法
GOSS算法:
- Gradient-based One-Side Sampling,基于梯度的单边采样算法
- 思想是通过样本采样,减少目标函数增益Gain的计算复杂度
- 单边采样,只对梯度绝对值较小的样本按照一定比例进行采样,而保留了梯度绝对值较大的样本
- 因为目标函数增益主要来自于梯度绝对值较大的样本 => GOSS算法在性能和精度之间进行了很好的trade off
5、EFB算法
EFB算法:
- Exclusive Feature Bundling,互斥特征绑定算法
- 思想是特征中包含大量稀疏特征的时候,减少构建直方图的特征数量,从而降低计算复杂度
- 数据集中通常会有大量的稀疏特征(大部分为0,少量为非0)我们认为这些稀疏特征是互斥的,即不会同时取非零值
- EFB算法可以通过对某些特征的取值重新编码,将多个这样互斥的特征绑定为一个新的特征
- 类别特征可以转换成onehot编码,这些多个特征的onehot编码是互斥的,可以使用EFB将他们绑定为一个特征
- 在LightGBM中,可以直接将每个类别取值和一个bin关联,从而自动地处理它们,也就无需预处理成onehot编码
二、xgboost与lightGBM对比
- 精度:两个模型相当
- 训练速度:LightGBM训练速度更快 => 1/10
- 内存消耗:LightGBM占用内存更小 => 1/6
- 特征缺失值:两个模型都可以自动处理特征缺失值
- 分类特征:XGBoost不支持类别特征,需要对其进行OneHot编码,而LightGBM支持分类特征