LightGBM算法梳理
LightGBM起源
lightGBM包含两个关键点:(1)light,轻量级;(2)GBM,梯度提升机。
lightGBM是一个梯度boosting框架,使用基于学习算法的决策树。具有以下特点:
- 基于Histogram的决策树算法
- 带深度限制的Leaf-wise的叶子生长策略
- 直方图做差加速
- 直接支持类别特征
- Cache命中率优化
- 基于直方图的稀疏特征优化
- 多线程优化
它是针对xgboost 的不足而构建的算法。上述同样是xgboost的不足
Histogram VS pre-sorted
预排序算法(pre-sorted)
xgboost算法是基于预排序方法,这种构建决策树的算法基本思想是:
- 首先,对所有特征都按照特征的数值进行预排序。
- 其次,在遍历分割点的时候用 O ( d a t a ) O(data) O(data)的代价找到一个特征上的最好分割点。
- 最后,找到最好的分割点后,将数据分裂成左右子节点。
这样做能精确地找到分割点。但是空间消耗大,时间消耗也大,对cache优化不好。预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样。
直方图算法(Histogram)
直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图,在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累计了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
使用直方图算法有很多的优点。首先,最明显的是内存损耗降低,不需要额外存储预排序的结果,只需要保留特征离散化后的值,而这个值一般用8位整型存储就足够了。
计算上的代价也大幅度降低,预排序算法每遍历一个特征值就需要计算一次分裂增益,而直方图算法只需要计算K次,时间复杂度从 O ( d a t a ∗ f e a t u r e