LightGBM原理解读及核心参数解释

LightGBM原理解读

LightGBM是现在数据挖掘比赛中的大杀器,效果甚至优于一些深度网络模型,而且参数相比神经网络更方便调整。下面就根据LGB的文本来解释一下LighGBM的原理。
在笔者看来,LightGBM的改进大部分是基于计算、运行效率上的改进,使GBDT类模型的性能更快,LGB主要针对数据并行和特征并行进行了优化,大大提升了模型的效率。下面就来一一解读。

传统GBDT方法的缺点

传统GBDT方法在特征维度较高和数据量较大的时候,存在效率和可扩展性的问题。主要原因是GBDT对于每一个特征的每一个分裂点,都需要遍历全部数据计算信息增益,这一过程非常耗时。
针对这一问题,LightGBM提出了**Gradient-based One-Side Sampling (GOSS) 和Exclusive Feature Bundling (EFB)(基于梯度的one-side采样和互斥的特征捆绑)**两种新方法。

寻找最优切分点————预排序和直方图

学习决策树是GBDT主要的时间花销,而学习决策树中找到最优切分点最消耗时间。广泛采用的预排序算法来找到最优切分点,这种方法会列举预排序中所有可能的切分点。这种算法虽然能够找到最优的切分点,但对于训练速度和内存消耗上都效率低。另一种流行算法是直方图算法(histogram-based algorithm)。直方图算法并不通过特征排序找到最优的切分点,而是将连续的特征值抽象成离散的分箱,并使用这些分箱在训练过程中构建特征直方图,这种算法更加训练速度和内存消耗上都更加高效,lightGBM使用此种算法。

