首先拉出来LGBM的改进对象,XGBoost
优点:
- 利用了二阶梯度来对节点划分,相对其他GBM,精度有所提高
- 利用了局部近似优化对分裂节点的贪心算法,取适当的eps,可以保持算法的性能且提高运算速度
- 在损失函数中引入了L1,L2,控制复杂度,提高模型的鲁棒性
- 权值收缩,特征下采样等手段
缺点: - 基于数值Pre-Sorted,因此不能处理类别特征,时间复杂度高
- 需要Pre-Sorted,耗内存(2 * data * features)
- 数据分割点上,由于XGB对不同的数据特征使用Pre-Sorted算法,但是不同的特征的排序是不同的,所以分裂时需要对每个特征单独做依次分割,遍历次数 = data * features 来将数据分裂到左右子节点(尽管使用了局部近似,但是处理粒度还是过细)
- 由于Pre-Sorted,所以在寻找特征分裂点(level-wise,XGB的生长策略为广度优先)时,产生大量的cache
针对以上的缺点,LGBM提出改进
- 基于Histogram(直方图)来代替Pre-Sorted 所构建的数据结构
- 基于Hist,对于连续性特征将其类别化(Bundle)K类,然后根据直方图离散值统计,寻找最佳分割点
- 利用GOSS(Gradient- based One-Side Sampling,梯度单边采样)来做采样算法
- 使用EFB(Exclusive Feature Bundling,独立特征合并)来预处理稀疏数据
1、Histogram Algorithm
Pre-Sorted需要保存每一个特征的排序结构,所以要存储 2 * Features * Data * 4Bytes,而Hist 只需要保存离散值bin value,且不用存原始数据,Data * Features * 1Byte。
对于且子节点相对应的Feature histogram 时,只需要构造一个子节点的Feature Histogram,另外一个子节点的Histogram 用父节点减去刚构造出来的即可。
Histogram Algorithm
2、GOSS(Gradient-based One-Side Sampling)
根据样本某一个特征上的单梯度作为样本的权值进行训练。
1)选择前a%个较大梯度的值作为大梯度值的训练样本
2)从剩余的1-a%个较小梯度的值中,随机选择b%个作为小梯度值得训练样本
3)对于较小梯度的样本,即b%(1-a%)samples ,在计算信息增益时将其放大(1-a)/b倍
总结:a%samples + b%(1-a%)*samples 作为训练样本
3、EFB(Exclusive Feature Bundling)
高维数据往往具有很强的稀疏性,提出EFB方法来解决高维数据稀疏问题。
贪心算法,将如何确定哪些特征用于融合的问题转化为一个图着色算法,构建一个以feature为图中的点(V),以feature 之间的总冲突为图中的边(E)。
(这里的冲突值是不是Feature之间的Corr?)
首先按照对每个点(feature)做降序,然后将特征合并到冲突数小于K的Bundle或者新建另外一个Bundle,复杂度O(Feature^2)。
Merge Exclusive Features
然后通过Algo4对Bundle中的特征进行融合。
由于每一个Bundle中的特征数量是不同的,所以要重新构建合并Bundle Feature 的Range,在第一个For循环中,记录每个Feature与之前Features累积的TotalRange。
在第二个For循环中,根据之前的binRanges重新计算出新的BinValue(F[j]bin[i]+binRanges[j]),保证Feature之间的值不会冲突,这是对于稀疏矩阵进行优化,由于之前GreedyBundling 算法对Features 进行冲突检查确保Bundle内特征冲突尽可能少,所以特征之间的非0元素不会有太多的冲突。
Data.Shape= Samples*bundles, s.t. bundles << features
4、Leaf - Wise(Best - First) Tress Growth
LGB 对于树的生长使用的是Leaf - Wise,而不是XGB的Level-Wise。主要是由于LGB认为 Level-Wise 的做法会产生一些地信息增益的节点,从而浪费计算资源。(Generally, Level-Wise 有防止过拟合的作用)LGB认为Leaf-Wise 能更好的追求精度,用max_depth 控制树的高度。又Histogram和GOSS有天然的正则作用,因此LGB使用Leaf-Wise也可以取得更好的效果,且不易过拟合。
References:
LightGBM
XGBoost
网友评论