梯度提升树是Boosting家族的一员.个体学习器被定为CART回归树.

回归问题的提升树算法

假设用提升树拟合价值100万的房子,第一个回归树拟合80万,残差20万,再用第二个树12万去拟合剩下残差,这时残差8万,再用第三个树5万去拟合剩下的残差,现在残差3万,如果仍不满意还可以继续下去,直到满意为止.

对比一下Boosting家族的另一种算法Adaboost,我在另一篇文章集成学习中介绍过他,Adaboost在训练个体学习器的时候,会根据上一个个体学习器的结果,将错误分类样本的权重提升,最终达到总体分类效果最好.

提升树与Adaboost即又相同之处,又有不同之处.相同点在于都是用更多的基学习器来弥补前面学习器的不足.不同点在于,Adaboost是通过调整样本权重来训练后面的学习器,而提升树是通过拟合残差来训练后面的学习器.

提升树也是采用加法模型:

采用平方损失函数:

结合上面两式有:

于是损失函数最小,只需使当前决策树拟合当前残差即可:

梯度提升

平方损失函数的残差很好计算,但是对于一般的损失函数就不那么好计算了.

对于一颗树,损失函数是相当于关于的函数,若想是损失函数减小,可以参考类似梯度下降的方法:

现在增加另外一棵树,相当于:

这相当于新增加的树为当前模型的负梯度:

对比上一种方法回归树用来拟合残差,也就有了负梯度是残差的近似值的说法.

常见损失函数

提升树不仅能解决回归问题,也能解决分类问题,相应的损失函数会有所不同.来看一下常见的损失函数有哪些.

指数损失函数

指数损失函数通常用来处理二分类问题:

对数损失函数

对数损失函数有二元和多元两种,对应二元逻辑回归和多元逻辑回归.

二元对数损失函数:

多元对数损失函数:

平方损失函数

用于处理回归问题.

绝对值损失函数

和平方损失函数差不多,只不过损失不会被平方放大.

XGBoost

XGBoost的全称是eXtreme Gradient Boosting,它是GBDT的一个C++实现,并能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它相对于传统的GBDT部分增强功能如下:

  • 显式地将树模型的复杂度作为正则项加在优化目标
  • 公式推导里用到了二阶导数信息,而普通的GBDT只用到一阶
  • 节点分裂算法能自动利用特征的稀疏性
  • 支持分布式计算
  • xgboost工具支持并行

XGBoost相对GBDT的提升还是很大的,如果你想用提升树的话,直接用XGBoost吧.


参考:
李航<统计学习方法>

posted @ 2018-12-24 14:08:50
评论加载中...

发表评论