目录
2016/11/18简述FastDBT和LightGBM中GBDT的实现
[3]XGboost与Spark的完全集成 @Nan Zhu
2016/10/05XGboost: A Scalable Tree Boosting System论文及源码导读
2016/10/02Gradient Boosting Decision Tree[下篇]
2016/09/24Gradient Boosting Decision Tree[上篇]
[笔记]Ranking Relevance in Yahoo Search
-
2016/11/18简述FastDBT和LightGBM中GBDT的实现
简述FastDBT和LightGBM中GBDT的实现
Nov 18, 2016 | 机器学习 | Hits
FastDBT和LightGBM在XGBoost之后提出,FastBDT针对多类别问题进行了优化,从实现层面获得了更快的训练速度,LightGBM则在树的生成进行了改进,文章按以下思路介绍
- FastDBT简介及代码走读,LightGBM简介
- 从算法层面讨论下三者的异同点
FastDBT篇
树模型从模型层面和实现层面两种可行的改进方式:1.模型层面的改进:如SGBDT采用的样本采样方式[1],或者对弱作用特征的剪枝[2]。2.实现层面的改进,见引文[3].FastDBT延续自SGBDT,SGBDT在每层树的构建中并非所有样本都使用到,按参数αα对数据进行随机采样。
FastDBT有如下三个实现层面上的加速:
- 数据在内存的存储方式,分为两种a.结构体数据,b.数组结构体,如下图1。区别在于当对其中一维特征进行遍历的时候,按数组结构体的方式存储使得内存连续,提升内存访问速度。
- 将正例负例进行区分存储,减少一半左右的计算累计直方图(calculation of the cumulative probability histograms,CPH)缓存占用,同时节约了if判断条件跳转的浪费。
- 同层节点并行计算。由于每层的节点的数据来自于被父节点分割的子集,FastBDT在对不同的节点同时计算CPH(临时存储多个节点点的CPH),可以连续进行内存访问避免跳跃。
图1:数据内存布局
下面进行FastDBT建树部分代码走读:
1 |
|
有几个实现细节比较trick需要提一下
- FeatureBinning的内部实现采用了二分查找树(调了几个小时代码没弄明白,幸亏Thomas解答并帮忙增加了注释)
特征值分桶核心代码:
1 |
|
- ForestBuilder类的初始化时完成SGBDT每一棵树的级联
boosting过程的核心代码:
1 |
|
- TreeBuilder类完成单棵树的生成
TreeBuilder核心代码走读:
1 |
|
- 计算累计直方图,得到正例和负例的累计直方图
|