xgboost王牌集成学习算法
算法大致架构
算法流程
模型依赖关系
引出损失函数
使用泰勒展式优化损失
参数化损失函数
二次函数优化损失求极值
损失差极大化确定特征条件
结论
一般化结构分数:
注意泰勒展式推导中 g i g_i gi 含义
Score j = ( ∑ i ∈ j g i ) 2 ∑ i ∈ j h i + λ \text { Score }_{j}=\frac{\left(\sum_{i \in j} g_{i}\right)^{2}}{\sum_{i \in j} h_{i}+\lambda} Score j=∑i∈jhi+λ(∑i∈jgi)2
Score j = 节点 j 上所有样本的一阶导数之和的平方 节点 j 上所有样本的二阶导数之和 + λ \operatorname{Score}_{j}=\frac{\text { 节点 } j \text { 上所有样本的一阶导数之和的平方 }}{\text { 节点 } j \text { 上所有样本的二阶导数之和 }+\lambda} Scorej= 节点 j 上所有样本的二阶导数之和 +λ 节点 j 上所有样本的一阶导数之和的平方
o b j o l d ∗ − o b j n e w ∗ = Gain = 1 2 ( Score L + Score R − Score ) − γ = 1 2 ( ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ + ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ − ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ ) − γ \begin{aligned} obj_{old}^*-obj_{new}^*=\text { Gain } &=\frac{1}{2}\left(\text { Score }_{L}+\text { Score }_{R}-\text { Score }\right)-\gamma \\ &=\frac{1}{2}\left(\frac{\left(\sum_{i \in L} g_{i}\right)^{2}}{\sum_{i \in L} h_{i}+\lambda}+\frac{\left(\sum_{i \in R} g_{i}\right)^{2}}{\sum_{i \in R} h_{i}+\lambda}-\frac{\left(\sum_{i \in P} g_{i}\right)^{2}}{\sum_{i \in P} h_{i}+\lambda}\right)-\gamma \end{aligned} objold∗−objnew∗= Gain =21( Score L+ Score R− Score )−γ=21(∑i∈Lhi+λ(∑i∈Lgi)2+∑i∈Rhi+λ(∑i∈Rgi)2−∑i∈Phi+λ(∑i∈Pgi)2)−γ
这即是说,结构分数增益实际上就是:
Gain = 左节点的结构分数 + 右节点的结构分数 − 父节点的结构分数 \text { Gain }=\text { 左节点的结构分数 + 右节点的结构分数 }-\text { 父节点的结构分数 } Gain = 左节点的结构分数 + 右节点的结构分数 − 父节点的结构分数
我们选择增益 G a i n Gain Gain 最大的点进行分枝。
损失差极大化好像和模型复杂度的超参数γ没有关系…俺也不知道为啥
知道啥用了,在每个树模型生成时,虽然超参数γ不能改变树的特征选择过程,但是若信息增益值小于γ了,虽然是最优的方案,但是这个分割也不能作为树生长条件,因为信息增益减去γ小于零,没有价值,就这样限制了树模型的生长(不影响最优特征的选择),另外sklearn是先生成所有树模型,然后根据信息增益减去超参数γ的正负值进行剪枝。
在XGBoost中,我们追求一棵树整体的结构分数最大,因此XGBoost规定任意结构的分数增 益不能为负,任意增益为负的节点都会被前枝,因此可以默认有:
1 2 ( ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ + ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ − ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ ) − γ > 0 \frac{1}{2}\left(\frac{\left(\sum_{i \in L} g_{i}\right)^{2}}{\sum_{i \in L} h_{i}+\lambda}+\frac{\left(\sum_{i \in R} g_{i}\right)^{2}}{\sum_{i \in R} h_{i}+\lambda}-\frac{\left(\sum_{i \in P} g_{i}\right)^{2}}{\sum_{i \in P} h_{i}+\lambda}\right)-\gamma>0 21(∑i∈Lhi+λ(∑i∈Lgi)2+∑i∈Rhi+λ(∑i∈Rgi)2−∑i∈Phi+λ(∑i∈Pgi)2)−γ>0
因此:
1 2 ( ( ∑ i ∈ L g i ) 2 ∑ i ∈ L h i + λ + ( ∑ i ∈ R g i ) 2 ∑ i ∈ R h i + λ − ( ∑ i ∈ P g i ) 2 ∑ i ∈ P h i + λ ) > γ \frac{1}{2}\left(\frac{\left(\sum_{i \in L} g_{i}\right)^{2}}{\sum_{i \in L} h_{i}+\lambda}+\frac{\left(\sum_{i \in R} g_{i}\right)^{2}}{\sum_{i \in R} h_{i}+\lambda}-\frac{\left(\sum_{i \in P} g_{i}\right)^{2}}{\sum_{i \in P} h_{i}+\lambda}\right)>\gamma 21(∑i∈Lhi+λ(∑i∈Lgi)2+∑i∈Rhi+λ(∑i∈Rgi)2−∑i∈Phi+λ(∑i∈Pgi)2)>γ
这是说,当参数 γ \gamma γ 为 0 0 0 时,任意增益为负的节点都会被剪枝。当 γ \gamma γ 为任意正数 时,任意增益小于 γ \gamma γ 设定值的节点都会被剪枝。不难发现, γ \gamma γ 在剪枝中的作用 就相当于sklearn中的 m i n _ i m p u r i t y _ d e c r e a s e min\_impurity\_decrease min_impurity_decrease。
计算过程举例
最优切分店选择
支持并行
关于预排序
为什么预排序:因为在通过结构分数计算Gain收益过程中,我们需要计算左右子树的结构分数?
假设样本值为:[ 3 , 33 , 16 ,23 ,4 ],左右子树方向条件是:> M为左节点,否则为右节点,那么我们通过排序后[ 33 , 23 , 16 , 4 , 3],那么先将第一个[33]放在左,计算一下,然后[33 , 23]放在左,[ 33 ,23 16]放在左,再然后[ 33 , 23 , 16 , 4 ] 最后比较Gain值,若不进行排序,那么需要在确定M时对于谁去左谁去右都要遍历查找一下,就会造成时间效率低的情况。