以前学习集成学习时候,都是从网上博客等等一些地方学习的,最近重新复习学习,所以拿出论文来读,这个是这篇论文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
- 对所有样本按照梯度大小排序,选择top a * 100% 的样本
- 在剩余样本中随机采样 b * 100% 的样本
- 对于随机抽样的样本,计算信息增益时 * (1 - a)/ b
这样做既可以减少训练数据,还可以尽可能符合数据的原始分布。
EFB: Exclusive Feature Bundling
- 哪些特征是可以绑定的
- 应该怎么绑定
对于第一个问题,分割为互斥的小数量特征是一个NP难的问题,为了在精确度和效率之间的权衡,设计了Greedy Bundle,分为三步走
- 首先,构建带有权重的边,权重对应着两个特征之间的冲突
- 然后,降序排序特征
- 最后,遍历所有特征,决定这个特征是应该指派给有冲突的特征进行绑定,创建新的绑定
对于第二个问题,关键点在原文中是这么说的,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。