XGBoost--切分点查找算法

1:前言:

本篇博客省去了从树模型到GBDT,再到XGBoost的渐进演变逻辑过程和数学推导,主要讲述XGBoost在每轮训练生成新的树模型时,采取的切分点选择算法和相关数学证明。

2:背景

XGBoost在每轮训练生成新的树模型时,首先计算所有特征在所有切分点分裂前后的Obj_split,然后选取Obj_split最大特征及其切分点作为最优特征和最优切分点。XGBoost提供了多种最优特征和最优切分点的查找算法,统称为切分点查找算法。

2.1:精确贪心算法

XGBoost在生成新树的过程中国,最基本的操作是节点分裂,节点分裂中最重要的缓解是找到最优特征及最优切分点,然后将叶子节点按照最优特征和最优切分点进行分裂。

选取最优特征和最优分裂点的思路如下:

首先找到所有的候选特征及所有的候选切分点,依次求得Obj_split,后选取Obj_split最大特征及其切分点作为最优特征和最优切分点作为最优特征和最优切分点,因此将其称为精确贪心算法。该算法是一种启发式算法,因为节点在分裂时只选择当前最优的分裂策略,而非全局最优的分裂策略。

精确贪心算法的计算过程:


此算法会对所有的特征进行遍历。在遍历过程中,对于每个特征,都会我将该及节点包含的样本按该特征值进行排序,排序后按照:。这种方式对左子节点和右子节点求梯度统计,因为G、H由该节点的所有样本的g、h求和所得,因此当节点分裂条件有k< j,变成k< j+1时,左子节点的统计特征变为,右子节点的统计特征变为,其中是更新后的值,即在原来的基础上减去。最后找到收益醉的的特征和分裂点进行分裂。

此算法的复杂度为O(nlogn),需要处理d个特征,进行K轮,因此算法的复杂度为O(ndKnlogn)。


2.2:基于直方图的近似算法

精确贪心算法在选择最有特征和最优切分点时是一种十分有效的算法,它计算了所有特征和所有切分点的收益,并从中选择了最优的,从而保证模型能比较好的拟合训练数据。但是当数据不能完全加载到内存时,精确贪心算法变得十分低效,算法在计算过程中需要不断在内存和磁盘之间进行数据交换,这是一个非常耗时的过程,并且在分布式环境中面临同样的问题。

为了能够更高效的选择最优特征及切分点,XGBoost提出一种急死算法来解决该问题。

基于直方图的近似算法的主要思想:对某种特征寻找最优切分点时,首先对该特征的所有切分点按分位数(如百分位数)分桶,得到一个候选切分点集,特征的每一个切分点都可以分到对应的分桶,然后对每个分桶计算特征统计G和H,得到直方图,G为该桶内所有样本一阶特征g之和,H为该桶内所有样本二阶特征统计h之和,最后选择所有候选特征及候选切分点中对应桶的特征统计收益最大的作为最优特征及最优切分点。基于直方图的近似算法的计算过程如下:

 


近似算法也可以用在分布式树学习的环境中。其基本思想如下:首先将数据划分到多个worker节点上,在每轮训练中,worker计算本几点上数据梯度统计生成直方图,并将数据直方图传递给主节点,主节点依据各个节点梯度统计数据对节点进行分裂生成新的一层,主节点将下一层信息发送给worker节点,worker节点再在新一层的基础上生成数据直方图,重复上述过程,直至决策树达到预定的深度后停止。

近似算法实现了两种候选切分点的构建策略:全局策略和本地策略。全局策略是在树构建的初始阶段对每一个特征确定一个候选切分点的集合,并在该树的每一层的节点分裂中均采用刺激和计算收益,整个过程候选切分点集合不改变。本地策略则是在每一次节点分裂时重新确定候选切分点。全局策略需要更细的分桶才能达到本地的精确度,但全局策略在选取候选切分点集合时比本地策略更简单。


2.3:快速直方图算法

快速直方图算法实质上是在近似算法的基础上的优化,通过前面的内容,基于直方图的近似算法将每个切分点划分到对应的分桶中,构建直方图数据,然后根据直方图数据近似求解最优特征和最优切分点,从而减少内存和磁盘之间的数据交互,提高计算效率。

虽然近似算法相比精确贪心算法在计算性能上提升很多,但直方图聚合仍是构建树的过程中一个主要的计算瓶颈,因此XGBoost参考FastBDT和LightGBM 实现了快速直方图算法。

快速直方图算法在多次迭代中重用之前的分桶,并以此为基础进行了一些优化。

(1)数据预处理:连续性特征一般用浮点型数据表示,但在树分裂过程中一般仅会用到梯度统计信息,而算法仅仅对值进行相互比较,并不会用到值本身,因此可以将浮点数据均映射为整型数据,一般以直方图的索引为映射值,因为CPU对整型运算的效率要比浮点型效率计算高很多,因此算法的性能可以提升很多。

(2)桶缓存:将上述数据结构进行缓存,在模型拟合过程中进行复用,提升计算效率。

(3)直方图减法技巧:简化节点直方图的计算,直接取父节点和兄弟节点的差。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章