GBDT:Gradient Boosting Decision Tree(梯度增强决策树)以决策树为基学习器的梯度增强集成算法。
集成学习三种主要方法:boosting, bagging, stacking
boosting通过分步迭代来构建模型。
梯度提升方法:通过在迭代的每一步沿着梯度最陡方向降低损失,来构建一个学习器。
优点:
1) 可以设置不同的可微函数处理各类学习任务。
2) 引入bagging思想,加入正则项来抵御训练数据中的噪音,减轻异常值的影响。
bagging思想:并行式集成学习算法的代表。自主采样得到 T T T个包含 m m m个样本的采样集。基于每个采样集训练出一个基学习器,再将基学习器进行结合。
前向分布算法
-
加法模型
y i ^ = ∑ k = 1 k f k ( x i ) , f ( k ) ∈ F F 为 所 有 树 组 成 的 函 数 空 间 \hat{y_i} = \sum^k_{k=1}f_k(x_i), \quad f(k) \in F \\ ~\\ F为所有树组成的函数空间 yi^=k=1∑kfk(xi),f(k)∈F F为所有树组成的函数空间模型参数为 Θ = { f 1 , f 2 … f k } \Theta = \left \{ f_1, f_2 … f_k \right \} Θ={f1,f2…fk},加法模型不是 d d d维向量空间的权重,而是基学习器(GBDT中是决策树)的集合。
加法模型的目标函数为:
o b j = ∑ i = 1 n l ( y i , y i ^ ) + ∑ k = 1 k Ω ( f k ) n 为 训 练 样 本 个 数 k 为 基 学 习 器 的 个 数 obj = \sum^n_{i=1}l(y_i, \hat{y_i}) + \sum^k_{k=1}\Omega(f_k) \\ ~\\ n为训练样本个数\\ k为基学习器的个数 obj=i=1∑nl(yi,yi^)+k=1∑kΩ(fk) n为训练样本个数k为基学习器的个数
l ( y i , y i ^ ) l(y_i, \hat{y_i}) l(yi,yi^)为损失函数, Ω ( f k ) \Omega(f_k) Ω(fk)衡量决策树的复杂度 -
前向分布算法
含义:从前往后,每次只学习一个基学习器,使它逼近目标函数(每步只优化损失函数 l ( y i , y i ^ ) l(y_i, \hat{y_i}) l(yi,yi^)。)步骤:
- 初始化基学习器 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
- 对于 k = 1 , 2 , 3 … K k = 1, 2, 3…K k=1,2,3…K,极小化损失函数
- 得到基学习器的系数和参数
- 更新损失函数
负梯度拟合
负梯度可表示为:
r
k
i
=
[
∂
l
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
k
i
表
示
第
k
轮
的
第
i
个
样
本
r_{ki} = [\frac{\partial l(y_i, f(x_i))}{\partial f(x_i)}]\\ ~\\ ki表示第k轮的第i个样本
rki=[∂f(xi)∂l(yi,f(xi))] ki表示第k轮的第i个样本
原理:
每次迭代,往坡度(也就是该点处斜率)的反方向向前一步,这样使得每次损失函数下降的幅度最大。
损失函数
在boosting中,损失函数必须为可微函数,这样才能得到其梯度。
在不同的任务中有不同的的损失函数:
回归
从上表可以看到,回归任务有三种主要的损失函数,分别是平方损失函数 1 2 [ y i − y i ^ ] 2 \dfrac{1}{2}[y_i - \hat{y_i}]^2 21[yi−yi^]2,绝对值损失函数 ∣ y i − y i ^ ∣ |y_i - \hat{y_i}| ∣yi−yi^∣,和 H u b e r Huber Huber函数。
流程:
1. 初始化弱分类器
2. 每次迭代
t
=
1
,
2
,
3
,
…
T
t = 1,2,3,…T
t=1,2,3,…T,对每个样本
i
=
1
,
2
,
3
…
n
i = 1,2,3…n
i=1,2,3…n,计算负梯度:
r
i
n
=
−
[
∂
l
(
y
i
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_{in} = -[\frac{\partial l(y_i, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)}
rin=−[∂f(xi)∂l(yi,f(xi))]f(x)=fm−1(x)
得到
r
t
i
r_{ti}
rti,利用
(
x
i
,
r
t
i
)
(x_i, r_{ti})
(xi,rti),拟合一个决策树,得到第
t
t
t 棵回归树,对应叶子节点区域为
R
t
j
=
1
,
2
,
…
J
R_{tj} = 1,2,…J
Rtj=1,2,…J。
J
J
J为第
t
t
t 轮回归树的叶子节点的个数。
3. 对叶子区域
j
=
1
,
2
,
3
,
…
J
j = 1,2,3,…J
j=1,2,3,…J 计算最佳拟合值
4. 更新强学习器
二分类,多分类
-
二分类
使用对数似然损失函数:
l ( y i , f ( x ) ) = l o g ( 1 + e x p ( − y f ( x ) ) ) y 为 真 实 值 标 签 , 在 这 里 二 分 类 中 , y ∈ { + 1 , − 1 } l(y_i, f(x)) = log(1 + exp(-yf(x))) \\ ~\\ y为真实值标签,在这里二分类中,y \in \{+1, -1 \} l(yi,f(x))=log(1+exp(−yf(x))) y为真实值标签,在这里二分类中,y∈{+1,−1}
这时的负梯度误差为:
r t i = y i 1 + e x p ( y f ( x ) ) r_{ti} = \frac{y_i}{1+exp(yf(x))} rti=1+exp(yf(x))yi
对于生成的决策树,得到各个叶子节点的最佳残差拟合值:
c t j = a r g m i n ⎵ c ∑ x i ∈ R i j l o g ( 1 + e x p ( y i ( f t − 1 ( x i ) + c ) ) ) c_{tj} = \underbrace {arg\ min}_c \sum_{x_i \in R_{ij}} log(1+ exp(y_i(f_{t-1}(x_i)+c))) ctj=c arg minxi∈Rij∑log(1+exp(yi(ft−1(xi)+c)))
上式可近似为:
c t j = ∑ x i ∈ R i j r t i / ∑ x i ∈ R i j ∣ r t i ∣ ( 2 − ∣ r t i ∣ ) c_{tj} = \sum_{x_i \in R_{ij}} r_{ti}/ \sum_{x_i \in R_{ij}} |r_{ti}|(2-|r_{ti}|) ctj=xi∈Rij∑rti/xi∈Rij∑∣rti∣(2−∣rti∣) -
多元分类
假设类别总数为 K K K,对数似然损失函数为:
l ( y i , f ( x ) ) = − ∑ k = 1 K y k l o g p k ( x ) p k ( x ) 为 x 分 为 第 k 类 的 概 率 , p k ( x ) 可 写 为 : p k ( x ) = e x p ( f ( x ) ) / ∑ l = 1 K e x p ( f l ( 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 ) l(y_i, f(x)) = - \sum^K_{k=1} y_k log\ p_k(x) \\ ~\\ p_k(x)为x分为第k类的概率,p_k(x)可写为:\\ ~\\ p_k(x) = exp(f(x))\ / \sum^K_{l=1}exp(f_l(x)) \\ ~\\ 可以写出第t轮第i个样本对应类别l的负梯度误差为: \\ ~\\ r_{til} = -[\frac{\partial l(y_i, f(x_i))}{\partial f(x_i)}]_{f_k(x) = f_{l,t-1}(x)} \\ = y_{il} - p_{l, t-1}(x_i) \\ l(yi,f(x))=−k=1∑Kyklog pk(x) pk(x)为x分为第k类的概率,pk(x)可写为: pk(x)=exp(f(x)) /l=1∑Kexp(fl(x)) 可以写出第t轮第i个样本对应类别l的负梯度误差为: rtil=−[∂f(xi)∂l(yi,f(xi))]fk(x)=fl,t−1(x)=yil−pl,t−1(xi)
误差就是样本 i i i对应的类别 l l l 的真实概率和 t − 1 t-1 t−1 轮预测概率的差值。得到各个叶子节点最佳残差拟合值:
c t j l = K − 1 K ∑ x i ∈ R t i 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_{x_i \in R_{til}}r_{til}}{\sum_{x_i \in R{til}}|r_{til}| (1-|r_{til}|)} ctjl=KK−1∑xi∈Rtil∣rtil∣(1−∣rtil∣)∑xi∈Rtilrtil
正则化
三种方式:learning_rate, subsample, min_samples_split。
-
learning_rate学习率
f k ( x ) = f k − 1 ( x ) + v h k ( x ) f_k(x) = f_{k-1}(x)+vh_k(x) fk(x)=fk−1(x)+vhk(x)
v v v为学习率,一个小的学习率可以显著提高模型的泛化能力,较大的学习率会导致预测性出现较大波动。 -
subsample子采样比例
借鉴自bagging思想。每一轮迭代中,新的决策树拟合的是原始训练集中的一个子集的残差。子集来自对原训练集无放回随机采样而来。
优缺点
- 优点
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 使用了一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
- 充分考虑的每个分类器的权重。
- 缺点
由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
sklearn参数
- n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
- learning_rate: 即每个弱学习器的权重缩减系数,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为。的取值范围为。对于同样的训练集拟合效果,较小的意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的开始调参,默认是1。
- subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。
- init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的,如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
- loss: 损失函数。(1)对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。(2)对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。
- alpha:当使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值
应用场景
回归任务
分类任务:二分类和多分类
重要参考:
GBDT算法原理深入解析
【机器学习算法总结】GBDT