GBDT 算法
GBDT (Gradient Boosting Decision Tree) 梯度提升迭代决策树。GBDT 也是 Boosting 算法的一种,但是和 AdaBoost 算法不同(AdaBoost 算法上一篇文章已经介绍);区别如下:AdaBoost 算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT 也是迭代,但是 GBDT 要求弱学习器必须是 CART 模型,而且 GBDT 在模型训练的时候,是要求模型预测的样本损失尽可能的小。
GBDT 直观理解:每一轮预测和实际值有残差,下一轮根据残差再进行预测,最后将所有预测相加,就是结果。
![](https://upload-images.jianshu.io/upload_images/7155422-5f9eeadbc73d93c6.png?imageMogr2/auto-orient/strip|imageView2/2/w/1120/format/webp)
GBDT 模型可以表示为决策树的加法模型:
![](https://upload-images.jianshu.io/upload_images/7155422-aa7e5ff5691626fe.png?imageMogr2/auto-orient/strip|imageView2/2/w/257/format/webp)
其中,T(x;θm)表示决策树;θm 为决策树的参数; M为树的个数。
采用前向分布算法, 首先确定初始提升树 fo(x) = 0, 第 m 步的模型是:
![](https://upload-images.jianshu.io/upload_images/7155422-dfba5947c0190521.png?imageMogr2/auto-orient/strip|imageView2/2/w/318/format/webp)
通过经验风险极小化确定下一棵树的参数:(其实就是让残差尽可能的小找到最优划分点)
![](https://upload-images.jianshu.io/upload_images/7155422-6f48fc48a90d0770.png?imageMogr2/auto-orient/strip|imageView2/2/w/466/format/webp)
这里的 L() 是损失函数,回归算法选择的损失函数一般是均方差(最小二乘)或者绝对值误差;而在分类算法中一般的损失函数选择对数函数来表示
GBDT 既可以做回归也可以做分类,下面先描述一下做回归的算法流程:
已知一个训练数据集 T = {(x1,y1),(x2,y2),...,(xn,yn)}, 如果将训练集分为不同的区域 R1,R2,...,Rn,然后可以确定每个区域输出的常识 c,c 的计算是将每个区域的 y 值相加再除以 y 的个数,其实就是求一个平均值。树可以表示为:
![](https://upload-images.jianshu.io/upload_images/7155422-1eaef61ee3b3ef8d.png?imageMogr2/auto-orient/strip|imageView2/2/w/276/format/webp)
然后通过下图方式来确定具体分割点:
![](https://upload-images.jianshu.io/upload_images/7155422-967e7cef3bc6605f.png?imageMogr2/auto-orient/strip|imageView2/2/w/501/format/webp)
我将李航的统计学方法里面的例子粘出来,就知道提升树是如何计算的了:
![](https://upload-images.jianshu.io/upload_images/7155422-3cb3fdb2460f2083.png?imageMogr2/auto-orient/strip|imageView2/2/w/553/format/webp)
![](https://upload-images.jianshu.io/upload_images/7155422-f987f04574be09e9.png?imageMogr2/auto-orient/strip|imageView2/2/w/442/format/webp)
以上就是 GBDT 选择分割点的过程, 如果特征有多个的话也是一样的道理,选择特征和特征值使得误差最小的点,作为分割点。所以其实 GBDT 也可以用作特征选择,通过GBDT 可以将重要的特征选择出来,当特征非常多的时候可以用来做降维。然后再融合类似逻辑回归这样的模型再进行训练。