梯度提升树是Boosting家族的一员.个体学习器被定为CART回归树.
假设用提升树拟合价值100万的房子,第一个回归树拟合80万,残差20万,再用第二个树12万去拟合剩下残差,这时残差8万,再用第三个树5万去拟合剩下的残差,现在残差3万,如果仍不满意还可以继续下去,直到满意为止.
对比一下Boosting家族的另一种算法Adaboost,我在另一篇文章集成学习中介绍过他,Adaboost在训练个体学习器的时候,会根据上一个个体学习器的结果,将错误分类样本的权重提升,最终达到总体分类效果最好.
提升树与Adaboost即又相同之处,又有不同之处.相同点在于都是用更多的基学习器来弥补前面学习器的不足.不同点在于,Adaboost是通过调整样本权重来训练后面的学习器,而提升树是通过拟合残差来训练后面的学习器.
提升树也是采用加法模型:
采用平方损失函数:
结合上面两式有:
于是损失函数最小,只需使当前决策树拟合当前残差即可:
平方损失函数的残差很好计算,但是对于一般的损失函数就不那么好计算了.
这里可以把残差当成一个函数,我们可以使用梯度下降的方法找到最小的.
对于一颗树,损失函数是相当于关于的函数,若想是损失函数减小,可以参考类似梯度下降的方法:
现在增加另外一棵树,相当于:
这相当于新增加的树为当前模型的负梯度:
对比上一种方法回归树用来拟合残差,也就有了负梯度是残差的近似值的说法.
提升树不仅能解决回归问题,也能解决分类问题,相应的损失函数会有所不同.来看一下常见的损失函数有哪些.
指数损失函数通常用来处理二分类问题:
对数损失函数有二元和多元两种,对应二元逻辑回归和多元逻辑回归.
二元对数损失函数:
多元对数损失函数:
用于处理回归问题.
和平方损失函数差不多,只不过损失不会被平方放大.
XGBoost的全称是eXtreme Gradient Boosting,它是GBDT的一个C++实现,并能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它相对于传统的GBDT部分增强功能如下:
XGBoost相对GBDT的提升还是很大的,如果你想用提升树的话,直接用XGBoost吧.
参考:
李航<统计学习方法>