[paper]LightGBM: A Highly Efficient Gradient Boosting Decision Tree

LightGBM: A Highly Efficient Gradient Boosting Decision Tree

1.问题

GBDT的实现方式有很多种,比较常见的有XGBoost,PGBRT等。虽然这些实现中都有用到一些加速方法和分离点选择方法,但是当数据量和特征维度非常非常大时,效率还是难以保障。本文提出了一种特征选择方法(EFB)和样本选择方法(GOSS),可以在保障精度的同时,大大提高效率。

2.相关

  • 直方图算法
    本文中使用的特征选择方法(EFB),是基于直方图思想的,因此有必要先了解一下直方图算法。我的理解是将连续的物理量分到n个桶里面,不介意每个样本的每个特征值是多少,只关心特征的每个取值区间(桶)里面有多少个样本。
    avater

3.思路

3.1 GOSS(Gradient-based One-Side Sampling)

这个算法的思路很好理解也很巧妙,首先,我们知道,训练过程中,每个样本对模型的贡献程度是不一样的,权重就是每个样本的loss梯度,也就是说,模型在每次迭代的时候,都会更加关注那些loss比较大的样本。所以,作者就想到,那些loss很小的样本贡献小,那么少用一些这样的样本,似乎对模型的训练结果影响不大,于是作者提出了 GOSS 算法来对样本进行采样。具体方法如下:

  • 将样本的loss从大到小排序
  • 选取前a%的样本构成样本集\(I_a\)
  • 从剩下的(1-a%)的样本中随机选取b%的样本作为小loss样本的代表,构成样本集\(I_b\)
  • 由于是采样,会影响分布,所以在\(I_b\)前乘以\(\frac{1-a}{b}\)作为系数
    avater

    3.2 EFB(Exclusive Feature Bundling)

    由于很多的高维特征都是十分稀疏的,且特征之间有些时候有比较强的相关性,所以采用“分桶”的方法将相关性强(原文中是冲突少)的特征分到一起。确定冲图的方法如下:
    avater
  • searchOrder是将特征按非零个数降序排列的顺序
  • cnt的算法是统计所有样本中,特征1和特征2的冲突总数,冲突的定义为:如果一个样本中特征1和特征2的值同为非零或同为零,则为冲突
  • bundlesConflict,我理解就是在循环过程中,每个bundle的conflict总量,这样可以保证每个bundle中特征的数量大体相等

当将特征分组以后,就要考虑怎么把每一组特征进行组合,文中提到的方法如下:
avater
需要着重理解的地方是:

  • 将每个特征按照直方图划分好bin
  • 同一个bundle中的特征取值范围可能交叉,为了不损失信息,作者提出了以下方法:比如\(bundle1\)中有特征\(f1\in [0, 10)\)和特征\(f2 \in [0, 20)\)\(f2\)的所有bin的值都要加上10,那么这个\(bundle\)的取值范围为\([0, 30)\)

这样我们就得到了最终的特征。

你可能感兴趣的:([paper]LightGBM: A Highly Efficient Gradient Boosting Decision Tree)