lightgbm:了解为什么它很快

机器算法验证 助推
2022-03-28 13:44:42

尽管尽我所能进行谷歌搜索,但不幸的是,我无法找到 lightgbm 速度快的原因。lightgbm 文档解释说,遵循的策略是“逐叶(最佳优先)树生长”,而不是“逐级树生长”。我无法理解其中的区别。据我了解,在决策树中,在每个节点处,在拆分之前,都会计算每个候选特征所产生的信息增益,并选择该特征用于该节点的拆分,这将在该节点处提供最大的信息增益. 在这篇论文中在 lightgbm 上,(Guolin Ke 等人)提到了基于梯度的单侧采样(GOSS)。不幸的是,我也无法理解这一点。我熟悉测量杂质中信息增益的概念,但无法理解梯度在其中的作用以及数据点梯度的含义。是否可以用外行的语言提供帮助。

2个回答

由于要求更详细的解释:

LightGBM 速度快的三个原因:

  • 基于直方图的拆分
  • 基于梯度的单侧采样 (GOSS)
  • 独家功能捆绑 (EFB)

自 1990 年代后期以来,基于直方图的拆分就出现在文献中,但它在 Xgboost 中变得流行,这是第一个公开可用的实现它的包。由于在有大量数据时找到精确的最佳拆分非常昂贵(因为它涉及测试每个可能的拆分点),因此使用基于分位数(或直方图)的近似解决方案可以使拆分过程更快,而不会损失太多准确性。这涉及计算特征的一些最佳加权分位数(即将数据分组到箱中),并选择这些分位数之间的分割点。这个过程的算法可以在Xgboost 的论文中找到。Xgboost 提出了局部和全局直方图,这意味着它们将在算法开始时(全局)或每次新拆分(局部)时为每个特征计算。LightGBM 简要地说,它的工作基于基于直方图的拆分(有很多关于此的论文),但它没有说明直方图的计算方式,也没有说明如何与 GOSS 一起实现。

基于梯度的单侧采样 (GOSS)是 LightGBM 的独有功能,它是数据的某种高级二次采样。由于拆分查找的计算时间与特征和实例的数量成正比,因此对实例进行二次采样会使这个问题更快,这也是Stochastic Gradient Boosting背后的思想通过弗里德曼。但是,SGB 对数据进行随机采样,通常会导致模型的准确性下降。GOSS 所做的与 Adaboost 类似——记录由它们的伪残差加权——因为残差低的实例对训练的影响很小,因为它们已经训练有素。因此,保留高残差记录,而对低残差记录进行大量二次抽样,并重新校准它们的权重以避免在残差分布中插入偏差。这大大减少了实例的数量,同时保持了极好的性能,这也是该算法比其他基于直方图的软件包(如 H2O 或 XGboost)性能更好的原因之一。

Exclusive Feature Bundling (EFB)用于处理稀疏特征。我根本不会深入细节,主要是因为我对它们不是特别熟悉;但是,可以说 EFB 用于将稀疏特征捆绑在一起(这些特征永远不会非零在一起),从而大大减少了大型稀疏数据集的计算工作量(如前所述,找到拆分也与总数成正比的特征)。稀疏特征的最优捆绑通常是一个 NP-hard 问题,但通过贪心算法可以很好地近似解决。

在他们的文档中,他们还首先提到了树木的叶子生长。据我所知,这在论文中没有提到,但它应该用于提高准确性而不是速度。

资料来源:LightGBM 论文:)

基于直方图的算法。

在这里阅读更多 - https://github.com/Microsoft/LightGBM/blob/master/docs/Features.rst