XGBoost算法和GBDT的不同在于两个方面,一是在损失函数中表示树的复杂度的正则项,二是不同于GBDT采用损失函数关于树的负梯度作为残差的近似,XGBoost则在梯度基础上增加了二阶项作为损失函数的近似。
提升树更新:
损失函数可以写成:
对在处进行泰勒二阶展开:
其中gi为,hi为
展开为了得到近似的损失函数,损失函数是关于的函数,为之前模型的损失,与无关,所以近似的损失函数为后面三项之和。这里也可以看出对于GBDT来说,只考虑了一阶导数项,是关于损失函数的一阶近似,而XGBoost是采用的是关于损失函数的二阶近似,会更快收敛。
正则项:
正则项第一项为叶节点数量,第二项为叶子节点对应的值,叶子节点尽量少且值尽量小,保证值数量少而集中,减少潜在的树层次,提高精度以及计算速度?
对于一个确定结构的回归树来说,可以求得损失最小的情况下的最优回归值:
此时的最小损失为:
回归树的构建策略:
确定最优的树结构是NP难问题,所以不能通过先确定树结构再来求解最优回归值的方式,只能还是用贪心法,不一样的是衡量分裂节点前后的增益计算有所不同,采用打分函数:
考虑最小损失函数中的每个叶子对总体损失的贡献部分,这部分越大损失函数越小,这部分越小,损失函数越大,所以只有在这部分的值变大时,才是值得分裂的,假设选定了节点的某一个位置进行分裂,分成左边一部分,右边一部分。
Gain值越大,说明这一节点越值得分裂,遍历所有的特征/变量,计算对应的Gain,选择Gain值最大的进行分裂,分裂成多部分时,在计算Gain时要每次针对分裂点,看成两部分,从而得到多个gain值
树节点的分裂方法:
- 暴力枚举:遍历所有特征的所有可能的分割点,计算gain,找到最大的点去分割;
- 近似方法:对于每个特征,只考虑几个特定的分位点,从而减少计算量;
- 二阶导数(XBGoost):以二阶导数值作为参考划分点,因为二阶导数对损失函数有加权作用,所以二阶导数变化比较大时,损失函数变化也比较大,以变化较大的点作用切分点,切分形成区域内比较平稳,适合推选出回归值;
- 直方图算法(LightGBM);