histogram-based算法通过直方图寻找最优切分点,其建直方图消耗O(#data * #feature),寻找最优切分点消耗O(#bin * # feature),而#bin的数量远小于#data,所以建直方图为主要时间消耗。如果能够减少数据量或特征量,那么还能够够加速GBDT的训练。

实际中大规模的数据集通常都是非常稀疏的,使用预排序算法的GBDT能够通过无视为0的特征来降低训练时间消耗。然后直方图算法没有优化稀疏的方案。因为直方图算法无论特征值是否为0,都需要为每个数据检索特征区间值。如果基于直方图的GBDT能够有效利用稀疏特征将是最优。

直方图作差

LightGBM采用了直方图作差的方法进一步提高效率,计算某一节点的叶结点直方图可以通过将该结点的直方图与另一子结点的直方图作差得到,所以每次分裂只需计算样本数较少的子结点的直方图,然后作差得到另一个子结点的直方图。

直方图法的优点:

  • LightGBM训练决策树使用直方图算法,是一种牺牲一定切分准确性而换取训练速度以及节省内存空间消耗的算法。
  • 直方图作差进一步提高效率,计算某一节点的叶结点直方图可以通过将该结点的直方图与另一子结点的直方图作差得到,所以每次分裂只需计算样本数较少的子结点的直方图,然后作差得到另一个子结点的直方图。
  • 节省内存:连续数据离散化为直方图的形式,对于数据量较小的情形可以使用小型的数据类型来保存训练数据,不必像预排序一样保留额外的对特征值进行预排序的信息。

对于LightGBM中提到的两点改进,我认为可以归纳为数据采样特征采样两个方面。

Gradient-based One-Side Sampling(数据采样)

GOSS是一种在减少数据量和保证精度上平衡的算法,不计算所有点的梯度,也不是简单的随机采样,而是基于梯度的方式进行采样。

AdaBoost中,样本权重是数据实例重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,GBDT中每个数据都有不同的梯度值,对采样十分有用,即实例的梯度小,实例训练误差也就较小,已经被学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练的模型的精确度,为了避免此问题,提出了GOSS。

GOSS保留所有的梯度较大的实例,在梯度小的实例上使用随机采样。为了抵消对数据分布的影响,计算信息增益的时候,GOSS对小梯度的数据引入常量乘数。GOSS首先根据数据的梯度绝对值排序,在梯度绝对值前topa选取一个子集,剩余的数据中随机采样b个实例。计算信息增益时,小梯度样本乘以一个权重系数(1-a)/b,这样算法就会更关注训练不足的实例,而不会过多改变原数据集的分布。

算法步骤

在GOSS中,

(1)根据样本点的梯度的绝对值对它们进行降序排序;

(2)对排序后的结果选取前a*100%的样本生成一个大梯度样本点的子集;

(3)对剩下的样本集合(1-a)*100%的样本,随机的选取b*(1-a)*100%个样本点,生成一个小梯度样本点的集合;

(4)将大梯度样本和采样的小梯度样本合并;

(5)将小梯度样本乘上一个权重系数;

(6)使用上述的采样的样本,学习一个新的弱学习器;

(7)不断地重复(1)~(6)步骤直到达到规定的迭代次数或者收敛为止。

image

此处GOSS通过较小的数据集估计信息增益Vj(d),将大大地减小计算量。更重要的的,我们接下来理论表明GOSS不会丢失许多训练精度,胜过随机采样。

在GOSS准确的情况下,GOSS泛化误差近似于全量的真实数据。另一方面,采样将增加基学习器的多样性(因为每次采样获得的数据可能会不同),这将提高泛化性。

Exclusive Feature Bundling(特征采样)

EFB是为了减少特征数目而设计的。

高维的特征通常是稀疏的,通过EFB的方法,实现一种无损地减少特征维度。在稀疏空间中,许多特征时互斥的(例如one-hot)之后的特征,可以绑定互斥特征为单一特征。

budle

将特征分割为较小量的互斥特征群是NP-难的,无法直接求解,因此归结为图着色问题近似。

如果两个特征之间不是相互排斥,那么我们用一个边将他们连接,然后用合理的贪婪算法(具有恒定的近似比)用于图着色来做特征捆绑。

此外,我们注意到通常有很多特征,尽管不是100%相互排斥的,也很少同时取非零值。如果我们的算法可以允许一小部分的冲突,我们可以得到更少的特征包,进一步提高计算效率。

算法步骤

  • 建立一个图,每个点代表特征,每个边有权重,其权重和特征之间总体冲突相关。
  • 按照降序排列图中的度数来排序特征。
  • 检查排序之后的每个特征,对他进行特征绑定或者建立新的绑定使得操作之后的总体冲突最小。

这个算法在特征不是特多时效率是可以接受的,但是难以应对百万维度的特征。

为了继续提高效率,我们提出了一个更加高效的无图的排序策略:直接将特征按照非零值个数排序,这和使用图节点的度排序相似,因为更多的非零值通常会导致冲突,新算法在算法3基础上改变了排序策略。

merging exclusive features

鉴于直方图算法存储离散值而不是连续特征值,我们通过将互斥特征放在不同的箱中来构建bundle。这可以通过将偏移量添加到特征原始值中实现,例如,假设bundle中有两个特征,原始特征A取值[0, 10],B取值[0, 20]。我们添加偏移量10到B中,因此B取值[10, 30]。通过这种做法,就可以安全地将A、B特征合并,使用一个取值[0, 30]的特征取代AB。

EFB算法能够将许多互斥的特征变为低维稠密的特征,就能够有效的避免不必要0值特征的计算。

直方图相减:在二叉树中可以通过利用叶节点的父节点和相邻节点的直方图的相减来获得该叶节点的直方图。所以仅仅需要为一个叶节点建立直方图 (其#data小于它的相邻节点)就可以通过直方图的相减来获得相邻节点的直方图,而这花费的代价(O(#bins))很小。

LightGBM的其他改进

  • 采用leaf-wise策略生长树,每次从当前叶子中找到分裂增益最大的一个叶子,然后分裂,如此循环。而传统的决策树采用level-wise,一次分裂同一层的叶子,不加区分的对待同一层的叶子,带来没必要的开销。但是也可能容易过拟合,因此LGB增加了一个最大深度的限制。
  • 特征并行:不再垂直划分数据,每个worker都有全部数据,因此不存在数据划分结果之间通信的开销,每个worker都在本地特征集上寻找划分点
  • 数据并行:整合所有本地直方图以形成全局直方图的方式,使用reduce scatter的方式对不同worker的不同特征进行整合,从本地整合直方图中寻找最优划分并同步到全局的最佳划分中。 另一方面,直方图作差法加速训练,基于此可以进行单叶子的直方图通讯。
  • 直接支持类别特征categorical_feature

LightGBN如何实现并行

特征并行:

LGB在特征并行上的改变为不再垂直划分数据,即每个线程多持有全部数据。且没有数据划分结果之间通信的开销,各个线程都知道如何划分数据。

让每个机器保留整个完整的数据集(并不是经过列采样的数据),这样就不必在切分后传输切分结果数据,因为每个机器已经持有完整的数据集

  • 各个机器上的worker根据所分配的特征子集寻找到局部的最优切分点(特征、阈值)
  • 互相通信来从局部最佳切分点里得到最佳切分点
  • 执行最优切分操作

数据并行:

  • 不同于合并所有的局部直方图获得全局的直方图,LightGBM通过Reduce Scatter(分散规约)方法来合并不同worker的无交叉的不同特征的直方图,这样找到该直方图的局部最优切分点,最后同步到全局最优切分点
  • 基于直方图做差的方法加速训练,在通信的过程中可以只传输某一叶节点的直方图,而对于其邻居可通过做差的方式得到
  • 通信的时间复杂度为O(0.5*#feature*#bin)

LighGBM核心参数

  • num_leaves 叶节点数,与模型复杂度直接相关(leaf-wise),理论上可设定为2的max_depth次方,但实际上一般小于该值,为了避免过拟合
  • 支持回归regression、分类binary multiclass、排序lambdarank
  • boosting type(gbdt rf dart goss)
  • 评价指标 绝对值误差l1 平方误差l2 均方误差 l2_root 对数损失binary_loigloss…

防止过拟合:

  • 列采样feature_fraction
  • 行采样bagging_fraction
  • 叶节点的最小样本数min_data_in_leaf 设置的较大则树不会生长的很深,可能造成模型欠拟合
  • 早停 early_stopping_round
  • 正则化lambda_l1 lambda_l2
  • 切分的最小收益 min_gain_to_split

早停:
Sklearn中的GBDT的早停是用来控制基学习器的生长的(过参数min_impurity_split(原始)以及min_impurity_decrease来实现)

IO参数

  • max_bin 特征值装载的最大直方图数目,较小的数目会降低训练准确性但是提升整体表现,防止过拟合;设置较大能提升准确率,设置较小会提升训练效率

直接支持类别特征

categorical_feature来指定类别特征列,不必预先进行独热编码

参考文献:
LightGBM: A Highly Efficient Gradient Boosting Decision Tree
LightGBM基本原理介绍
GBDT/XGBOOST/LIGHTGBM参数介绍及区别

猜你喜欢

转载自blog.csdn.net/xty5057212/article/details/88549079