论文阅读笔记--LightGBM: A Highly Efficient Gradient Boosting Decision Tree

     以前学习集成学习时候,都是从网上博客等等一些地方学习的,最近重新复习学习,所以拿出论文来读,这个是这篇论文LightGBM: A Highly Efficient Gradient Boosting Decision Tree的自己的笔记。

       在我理解中,这篇论文,是对GBDT算法的改进,是对GBDT算法的增速。主要的改进点就在对训练数据的处理上,其实对算法本质没有改进。

       GBDT存在着一个问题,对于每棵树,分裂节点时,都要对每个特征,遍历所有的样本,对所有的可能分裂点都要计算信息增益,这很耗时,即使,把每个结果都保存下来,那么消耗大量的时间和空间。论文中提出了两个主要的算法,来减小时间的消耗。

GOSS:Gradient-based one-side Sampling

EFB: Exclusive Feature Bundling

GOSS:Gradient-based one-side Sampling

这个算法主要是减少训练数据量。在GBDT的训练中,训练样本都没有权重,但梯度大的样本在计算信息增益时扮演更重要的角色,即我们可以选择梯度大的样本。但是如果选择全部的大梯度样本,这样会改变原始的数据分布,从而损害训练模型的精度,所以GOSS的做法就是:
  1. 对所有样本按照梯度大小排序,选择top a * 100% 的样本
  2. 在剩余样本中随机采样 b * 100% 的样本
  3. 对于随机抽样的样本,计算信息增益时 * (1 - a)/ b

这样做既可以减少训练数据,还可以尽可能符合数据的原始分布。

EFB: Exclusive Feature Bundling

      高维特征是很稀疏的,这种特性使我们可以设计一个损失小的算法去减少特征数量,特别在稀疏特征中,许多特征是互斥的,出现大量的0。
      这个算法主要是减少特征数量,把原算法的时间复杂度从O(#data * #feature) 减少为 O(#data * #bundle)。从bundle这个词也可以看出,就是把一些特征绑定,这样特征数量就会减小。对于这个算法有两个关键点。
  • 哪些特征是可以绑定的
  • 应该怎么绑定

对于第一个问题,分割为互斥的小数量特征是一个NP难的问题,为了在精确度和效率之间的权衡,设计了Greedy Bundle,分为三步走

  1. 首先,构建带有权重的边,权重对应着两个特征之间的冲突
  2. 然后,降序排序特征
  3. 最后,遍历所有特征,决定这个特征是应该指派给有冲突的特征进行绑定,创建新的绑定

对于第二个问题,关键点在原文中是这么说的,The key is to ensure that the values of the original features can be identified from the feature bundles.我理解是,将两个特征绑定为一个特征,怎么使原始的两个特征在这个绑定的特征中具有明显的区分度,这个才是关键。既然直方图算法存储的是离散值,而不是连续值,我们就可以把这两个特征放在不同的离散值中,这样就有了区分。如果两个连续特征有重叠部分,我们可以增加一个偏置。例如原始特征A取值[0 , 10],特征B取值[0 , 20] 。我们添加偏移量10到特征B中,所以重新构建的特征取值为[10 , 30 ]。合并A和B,使用一个新特征[0 , 30]代替原始特征A和B。


猜你喜欢

转载自blog.csdn.net/weixin_39953502/article/details/80791595