GBDT
GBDT概述
GBDT也是集成学习Boosting家族的成员,但是却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
先来个通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。
一、前向分布算法
Adaboost的另一种解释:Adaboost算法是“模型为加法模型、损失函数为指数函数、学习算法为前向分布算法”时的二类分类学习方法。
在Adaboost算法中,我们的最终目的是通过构建弱分类器的线性组合来得到最终分类器
在加法模型中:b(x; rm)为基函数,rm是基函数的参数,βm为基函数的系数
对于加法模型,在给定训练数据及损失函数L(y, f(x))的条件下,学习加法模型f(x)就成为经验风险极小化损失函数极小化问题:
这是一个复杂的优化问题,前向分布算法求解这一优化问题的想法是:因为学习的是加法模型,那如果能够从前向后,每一步只学习一个基函数及其系数,然后逐步逼近优化目标式 8.14,那么就可以简化优化的复杂度。每步只需优化如下损失函数:
也就是说每次学习一个基函数(基分类器),只针对这个基分类器进行优化, 使其损失函数最小
前向分布算法过程如下:
前向分布算法将同时求解从m=1到M所有参数Bm rm 的优化问题简化为求解各个Bm rm 的优化问题
二、负梯度拟合
梯度提升树算法:利用最速下降法的近似方法,关键是利用损失函数的负梯度在当前模型的值作为提升树算法中的残差的近似值,拟合一个回归树
负梯度的理解:
GBDT的负梯度就是残差,所以说对于回归问题,我们要拟合的就是残差
三、损失函数
针对不同的提升树学习算法,主要区别在于使用的损失函数不同
损失函数类型 | 解决问题类型 |
---|---|
平方误差损失函数 | 回归问题 |
指数损失函数 | 分类问题 |
一般损失函数 | 决策问题 |
- 均方差,回归损失函数:
L(y,f(x))=(y−f(x))2 - 指数损失函数
L(y,f(x))=exp(−yf(x))
四、回归
回归问题的提升树算法
对残差的理解:
五、二分类、多分类
GBDT分类算法:由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差
主要有两个方法 :
1)指数损失函数,此时GBDT退化为Adaboost算法
2)用类似于逻辑回归的对数似然损失函数的方法
* 二元分类
* 多元分类
二元分类
用类似于逻辑回归的对数似然损失函数,则损失函数为:L(y,f(x))=log(1+exp(−yf(x)))
其中y∈{−1,+1}
此时的负梯度误差为:
r
t
i
=
−
[
∂
L
(
y
,
f
(
x
i
)
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
t
−
1
    
(
x
)
=
y
i
/
(
1
+
e
x
p
(
y
i
f
(
x
i
)
)
)
r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i)))
rti=−[∂f(xi)∂L(y,f(xi)))]f(x)=ft−1(x)=yi/(1+exp(yif(xi)))
对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为:
c
t
j
=
a
r
g
  
m
i
n
⎵
c
∑
x
i
∈
R
t
j
l
o
g
(
1
+
e
x
p
(
−
y
i
(
f
t
−
1
(
x
i
)
+
c
)
)
)
c_{tj} = \underbrace{arg\; min}_{c}\sum\limits_{x_i \in R_{tj}} log(1+exp(-y_i(f_{t-1}(x_i) +c)))
ctj=c
argminxi∈Rtj∑log(1+exp(−yi(ft−1(xi)+c)))
由于上式比较难优化,我们一般使用近似值代替:
c
t
j
=
∑
x
i
∈
R
t
j
r
t
i
/
∑
x
i
∈
R
t
j
∣
r
t
i
∣
(
1
−
∣
r
t
i
∣
)
c_{tj} = \sum\limits_{x_i \in R_{tj}}r_{ti}\bigg / \sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)
ctj=xi∈Rtj∑rti/xi∈Rtj∑∣rti∣(1−∣rti∣)
除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同
多元分类
假设类别数为K,则此时我们的对数似然损失函数为:
L
(
y
,
f
(
x
)
)
=
−
∑
k
=
1
K
y
k
l
o
g
  
