系统设计那里不是很明白。
ABSTRACT
提出xgboost,一个端到端的梯度提升算法的实现。具有如下特点:
1.提出稀疏感知算法来处理稀疏数据
2.加权分位点概要算法进行近似
3.在缓存命中模式、数据压缩和分片上的创新
目标函数
第一部分是损失函数,用来拟合label,第二部分是正则项,用来防止过拟合。
去掉正则项之后,目标函数就是传统的GBDT。
GBDT 算法通过加性学习,每轮迭代学习一棵CART树来优化损失函数,并将新的树加入到模型中。
对该损失函数进行泰勒二阶展开,如下
其中,一阶梯度和二阶梯度如下:
去掉常数项,损失函数变成如下形式:
将上式由样本维度改写成叶节点维度:
表示叶子节点j上的样本集合。
假设树模型结构固定,那么每个叶子节点的最优权重为:
并求得此时的最优损失函数:
文中给出了最优损失函数的计算的一个示例:
每个样本计算一阶和二阶梯度,得到树结构之后即可计算最优损失函数。
由于树结构不可能都遍历一遍,文中使用贪心算法,从根节点开始每次迭代都加入一个分支。并使用如下公式评估候选切分点
即切分前的损失函数减去切分后左右子节点的损失函数之和,即使用该切分点划分后损失函数的降幅。
缩减和列采样
这两个方法也是用来防止过拟合的。
缩减(shrinkage)类似学习率,减小单个tree的影响。
列采样是随机森林的做法。 文中提到,列采样比行采样更能防止过拟合。
切分点查找算法
精确贪心算法
k表示特征。
该算法遍历每个特征的每个可能的切分点。
在遍历前需要对样本的特征值进行排序。
复杂度为 m ∗ n ∗ l o g ( n ) m*n*log(n) m∗n∗log(n)
近似算法
精确算法在数据无法全部放入内存和分布式环境下 效率都比较低,为此有了如下的近似算法。
即,首先在查找候选切分点之前计算每个特征的分位点,分为全部模式和局部模式。
然后,在查找切分点时将连续特征分到对应的特征分桶(分桶即使用上面的分位点进行切分的)中,然后聚合每个分桶中的统计值(一阶梯度和二阶梯度)算出最优的切分点(分位点)。
s k , v s_k,v sk,v表示特征k的第v个分位点。
前面提到,有两个模式,一个是全局模式。该模式在初始化阶段就算出所有特征的分位点。然后后面在所有分裂的地方都使用这些分位点。
局部模式,或者叫本地模式。即在每次分裂的时候都再算一遍分位点。明显全局模式需要的计算更少,但是需要更多的分位点来保证选出来的切分点是比较精确的。 后面也有实验证明,全局模式在分位点足够多时可以达到和本地模式一样的效果。
xgboost 支持单机模式下的精确查找和所有场景(分布式、单机和单机数据无法放入内存?)下的近似查找。
加权分位点概要算法
顾名思义,这个算法不是简单的分位点作为候选切分点,而是使用了权重。这个权重就是样本的二阶梯度。
使用二阶梯度的原因后面说。
先说下使用二阶梯度计算分位点的逻辑:
上式表示第k个特征值小于z时 使用二阶梯度作为权重时的带权分位点。
表示样本的第k个特征和对应的二阶梯度。
根据上式,带权分位点满足如下条件:
ϵ \epsilon ϵ 表示近似参数,对应的切分点个数为 1 / ϵ