机器学习 - 一文理解 GBDT 的原理 -20171001
|
现在网上介绍 gbdt 算法的文章并不算少,但总体看下来,千篇一律的多,能直达精髓的少,有条理性的就更稀少了。我希望通过此篇文章,能抽丝剥茧般的向初学者介绍清楚这个算法的原理所在。如果仍不清楚可以在文后留言。 1、如何在不改变原有模型的结构上提升模型的拟合能力
假设现在你有样本集
既然不能更改原来模型的参数,那么意味着必须在原来模型的基础之上做改善,那么直观的做法就是建立一个新的模型 2、基于残差的 gbdt
在第一部分,
我们知道 gbdt 的全称是 Gradient Boosting Decision Tree,其中 gradient 被称为梯度,更一般的理解,可以认为是一阶导,那么这里的残差与梯度是什么关系呢。在第一部分,我们提到了一个叫做平方损失函数的东西,具体形式可以写成
损失函数的一阶导:
正好残差就是负梯度:
3、为什么基于残差的 gbdt 不是一个好的选择 基于残差的 gbdt 在解决回归问题上不算是一个好的选择,一个比较明显的缺点就是对异常值过于敏感。我们来看一个例子:
很明显后续的模型会对第 4 个值关注过多,这不是一种好的现象,所以一般回归类的损失函数会用绝对损失或者 huber 损失函数来代替平方损失函数:
4、Boosting 的加法模型 如前面所述,gbdt 模型可以认为是是由 k 个基模型组成的一个加法运算式:
其中 F 是指所有基模型组成的函数空间。
那么一般化的损失函数是预测值
更一般的,我们知道一个好的模型,在偏差和方差上有一个较好的平衡,而算法的损失函数正是代表了模型的偏差面,最小化损失函数,就相当于最小化模型的偏差,但同时我们也需要兼顾模型的方差,所以目标函数还包括抑制模型复杂度的正则项,因此目标函数可以写成:
其中 对于 Boosting 来说,它采用的是前向优化算法,即从前往后,逐渐建立基模型来优化逼近目标函数,具体过程如下:
那么,在每一步,如何学习一个新的模型呢,答案的关键还是在于 gbdt 的目标函数上,即新模型的加入总是以优化目标函数为目的的。
我们以第 t 步的模型拟合为例,在这一步,模型对第
其中
即此时最优化目标函数,就相当于求得了 5、什么是 gbdt 的目标函数
我们知道泰勒公式中,若
那么在等式(1)中,我们把
其中
由于在第 t 步
所以我么只要求出每一步损失函数的一阶和二阶导的值(由于前一步的 6、如何用决策树来表示上一步的目标函数
假设我们 boosting 的基模型用决策树来实现,则一颗生成好的决策树,即结构确定,也就是说树的叶子结点其实是确定了的。假设这棵树的叶子结点有
那么
如果决策树的复杂度可以由正则项来定义
我们假设
即我们之前样本的集合,现在都改写成叶子结点的集合,由于一个叶子结点有多个样本存在,因此才有了
定义
如果树的结构是固定的,即
目标函数的值可以化简为:
7、如何最优化目标函数 那么对于单棵决策树,一种理想的优化状态就是枚举所有可能的树结构,因此过程如下:
a、首先枚举所有可能的树结构,即 b、计算每种树结构下的目标函数值,即等式 7 的值;
c、取目标函数最小(大)值为最佳的数结构,根据等式 6 求得每个叶子节点的 但上面的方法肯定是不可行的,因为树的结构千千万,所以一般用贪心策略来优化: a、从深度为 0 的树开始,对每个叶节点枚举所有的可用特征 b、 针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(采用最佳分裂点时的收益) c、 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集 d、回到第 1 步,递归执行到满足特定条件为止
那么如何计算上面的收益呢,很简单,仍然紧扣目标函数就可以了。假设我们在某一节点上二分裂成两个节点,分别是左(L)右(R),则分列前的目标函数是
等式 8 计算出来的收益,也是作为变量重要度输出的重要依据。 所以 gbdt 的算法可以总结为: a、算法在拟合的每一步都新生成一颗决策树;
b、在拟合这棵树之前,需要计算损失函数在每个样本上的一阶导和二阶导,即
c、通过上面的贪心策略生成一颗树,计算每个叶子结点的的
d、把新生成的决策树
|
时间:2020-01-01 00:58 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。