在学习GBDT之前,先补(1)(2)两条基础知识,笔者就是因为这几个基础点的记忆不正确,导致理解起来困难重重。
(1) 梯度:梯度是什么
一句话:函数在梯度处,变化最快。(不用管方向)
参考网址: 梯度_百度百科
设二元函数 在平面区域D上具有一阶连续偏导数,则对于每一个点
都可定出一个向量 ,该函数就称为函数 在点
的梯度,记作
或
。
在单变量的实值函数的情况,梯度只是导数,或者,对于一个线性函数,也就是线的斜率。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
总之,现在知道了:函数在梯度处,变化最快。(不用管方向)
2)梯度下降:梯度的方向是什么
梯度的方向:函数值在该点处,方向导数最大,沿梯度方向能取到最大值。
自变量x向 梯度方向移动,函数值f(x)都会增加。
自变量x向负梯度方向移动,函数值f(x)都会减小。
参考网址:梯度下降_百度百科
现在让我们看看梯度是什么方向的。
梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)
其迭代公式为
,其中
代表梯度负方向,
表示梯度方向上的搜索步长。
举一个非常简单的例子,如求函数
的最小值。
利用梯度下降的方法解题步骤如下:
1、求梯度
,
2、向梯度相反的方向(即负梯度方向)移动 ,如下
,其中,
为步长。
在这个例子中,当
为负数时,梯度为负值,
为正值,所以
向原点移动,函数值
减小。
当
为正数时,梯度为正值,
为负值,所以
向原点移动,函数值
减小。
即无论什么时候,向负梯度方向移动,
值都会减小。
如果是梯度提升呢?即
当 为负数时,梯度为负值, 为负值,所以 向 方向移动。
当 为正数时,梯度为正值, 为正值,所以 向 方向移动。
即无论什么时候,向梯度方向移动,函数值 都会增加。
提升方法(Boosting)——>提升树(Boosting Tree)——>梯度提升树(Gradient Boosting Decision Tree)
参考文献:《统计学习方法—李航》
1 回归树
结合《机器学习》周志华中的P83决策树连续值处理思考。
下面的内容参考自:决策树(分类树、回归树)
回归树与分类树的区别:
2 提升树
提升树(Gradient Boosting Decison Tree, 简称GBDT)是一种提升(Boosting)方法,以分类树或回归树作为基本分类器。所以属于Boosting族算法中的一
种。
2.1 提升树模型
2.2 提升树算法
备注:式(8.26)中的 表示单位向量,在后面的示例
以残差作为下一轮输入
2.3 梯度提升
梯度提升算法解释:
(1)初始化:将常量c初始化为
和的平均值,即
。参考3 GBDT工作过程实例。
(2)
(a)求损失函数在当前自变量
处的梯度,再取负数,即负梯度方向。
(b)用(a)中的负梯度值拟合一个回归树,得到这棵回归树的叶结点区域
。
(c)通过最小化当前的损失函数,并求得每个叶子节点中的输出值
,
表示第
个叶子节点。怎么搜索呢,线性搜索,也就是从头到尾搜索,参考线性搜索_百度百科。
(d)
用负梯度的值作为残差的近似值:
利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值。用负梯度的值拟合回归树。(注:鄙人私以为,与其说负梯度作为残差的近似值,不如说残差是负梯度的一种特例。)(这是文章末尾参考网址[3]的作者的原话,笔者也觉得,这个“私以为”以为的太贴切了,此处应为其鼓掌。)
为什么需要用负梯度的值,而不用残差呢?
损失函数采用平方误差函数和指数损失函数时是可以用残差的,可是在使用绝对值损失函数或Huber损失函数等时,因为这两种函数为分段函数,优化起来就很麻烦了。所以使用负梯度代替。(???解释的原因暂且这样写,有待商榷。)
提升树和梯度提升树的比较:
GBDT中拟合残差的负梯度为什么是可行的?
使用泰勒展开解释
3 形象理解
梯度提升决策树,其核心思想是,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
我们以一个视频网站的用户画像为例,为了将广告定向投放给指定年龄的用
户,视频网站需要对每个用户的年龄做出预测。在这个问题中,每个样本是一个已知性别/年龄的用户,而特征则包括这个人访问的时长、时段、观看的视频的类型等。
例如用户A的真实年龄是25岁,但第一棵决策树的预测年龄是22岁,差了3
岁,即残差为3。那么在第二棵树里我们把A的年龄设为3岁去学习,如果第二棵树能把A分到3岁的叶子节点,那两棵树的结果相加就可以得到A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在−2岁的残差,第三棵树里A的年龄就变成−2岁,继续学。这里使用残差继续学习,就是GBDT中Gradient Boosted所表达的意思。
Gradient Boosting是Boosting中的一大类算法,其基本思想是根据当前模型损
失函数的负梯度信息来训练新加入的弱分类器,然后将训练好的弱分类器以累加的形式结合到现有模型中。
下图描述了Gradient Boosting算法的基本流程,在每一轮迭代中,首先计算出当前模型在所有样本上的负梯度,然后以该值为目标训练一个新的弱分类器进行拟合并计算出该弱分类器的权重,最终实现对模型的更新。Gradient Boosting算法的伪代码如下图所示。
4 几篇比较好的文章
[1] GBDT:梯度提升决策树
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
[2] 梯度提升树(GBDT)原理小结
GBDT常用损失函数
[3] GBDT:梯度提升决策树