1、Basic Exact Greedy Algorithm
树学习的关键问题之一是找到最好的分割,如Eq(7)所示。
贪婪算法:分割查找算法枚举所有特征上的所有可能的分割。精确的贪婪算法如Alg. 1所示。为了高效地完成这一任务,算法必须首先根据特征值对数据进行排序,并按排序顺序访问数据,积累Eq(7)中结构得分的梯度统计量。现有的大多数单个树提升实现都支持精确贪婪算法,如scikit-learn[20]、R的gbm[21]以及XGBoost的单机版本。
Eq(7)在文章:xgboost:算法数学原理_KPer_Yang的博客-CSDN博客
L
s
p
l
i
t
=
1
2
[
(
∑
i
∈
I
L
g
i
)
2
∑
i
∈
I
L
h
i
+
λ
+
(
∑
i
∈
I
R
g
i
)
2
∑
i
∈
I
R
h
i
+
λ
−
(
∑
i
∈
I
g
i
)
2
∑
i
∈
I
h
i
+
λ
]
−
γ
\mathcal{L}_{split}=\frac{1}{2}\left[\frac{(\sum_{i\in I_L}g_i)^2}{\sum_{i\in I_L}h_i+\lambda}+\frac{(\sum_{i\in I_R}g_i)^2}{\sum_{i\in I_R}h_i+\lambda}-\frac{(\sum_{i\in I}g_i)^2}{\sum_{i\in I}h_i+\lambda}\right]-\gamma
Lsplit=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2−∑i∈Ihi+λ(∑i∈Igi)2]−γ
算法的流程如下所示:
m m m:特征的维度;
s o r t e d ( I , b y x j k ) sorted(I, by \ x_{jk}) sorted(I,by xjk):在特征 k k k下的样本特征值进行排序,排序后按照划分点进行特征值划分,计算score。
2、 Approximate Algorithm
精确的贪婪算法非常强大,因为它贪婪地枚举了所有可能的分裂点。然而,当数据太大不能全部放入内存时,全部枚举不能做到。同样的问题也出现在分布式环境中。为了在这两种情况下支持有效的梯度树增强,需要一个近似算法。
**在Alg. 2中,首先根据特征分布的百分位数提出候选分裂点(具体标准将在第3.3节给出)。然后,该算法将连续特征映射到由这些候选点分割的桶中,汇总统计数据,并根据汇总的统计数据在分桶后的数据中找到最佳解决方案。**该算法有两种变体,这取决于给出分桶的时间。在合理的近似水平下,分位数策略可以获得与精确贪婪相同的精度。
-
全局分桶方法在树构造的初始阶段提出所有候选分割,并在所有级别上使用相同的分割查找分桶。
-
局部分桶在每次分裂后重新分桶。
G k v ← = ∑ j ∈ { j ∣ s k , v ≥ x j k > s k , v − 1 } g j G_{kv}\leftarrow=\sum_{j\in\{j\mid s_{k,v}\geq\mathbf{x}_{jk}>s_{k,v-1}\}}g_j Gkv←=∑j∈{j∣sk,v≥xjk>sk,v−1}gj:按照每个桶计算 G G G.
H k v ← = ∑ j ∈ { j ∣ s k , v ≥ x j k > s k , v − 1 } h j H_{kv}\leftarrow=\sum_{j\in\{j|s_{k,v}\geq\mathbf{x}_{jk}>s_{k,v-1}\}}h_j Hkv←=∑j∈{j∣sk,v≥xjk>sk,v−1}hj:按照每个桶计算 H H H.
注:个人理解,分桶其实相当于分裂时就按照每个桶分到左右分支,按照每个桶计算 G G G和 H H H,而不是一个个样本计算,遍历所有的特征值寻找分裂点。
对比:希格斯10M数据集的AUC收敛性比较。eps参数对应于近似草图的精度。这大致相当于分成1 / eps个桶。相同AUC的情况下,局部分桶需要更少的桶,因为它细化了分裂的候选数据;