谈过了AdaBoost,就不由得要谈到提升树,谈到提升树,就不得不提到梯度提升树。
提升树(boosting tree)。对于二类分类的算法,决策树内部为CART分类树,此时就为AdaBoost基学习器为CART分类树的特殊情况;对于回归问题,提升树内部决策树是二叉回归树,在每次迭代中通过拟合当前模型的残差生成一个新的回归树,并与之前的弱学习器结合生成新的强学习器,若最后生成的强学习器满足误差要求,则为所求的提升树。(与AdaBoost回归的区别在AdaBoost每次迭代通过分类误差率更新样本的权重,并计算alpha值,最终取中位数的alpha对应的弱学习器为强学习器,内部细节请看:AdaBoost)
梯度提升树,GBDT,Gradient Boost Decision Tree;或者GBT(Gradient Boosting Tree),GBRT(Gradient Boosting Reggression Tree), MART(Multiple Additive Reggression Tree),其实都是指的同一种算法。后面简称GBDT。梯度提升树与提升树的区别在于,提升树采用残差,而梯度提升树采取拟合当前模型损失函数的负梯度(在损失函数为均方误差的时候,相当于就是残差,其它误差函数不一定就是残差),来生成一个新的CART回归树。并且在GBDT中,只能使用CART回归树,所以在在GBDT中,结果是累加所有树的结果(不管是回归还是分类问题)
在GBDT的迭代中,假设前一轮得到的强学习器是,损失函数是
,本轮迭代的目标是找到一个CART回归树模型的弱学习器
,让本轮的损失
最小,这里和提升树的思路是一致的;而AdaBoost,则是在每次迭代中找到每个样本的相对误差,最后找到弱学习器的权重系数。
为什么有了提升树还需要梯度提升树
提升树利用加法模型与前向分布算法实现学习的优化过程,当损失函数是平方损失或指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不容易,针对这一问题Friedman在2000年提出了梯度提升方法,该方法是最速下降法的近似方法,利用损失函数的负梯度作为回归树提升问题中残差的近似值,拟合一个回归树。
GBDT的负梯度拟合
第t轮第i个样本的损失函数负梯度表示为
,对应第i个样本x_i。
使用(xi, r_ti)可以拟合出一棵CART回归树,与CART回归树找最佳切分点同理(CART回顾),,只不过此时的y_i被换为了r_ti。对左右节点依次递归,最后得到决策树,其对应的叶子节点区域R_tj,j = 1, 2, ...J,J为叶子节点个数。这就是第t棵回归树。
针对每个叶子节点里的样本,我们求使损失函数最小,也就是拟合叶子节点的输出值c_tj,可以理解为CART回归树通过拟合残差产生叶子节点的过程: