http://blog.csdn.net/u011239443/article/details/77435463
Adaptive Boosted Decision Tree
关于AdaBoost、提升树可先参阅:http://blog.csdn.net/u011239443/article/details/77294201 这里仅对其做一定的补充。 对提升决策树桩的模型中,我们对树的节点进行分隔时,需要该节点中的各个数据的权重来计算总错误:
代码语言:javascript复制weightedError = D.T * errArr
树根比较好算,数据都是全量的数据,但是如果是非根的叶节点呢?这就是困难了。于是,我们就想到了变动数据集方法:
比如说,某条数据的权重是0.1,我们就似的样本抽取到它的概率变为0.1。
AdaBoost优化背后的意义
unt 1u_n{t 1}为第n个数据,t 1轮优化的权重
我们把上述橙色部分叫做voting score
我们回过头来看模型,并套用SVM的形式:
套用SVM,我们可知我们需要对模型的优化是:
于是,我们得到了AdaBoost的损失函数:
使用梯度下降的方法,调整最后g(也就是h),来最小化误差:
使用泰勒展开:
使得损失函数等价为:
于是,我们只需最小化:
得到:
我们可以看到,我们选择的h是要使得其预测率最小则结果最优。这就把问题转移到了函数h的最优化的问题了,这就变成了我们非常熟悉的问题,比如 如果是 AdaBoost Decision Tree,那就用决策树回归最优化h就行了。
然后我们来调整 η,设gtg_t就是我们的最优化h,那么最优化问题变成了:
我们对其求导,最优化得到:
对,没有错!AdaBoost中的 α 的含义其实就是在最优化g函数梯度下的最优化的步长!
Gradient Boosting
我们上节套用SVM来得出Adaboost的损失函数:
但其实我们可以用其他误差来得出损失函数,这就是叫做Gradient Boosting,通常使用差方来得到:
对上式进行关于S在SnS_n上泰勒展开:
即上式中 x = s , x0=Snx_0 = Sn得到了:
由于我们想让η来调节步长,而h函数只是决定方向,所以需要让h(x)h(x)为负数,但是绝对值又要尽可能的小,于是优化问题变成了:
可以看出我们的h其实是最优化回归:
也就是说,h是想把输入特征,回归拟合输出为实际值和上一轮模型预测值差值。
同样的,假设我们已经找到最佳的回归函数g,接下来调整η:
可以看到,这也是一个简单的一元回归:
总结GBDT模型如下:
总结集成模型
bagging 和 boosting 加上 决策树 可以分别得到:
为什么集成方法效果好?因为它有很多不同的模型表示,所以表达能力非常好,避免的欠拟合;而又是因为有很多模型混合,所以避免的某些模型的过拟合。