GBDT (Gradient Boosting Decision Tree)是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT在工业界应用广泛,通常被用于点击率预测,搜索排序等任务。GBDT也是各种数据挖掘竞赛的致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。
LightGBM (Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有以下优点:
- 更快的训练速度
- 更低的内存消耗
- 更好的准确率
- 分布式支持,可快速处理海量数据
实验数据结果表明,Higgs数据集上LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,并且准确率有所提升。在其他数据集上也可以观察相似的结论。
准确率:
内存消耗:
训练速度:
XGBoost的工作原理
目前已有的GBDT工具基本都是基于预排序的方法(Pre-sorted)的决策树算法(如xgboost)。这种构建决策树的算法基本思想是:
- 对所有特征都按照特征的数值进行排序
- 再遍历分割点的时候用 O ( d a t a ) O(data) O(data)的代价找到一个特征上的最优分割点
- 找到一个特征的分割点后,将数据分裂成左右子节点
预排序算法的优点是能精确地找到分割点
缺点:
- 空间消耗大,算法需要保存数据的特征值,还保存了特征排序后的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。
- 时间上有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价很大。
- cache优化不友好。预排序后,特征对梯度的访问时一种随机访问,并且不同的特征访问顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个row_index到叶子索引的数组,并且不同特征访问顺序也不一样,也会造成较大的cache miss。
LightGBM
1. 基于Histogram的决策树算法
直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了数据的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
Histogram算法的具体实现细节
优点:
- 降低内存消耗:直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的bin值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。
- 降低计算代价:Pre-sorted算法每遍历一个特征值就需要计算一次分裂的增益,而直方图只需要计算k次,时间复杂度从 O ( d a t a × f e a t u r e s ) O(data\times features) O(data×features)优化到 O ( k × f e a t u r e s ) O(k\times features) O(k×features)。构建直方图时仍然需要 O ( d a t a × f e a t u r e s ) O(data\times features) O(data×features)。
Histogram算法并不是完美的。由于特征被离散化后,找到的分割点并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是很重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单颗树的训练误差比精确分割算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。
2. LightGBM的核心
Alg.1算法中,Histogram算法基于feature直方图寻找最优分割点。构建Histogram的复杂度为 O ( d a t a × f e a t u r e ) O(data\times feature) O(data×feature),而寻找最优分割点的复杂度为 O ( b i n × f e a t u r e ) O(bin\times feature) O(bin×feature)。因为bin远远小于data,所以整个过程的复杂度为 O ( d a t a × f e a t u r e ) O(data\times feature) O(data×feature)。通过减少data或者feature可以加速GBDT的训练过程。
2.1 Gradient-based One-Side Sampling(GOSS)
在AdaBoost算法中,样本权重作为数据实例重要性的指标。然而,GBDT没有这样的样本权重从而导致不能采用AdaBoost的取样方法。幸运的是,我们注意到GBDT中每个数据实例的梯度信息能为数据采样提供有价值的信息。换句话说,如果一个实例的梯度很小,说明这个实例得到很好的训练,其训练误差很小。一个简单的想法是丢弃这些小梯度的数据实例。然而,这样会改变数据分布从而降低训练模型的精确度。为了解决这个问题,我们提出了一个Gradient-based One-Side Sampling的新方法。以下Alg.2是GOSS算法的实现细节。
GOSS算法的描述
输入:训练数据,迭代次数d,大梯度数据的采样率a,小梯度数据的采样率b,损失函数和若干个弱学习器
输出:训练的强学习器
- 根据样本的绝对值梯度对其进行降序排序
- 对排序后的序列选取前 a × 100 % a\times100\% a×100%的样本作为大梯度样本的子集
- 对剩下的样本集合 ( 1 − a ) × 100 % (1-a)\times100\% (1−

本文深入解析LightGBM,一种高效实现GBDT算法的框架,强调其在训练速度、内存消耗和准确率方面的优势。文章详细介绍了LightGBM的核心技术,包括基于Histogram的决策树算法、Gradient-based One-Side Sampling(GOSS)、Exclusive Feature Bundling(EFB)以及Leaf-wise的叶子生长策略。此外,还探讨了LightGBM的并行学习优化、Cache命中率优化以及类别特征支持,最后给出了参数调优指南和实战代码示例。
3843

被折叠的 条评论
为什么被折叠?