p
k
(
x
)
L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x)
L(y,f(x))=−k=1∑Kyklogpk(x)
其中如果样本输出类别为k,则yk=1。第k类的概率pk(x)的表达式为:
p
k
(
x
)
=
e
x
p
(
f
k
(
x
)
)
/
∑
l
=
1
K
e
x
p
(
f
l
(
x
)
)
p_k(x) = exp(f_k(x)) \bigg / \sum\limits_{l=1}^{K} exp(f_l(x))
pk(x)=exp(fk(x))/l=1∑Kexp(fl(x))
集合上两式,我们可以计算出第t轮的第i个样本对应类别l的负梯度误差为:
r
t
i
l
=
−
[
∂
L
(
y
i
,
f
(
x
i
)
)
)
∂
f
(
x
i
)
]
f
k
(
x
)
=
f
l
,
t
−
1
    
(
x
)
=
y
i
l
−
p
l
,
t
−
1
(
x
i
)
r_{til} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f_k(x) = f_{l, t-1}\;\; (x)} = y_{il} - p_{l, t-1}(x_i)
rtil=−[∂f(xi)∂L(yi,f(xi)))]fk(x)=fl,t−1(x)=yil−pl,t−1(xi)
这里的误差就是样本i对应类别l的真实概率和t−1轮预测概率的差值。对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为:
c
t
j
l
=
a
r
g
  
m
i
n
⎵
c
j
l
∑
i
=
0
m
∑
k
=
1
K
L
(
y
k
,
f
t
−
1
,
l
(
x
)
+
∑
j
=
0
J
c
j
l
I
(
x
i
∈
R
t
j
l
)
)
c_{tjl} = \underbrace{arg\; min}_{c_{jl}}\sum\limits_{i=0}^{m}\sum\limits_{k=1}^{K} L(y_k, f_{t-1, l}(x) + \sum\limits_{j=0}^{J}c_{jl} I(x_i \in R_{tjl}))
ctjl=cjl
argmini=0∑mk=1∑KL(yk,ft−1,l(x)+j=0∑JcjlI(xi∈Rtjl))
一般使用近似值代替:
c
t
j
l
=
K
−
1
K
  
∑
x
i
∈
R
t
j
l
r
t
i
l
∑
x
i
∈
R
t
i
l
∣
r
t
i
l
∣
(
1
−
∣
r
t
i
l
∣
)
c_{tjl} = \frac{K-1}{K} \; \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)}
ctjl=KK−1xi∈Rtil∑∣rtil∣(1−∣rtil∣)xi∈Rtjl∑rtil
除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多元GBDT分类和二元GBDT分类以及GBDT回归算法过程相同
六、正则化
需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式:
- 1、与Adaboost类似的正则化项,即步长(learning rate)
定义为ν,对于前面的弱学习器的迭代:
f k ( x ) = f k − 1 ( x ) + h k ( x ) f_{k}(x) = f_{k-1}(x) + h_k(x) fk(x)=fk−1(x)+hk(x)
我们加上了正则化项,则有:
f k ( x ) = f k − 1 ( x ) + ν h k ( x ) f_{k}(x) = f_{k-1}(x) + \nu h_k(x) fk(x)=fk−1(x)+νhk(x)
ν的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果 - 2、通过子采样比例(subsample)
取值为(0,1],注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。
如果取值为1,则全部样本都使用,等于没有使用子采样。
如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间
使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点 - 3、对于弱学习器即CART回归树进行正则化剪枝
七、优缺点
优点:
- 可以灵活处理各种类型的数据,包括连续值和离散值
- 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数
缺点:
由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行
八、sklearn参数
GBDT的类库弱学习器的重要参数基本来源于决策树类,与DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似
1) 划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"None",意味着划分时考虑所有的特征数;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的"None"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。
2) 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,默认值是3。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
3) 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
4) 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
6) 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
7) 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
九、应用场景
GBDT主要由三个概念组成:
- DT:回归树 Regression Decision Tree
GBDT中的树都是回归树,不是分类树 - GB:梯度迭代 Gradient Boosting
GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量 - Shrinkage
Shrinkage以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001,导致各个树的残差是渐变的而不是陡变的。Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系
GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广,亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)
十、参考资料
《统计学习方法》李航
GBDT原理总结:https://www.cnblogs.com/pinard/p/6140514.html
GBDT调参:http://www.cnblogs.com/pinard/p/6143927.html
应用场景:https://toutiao.io/posts/u52t61/preview