GBDT算法原理以及实例理解
【尊重原创,转载请注明出处】http://blog.****.net/zpalyq110/article/details/79527653
GBDT 的全称是 Gradient Boosting Decision Tree,梯度下降树,在传统机器学习算法中,GBDT算的上TOP3的算法。想要理解GBDT的真正意义,那就必须理解GBDT中的Gradient Boosting 和Decision Tree分别是什么?
1. Decision Tree:CART回归树
没错,GBDT使用的决策树就是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树自始至终都是CART回归树。
对于回归树算法来说最主要的是寻找最佳的划分点,那么回归树中的可划分点包含了所有特征的所有可取的值。在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签也是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能很好的评判数据分散程度。我们希望最佳划分节点能够使得划分得到的两组数据组内的标签值相近,如果每组的方差都很小,这就说明每组的组内相似度很高,确实应该被划分。
取自李航《统计学习方法》回归树伪代码:
从上图可以看出:利用方差寻找最佳划分点,预测值选择决策树的叶子节点中所有样本的真实值的均值。
2. Gradient Boosting: 负梯度——残差
GBDT无疑也是Boosting家族的一员,而Adaboost在Boosting家族很出名,但是GBDT并没有采用Adaboost算法!!!那GBDT中的Boosting是怎么做的呢?
先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
再来 个公式表达:在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是, 损失函数是, 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器,让本轮的损失损失最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
最关键的来了,那这个所谓的损失是什么呢?下表是常见的损失函数:
在上述损失函数中,GBDT选取了相对来说容易优化的损失函数——平方损失。针对怎样去拟合这个损失,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值。第t轮的第i个样本的损失函数的负梯度为:
对应损失函数列表可知,GBDT使用的平方损失,经过负梯度拟合得到了,这就是我们最终要去拟合的,它的另一个名字叫作残差。回到我们上面讲的那个通俗易懂的例子中,第一次迭代的残差是10岁,第二 次残差4岁……
3. GBDT算法流程以及实例详解
上面两节分别将Decision Tree和Gradient Boosting介绍完了,下面将这两部分组合在一起就是我们的GBDT了。先上一张伪代码的图:
算法流程:
1.初始化弱学习器
2.对迭代轮数m=1,2,…M有:
a)对每个样本i=1,2,…,N,计算负梯度,即残差
b)将上步得到的残差作为样本新的真实值,并将数据作为下棵树的训练数据,得到一颗新的回归树其对应的叶子节点区域为。其中为回归树t的叶子节点的个数。
c)对叶子区域计算最佳拟合值
d)更新强学习器
3.得到强学习器
实例详解:
如下表所示:一组数据,特征为年龄、体重,身高为标签值。共有5条数据,前四条为训练样本,最后一条为要预测的样本。
编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签值) |
---|---|---|---|
1 | 5 | 20 | 1.1 |
2 | 7 | 30 | 1.3 |
3 | 21 | 70 | 1.7 |
4 | 30 | 60 | 1.8 |
5(要预测的) | 25 | 65 | ? |
1.初始化弱学习器:
由于此时只有根节点,样本1,2,3,4都在根节点,此时要找到使得平方损失函数最小的参数,怎么求呢?平方损失显然是一个凸函数,直接求导,倒数等于零,得到。
所以初始化时,取值为所有训练样本标签值的均值。,此时得到初始学习器
2.对迭代轮数m=1:
计算负梯度——残差
说白了,就是残差(上面已经解释过了),在此例中,残差在下表列出:
编号 | 真实值 | 残差 | |
---|---|---|---|
1 | 1.1 | 1.475 | -0.375 |
2 | 1.3 | 1.475 | -0.175 |
3 | 1.7 | 1.475 | 0.225 |
4 | 1.8 | 1.475 | 0.325 |
此时将残差作为样本的真实值训练,即下表数据
编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签值) |
---|---|---|---|
1 | 5 | 20 | -0.375 |
2 | 7 | 30 | -0.175 |
3 | 21 | 70 | 0.225 |
4 | 30 | 60 | 0.325 |
接着,寻找回归树的最佳划分节点,遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算方差,找到使方差最小的那个划分节点即为最佳划分节点。
例如:以年龄7为划分节点,将小于7的样本划分为一类,大于等于7的样本划分为另一类。样本1为一组,样本2,3,4为一组,两组的方差分别为0,0.047,两组方差之和为0.047。所有可能划分情况如下表所示:
划分点 | 小于划分点的样本 | 大于等于划分点的样本 | 总方差 |
---|---|---|---|
年龄5 | / | 1,2,3,4 | 0.082 |
年龄7 | 1 | 2,3,4 | 0.047 |
年龄21 | 1,2 | 3,4 | 0.0125 |
年龄30 | 1,2,3 | 4 | 0.062 |
体重20 | / | 1,2,3,4 | 0.082 |
体重30 | 1 | 2,3,4 | 0.047 |
体重60 | 1,2 | 3,4 | 0.0125 |
体重70 | 1,2,4 | 3 | 0.0867 |
以上划分点是的总方差最小为0.0125有两个划分点:年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。
此时还需要做一件事情,给这两个叶子节点分别赋一个参数,来拟合残差。
这里其实和上面初始化学习器是一个道理,平方损失,求导,令导数等于零,化简之后得到每个叶子节点的参数,其实就是标签值的均值。
根据上述划分节点:
样本1,2为左叶子节点,,所以。
样本3,4为左叶子节点,,所以。
此时可更新强学习器
3.对迭代轮数m=2,3,4,5,…,M:
循环迭代M次,M是人为控制的参数,迭代结束生成M棵树
4.得到最后的强学习器:
为了方别展示和理解,我们假设M=1,根据上述结果得到强学习器:
如图所示得到只迭代一次,只有一颗树的GBDT:
5.预测样本5:
样本5在根节点中(即初始学习器)被预测为1.475,样本5的年龄为25,大于划分节点21岁,所以被分到了右边的叶子节点,同时被预测为0.275。此时便得到样本5的最总预测值为1.75。
4. 总结
本文章从GBDT算法的原理到实例详解进行了详细描述,后续的优缺点以及实际应用场景还会更新。希望自己在今后的学习过程中能及时将学到和悟到的东西整理出来,并分享给大家。
参考资料
- 李航 《统计学习方法》
- https://www.cnblogs.com/pinard/p/6140514.html
- https://www.cnblogs.com/ModifyRong/p/7744987.html
- https://www.jianshu.com/p/005a4e6ac775
【尊重原创,转载请注明出处】 http://blog.****.net/zpalyq110/article/details/79527653