xgboost
目标函数
O b j t = ∑ j = 1 T ( G j w j + 1 2 ( H j + λ ) w j 2 ) Obj^t= \sum_{j=1}^T(G_jw_j + \frac12(H_j+\lambda)w_j^2) Objt=j=1∑T(Gjwj+21(Hj+λ)wj2)
对于每个叶子节点,由最值公式可知:
w j ∗ = − G j H j + λ w_j^* = -\frac{G_j}{H_j+\lambda} wj∗=−Hj+λGj
目标函数变为
O b j t = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T Obj^t = -\frac12\sum_{j=1}^T \frac{G_j^2}{H_j+ \lambda} + \gamma T Objt=−21j=1∑THj+λGj2+γT
这个值越小越好
最优切分点划分算法
在实际训练过程中,当建立第 棵树时,一个非常关键的问题是如何找到叶子节点的最优切分点,XGBoost支持两种分裂节点的方法——贪心算法和近似算法。
(1)贪心算法
从树的深度为0开始:
- 对每个叶节点枚举所有的可用特征;
- 针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益;
- 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新的叶节点,并为每个新节点关联对应的样本集;
- 回到第1步,递归执行直到满足特定条件为止;
那么如何计算每个特征的分裂收益呢?
假设在某一节点完成分裂,则分裂前的目标函数可写为:
O b j 1 = − 1 2 [ ( G L + G R ) 2 H L + H R + λ ] + γ Obj_1=-\frac12[\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}] + \gamma Obj1=−21[HL+HR+λ(GL+GR)2]+γ
分裂后的目标函数:
O b j 2 = − 1 2 [ G L 2 H L + λ + G R 2 H R + λ ] + 2 γ Obj_2 = -\frac12[\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda}] + 2\gamma Obj2=−21[HL+λGL2+HR+λGR2]+2γ
分裂后的收益
G a i n = O b j 1 − O b j 2 = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] Gain = Obj_1-Obj_2 = \frac12[\frac{G_L^2}{H_L+\lambda} +\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}] Gain=Obj1−Obj2=21[HL+λGL2+HR