先缕一缕几个关系:
- GBDT是gradient-boost decision tree
- GBDT的核心就是gradient boost,我们搞清楚什么是gradient boost就可以了
- GBDT是boost中的一种方法,boost还有XGBoost,adaboost。
基本概念
【Boost】就是让多个弱分类器,通过不同的集成方式,来让多个弱分类器变成一个强分类器。
【gradient-boost】 梯度提升。简单的说,先训练一个弱分类器,然后弱分类器和目标值之间的残差,作为下一个弱分类器训练的目标值。这里有一个非常简单的例子
- 第一个模型预测年龄,虽然真实值是30岁,第一个模型只给出了20岁的估计值;
- 第二棵树要预测的就是这个10岁的残差,但是第二棵树只给出了6岁的估计值;
- 第三棵树预测的是第二棵树的4岁的残差,但是………………(禁止套娃)
梯度 or 残差 ?
对于GBDT,网上的很多文章都没有讲清楚,学习梯度还是学习残差?从上面的那个例子来看,是学习残差的。
其实,从来GBDT都是学习梯度的,学习残差只是学习梯度的一个特例!
如果我们是在做一个回归任务(就像是上面例子中预测年龄),采用平方损失:
l
o
s
s
=
1
2
∑
i
n
(
y
i
−
y
i
^
)
2
loss = \frac{1}{2}\sum^n_i{(y_i-\hat{y_i})^2}
loss=21∑in(yi−yi^)2
其中
y
i
y_i
yi是真实数值,
y
i
^
\hat{y_i}
yi^是模型预测的值。
然后想求取这个关于
y
i
^
\hat{y_i}
yi^的梯度,那就是:
∂
l
o
s
s
∂
y
i
^
=
(
−
1
)
(
y
i
−
y
i
^
)
\frac{\partial loss}{\partial \hat{y^i}}=(-1)(y_i-\hat{y_i})
∂yi^∂loss=(−1)(yi−yi^)
所以残差在平方损失的情况下,就是等于负梯度,所以两者一回事。
残差过于敏感
对于数据不干净,没有清晰掉异常值的数据样本。使用平方损失对异常值过于敏感了:
所以,这里在回归问题中,也可以考虑使用下面的两个损失函数:
-
Absolute loss:
l o s s = ∣ y − y ^ ∣ loss=|y-\hat{y}| loss=∣y−y^∣ -
Huber loss:
这个是设置一个阈值,当 ∣ y − y ^ ∣ |y-\hat{y}| ∣y−y^∣小于这个阈值的时候,采用平方损失,当 ∣ y − y ^ ∣ |y-\hat{y}| ∣y−y^∣大于这个阈值的时候,采用类似于绝对损失的线性损失:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PviLKEw-1592767763300)(http://helloworld2020.net/wp-content/uploads/2020/06/wp_editor_md_0a7adb4ce0211585abe60c1c177e9b28.jpg)]
这里看一下huber loss的函数图像:
就是一个平方损失,一个线性损失。
然后看一下平方损失,绝对损失,huber损失对于异常值的容忍程度:
CART回归树分裂思路(可不看)
其实这个问题看起来问的不明所以,其实是问你决策树如何选择特征的。从上面的例子可以看出来,GDBT应该是处理回归问题的(处理连续数据的)。当然,GDBT也有办法处理分类问题,只是这里就不说了,这里主要说GDBT怎么处理回归问题的,回归问题能处理,那么总有回归离散化的办法的
这个问题是在问:CART TREE如何选择特征的CART TREE就是回归决策树,就是之前提到的弱分类器。
一个决策树,希望读者已经有一个大概的理解了。简单说就是:样本可以根据的特征A是否超过某一个阈值划分成两部分,然后划分之后的每一个部分又可以根据某一个特征是否超过某一个阈值再分成两部分……
这样我们就要做出选择了:每一个部分是根据哪一个特征去划分?根据这个特征的哪一个数值作为阈值划分?
如果我们算力无穷,那么自然可以遍历每一个特征,然后穷举每一种可能的分割点,然后对比找到最优分割点。
那么如何判断分割的点的好坏呢?得给出一个cost函数,或者叫做loss函数这样的东西吧。
l o s s = ∑ 第 一 部 分 ( y i − m e a n ( y 第 一 部 分 ) ) 2 + ∑ 第 二 部 分 ( y i − m e a n ( y 第 二 部 分 ) ) 2 loss= \sum_{第一部分}{(y_i-me an(y_{第一部分}))^2}+\sum_{第二部分}{(y_i-mean(y_{第二部分}))^2} loss=∑第一部分(yi−mean(y第一部分))2+∑第二部分(yi−mean(y第二部分))2
看一下这个公式,我把公式写的太丑了。其实这个公式非常的好理解:现在根据某一个特征值,根据某一个阈值把样本分成了两个部分:第一部分和第二部分。然后计算每一个部分的样本的label的均值,也就是公式中的: m e a n ( y 第 一 部 分 ) mean(y_{第一部分}) mean(y第一部分), m e a n ( y 第 二 部 分 ) mean(y_{第二部分}) mean(y第二部分),然后计算第一部分中所有样本的label与第一部分label均值之间的差的平方和,同样的过程计算第二个部分的,两个相加起来就是这个loss。选择能够让这个loss最小的分割特征和分割阈值,就是我们要找的东西。
其实我在学这一块的时候,发现这个过程像是什么?像不像聚类算法,通过上面的loss的最小化的过程,把一堆样本分成两类,让两类的类内距离最小。那个均值就像是求类中心点,计算每一个label距离类中心点的距离。(这一段看不懂也没事)
喜欢的话,可以微信扫码关注微信公众号【机器学习炼丹术】,成为炫酷的炼丹师吧~
公众号回复【下载】有精选的免费机器学习学习资料。 公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~
- 【机器学习的基础数学(PDF)】
- 【竞赛中的大数据处理流程(PDF)】
- 【如何做大数据的基础特征工程(PDF)】
- 【自然语言处理NLP的应用实践大合集(PDF)】
- 【python入门级教材(400页PDF)】
公众号每天会更新一个机器学习、深度学习的小知识,都是面试官会问的知识点哦~