(1)使用直方图的方式,对于每个特征的所有候选分割点按照其范围分成N个箱子,累加箱子内的梯度提升值,对于箱子里的每个候选分割点都计算 带来的梯度增益,对于每个箱子分别保存其 累计梯度、箱子内的样本数量。之后再分裂节点时直接对直方图遍历进行分割点的候选即可,通过直方图的方式,虽然分割的精度变差了,但是对最后的结果影响不大,一方面能够提升计算效率,另一方面这种较粗的分割点可以起到一种正则化的效果。
之后进行结点分裂时候,只需要根据梯度之和计算loss即可。 看来对Gain增益的计算在 梯度计算中。
(2)支持直方图做差的方式, 一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后(父节点在上一轮就已经计算出来了),可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。 【下面的例子可以一目了然,就是分开梯度的整体和局部计算。
(3)使用GOSS 基于梯度的单边采样方法。基本思想是 梯度大的样本点在信息增益的计算上扮演着主要的作用,也就是说这些梯度大的样本点会贡献更多的信息增益,因此为了保持信息增益评估的精度,当我们对样本进行下采样的时候保留这些梯度大的样本点,而对于梯度小的样本点按比例进行随机采样即可。 也就是会分别计算样本所带来的梯度变化,下次再构建树时候,完全使用梯度大的样本,而对梯度小的进行随机采样,这样可以简化模型,提升速度,起到一种抗过拟合的效果, 可以参照 ppt中的计算。
(4)EFB互斥特征捆绑算法。EFB互斥特征捆绑的方法是,是一种特征抽样【goss是样本采样】,来进一步提升训练速度,将互斥的特征捆绑在一起来减少特征维度,
高维度的数据通常是非常稀疏的,特征空间的稀疏性让我们可以设计一个几乎无损的方法去减少特征的数量。具体来说,在稀疏的特征空间中,许多特征是互斥的,i.e.,他们从不同时取非零值。所以我们可以安全地将互斥特征捆绑到一个特征中(我们称之为exclusive feature bundle)。通过仔细地设计特征扫描算法,我们可以像独立特征一样给feat bundles建立feature histograms。【可以看到这里的核心是不同时取非0值的,可以绑成一个特征、 也就是会让新的特征大部分都是非0值,】
(5)带有深度限制的leaf-wise机制。 Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
(6)支持类别型特征。不需要做one-hot编码。 一般需要把类别特征,转化到多维的one-hot编码特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的one-hot编码展开。并在决策树算法上增加了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。利用了分箱的机制。
(7)支持高效并行计算, 分为特征上的并行和 数据上的并行。 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。