GBDT和Xgboost总结

首先从Xgboost的优点说起,从网上搜,很容易搜到Xgboost与一般梯度提升树比, 一个是用了泰勒级数的二次项,一个是增加了惩罚系数,对树的复杂度进行惩罚。

那么问题来了。如果你看李航老师的统计学习方法,里面似乎没有看到泰勒级数,倒是看到了负梯度,拟合附梯度。而传统的树,你制作完成了,也有剪枝的过程。那么xgboost这个二次项体现在哪里?

首先一个问题。泰勒级数这么优美的公式,为啥唯独在梯度提升树里应用这么广泛,其他地方虽然也提及,但是远不如GBDT里多。这是为什么?

回忆一f(x+Δx) = f(x) + f'(x)Δx + f''(x)Δx^{2}}Δx^{2}/2

Δx,是不是?恰好与梯度提升里,每个步骤推进也好,每次加一颗树叶罢,其实把新增的这一步或者这一颗树看成是Δx,那就是泰勒展开了。

对于新增的这个f^{T}(x)第T颗树而言的损失函数,前面的f^{T-1}(x)都是已经计算完成的,可以看成是常数。泰勒里面的f(x)相当于f^{T-1}(x)对应的损失函数,Δx相当于f^{T}(x)

一般的提升树,对上一轮的残差进行学习。GBDT是对负梯度提升进行学习,为什么要学梯度,还必须是负数?如果Δx是负梯度的话,那与f'(x)相乘,恰好是-Δx^{2},一个平方的负数就肯定小于0。之前学习到的f(x) + 一个小于等于0的数,f(x)又是之前的损失,那就意味着,按照负梯度方向学习,一定能减少损失。 这就是一般的GBDT。那么此时,GBDT学的是什么呢?既然Δx确定了,实际是在f'(x)Δx前面加了一个系数A,学习的是这个A,这也可以看做是最后那个整体树的结构,每颗树之间不是简单的累加,是通过A累加起来的。这就跟李航老师那本树里GBDT学习负梯度的方法对应起来了

接下来说Xgboost。Xgboost增加了二次项。一方面当然是拟合的更准确了。另一方面更重要的是方便求极值点。为什么二次型容易求极值点???   怎么求极值?  对,用求导!!!  二次型y = ax^{2} + bx +c求导完,就是2ax+b = 0  ,x = -b/2a。就这么方便。

至于复杂度Ω,其实也容易理解,这里不想赘述了。总之就是叶子越少越少,w的和越小越好。为啥w的平方和越小越好,可以参考本老另一片博客里关于深度学习里正则化的描述。叶子越少越少还是比较容易接受的,奥卡姆嘛,越简单的物理公式描述出来,就越接近真相。

关于Xgboost的另一个优点,快。一个是他采用了CART,这个本身就快。再一个是每个叶子节点可以分别并行的计算。我们刚才二次型的求极值点,用到的只是与前一轮树的关系,并没有依赖于树内部的任何参数,那么好了,怎么找最佳的分裂点?用穷举,挨个蒙。那么叶子节点就可以分布式的并行计算。

发布了15 篇原创文章 · 获赞 6 · 访问量 4970

猜你喜欢

转载自blog.csdn.net/becgiggs/article/details/88103206