一、BDT
提升数,Boosting Decision Tree,以CART决策树为基学习器的集成学习方法。
1.1 BDT的表示
1.2 loss function
指数损失函数:
平方损失函数:
1.3 算法步骤
二、GBDT
2.1 GBDT的表示
GBDT全称为:Gradient Boosting Decision Tree,即梯度提升决策树,理解为梯度提升+决策树。
核心思想:利用损失函数的负梯度(BDT是残差)来拟合基学习器
原理:
2.2 GBDT的梯度提升流程
三、XGBoost的优化
功能方面:
- GDBT的基函数是回归树,而XGBoost还支持线性分类器,对于分类问题,此时XGBoost就相当于logistic回归,回归就是线性回归。
- 传统的GDBT使用的一阶导数,而XGBoost是用的一阶导数和二阶导数,更快的拟合;
避免过拟合策略
- XGBoost在目标函数里面加个了正则化项,这可以一定程度控制生成树的复杂度,从偏差方差均衡的角度,这有助于降低方差,避免过拟合。
- shrinkage的方式来缩减每棵树的影响。
加速计算方面
-
引入了分位数,GDBT是对特征的每个值去计算增益值,而XGBoost根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
-
虽然生成每棵树一定要串行,但是选择特征是并行的,这也是非常耗时的一个阶段。
-
借鉴了随机森林的,行采样,列采用的特性,既省时间又可防止过拟合。
-
在工程方面,支持多线程,支持GPU等特性。
四、LightGBM的优化
4.1 引进直方图进行优化
XGBoost是采用presort的方式来选取最佳分割点,而LGBM是采用直方图,对于连续的特征统计为k类,然后以直方图为单位,选取最佳分割点;
- 用直方图算法来对特征进行计算,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
- 先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
4.2 带深度限制的 Leaf-wise 算法
XGBoost在预测的时候采用的是level-wise广度优先的策略,而LGBM采用的是leaf-wise的策略,区别对待同一层的叶子结点,对于增益较低结点不进行分裂,节约这部分没必要的计算开销。
- 按层生长的决策树
- 按结点生长的决策树
说明:Level-wise相比
- Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;
- Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
4.3 单边梯度采样算法(GOSS)
GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。
4.4 互斥特征捆绑算法
互斥特征捆绑算法(Exclusive Feature Bundling, EFB)指出如果将一些特征进行融合绑定,则可以降低特征数量。这样在构建直方图时的时间复杂度从O(#data * #feature)
变为O(#data * #bundle)
,这里#bundle
指特征融合绑定后特征包的个数,且#bundle
远小于#feature
。
注意: 要捆绑互斥的特征,也就是onehot编码不同时为0的特征,这样才不会丢失信息,但现实中往往很难,因此用冲突比例
来衡量,都为0则冲突比例越大,当这个值较小时,我们可以选择这个两个特征捆绑,而不影响最后的精度。
4.5 工程上的各种并行
包括特征并行、数据并行和投票并行。
参考:
https://mp.weixin.qq.com/s/clNVCXxNkAUsQC-oHL2b2g
https://zhuanlan.zhihu.com/p/99069186