GBDT简介
GBDT 是Boosting中的一大类算法,GBDT=Gradient+Boosting Desion Trees。
- BDT
回归树,基本思想是:根据每个基学习器剩余的残差,即损失函数的值。在残差减少的方向上建立一个新的基学习器,直到达到一定拟合精度后停止.(注:使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树通通都是都是CART回归树。为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树) - Graident boosting:
Freidman提出梯度提升算法(Graident boosting),解决一般的损失函数的优化问题,利用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。GBDT是回归树而不是分类树,调整后可用于分类。
前向分步算法
- 加法模型:
-
- 数学表达式 f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=m=1∑Mβmb(x;γm)其中 b ( x ; γ m ) b\left(x ; \gamma_{m}\right) b(x;γm)为基函数, γ m \gamma_{m} γm为基函数的参数, β m \beta_{m} βm为基函数的系数(权重)
-
- 优化目标
将 f ( x ) f(x) f(x)的学习训练过程,抓换为损失函数极小化问题:
min β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right) βm,γmmini=1∑NL(yi,m=1∑Mβmb(xi;γm))
- 优化目标
- 前向分布算法基本思想
-
- 从前往后,一步只学习一个基函数,逐步逼近优化目标函数。
-
- 每步只需要优化当前的损失函数
min β , γ ∑ i = 1 N L ( y i , β b ( x i ; γ ) ) \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, \beta b\left(x_{i} ; \gamma\right)\right) β,γmini=1∑NL(yi,βb(xi;γ))
- 每步只需要优化当前的损失函数
- 前向分步算法与AdaBoost
当加法模型中的基函数为基分类器的时候,加法模型与Adaboost最终集成的分类器等价:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x) f(x)=m=1∑MαmGm(x)
其中 G m ( x ) G_{m}(x) Gm(x)为基分类器, α m \alpha_{m} αm为基分类器的权重
负梯度拟合
- 根据前向分布算法:假设上一轮得到的强学习器是 ≡ f t − 1 ( x ) \equiv f_{t-1}(x) ≡ft−1(x),损失函数为 L ( y , f t − 1 ( x ) ) L\left(y, f_{t-1}(x)\right) L(y,ft−1(x)),本轮目标是找到一个基学习器 h t ( x ) h_{t}(x) ht(x),使得本轮的目标函数 L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( x ) ) L\left(y, f_{t}(x)\right)=L\left(y, f_{t-1}(x)+h_{t}(x)\right) L(y,ft(x))=L(y,ft−1(x)+ht(x))最小。换言之,本轮的CART决策树,应该使样本的损失函数更小。
- 利用损失函数 L ( y i , f ( x i ) ) L\left(y_{i}, f\left(x_{i}\right)\right) L(yi,f(xi))的负梯度作为本轮损失函数的残差估计(若损失函数为平方损失函数,就是通常所说的残差),进而拟合一个优质的CART决策树。将第t 轮第i 个样本的损失函数负梯度表示为: r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) r_{t i}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f _{t-1}(x)} rti=−[∂f(xi)∂L(yi,f(xi))]f(x)=ft−1(x)
- 利用 ( x i , r t i ) i = 1 , 2 , 3 , … , m \left(x_{i}, r_{t i}\right) i=1,2,3, \ldots, m (xi,rti)i=1,2,3,…,m,拟合本轮(t轮)的CART回归树,其对应的叶节点区域设为 R t j , j = 1 , 2 , 3 , … , J R_{t j}, j=1,2,3, \ldots, J Rtj,j=1,2,3,…,J,其中 J J J为叶子点的个数。
- 针对每一个叶子节点中的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的输出值 c t j \mathrm{c_{tj}} ctj ,定义如下: c t j = arg min ⎵ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c ) c_{t j}=\underbrace{\arg \min }_{c} \sum_{x_{i} \in R_{t j}} L\left(y_{i}, f_{t-1}\left(x_{i}\right)+c\right) ctj=c argminxi∈Rtj∑L(yi,ft−1(xi)+c)
- t 轮决策树的拟合函数: h t ( x ) = ∑ j = 1 J c t j I ( x ∈ R t j ) h_{t}(x)=\sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right) ht(x)=j=1∑JctjI(x∈Rtj)
- t 轮之后最终的强学习器表达式:
f
t
(
x
)
=
f
t
−
1
(
x
)
+
∑
j
=
1
J
c
t
j
I
(
x
∈
R
t
j
)
f_{t}(x)=f_{t-1}(x)+\sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right)
ft(x)=ft−1(x)+j=1∑JctjI(x∈Rtj)
通过损失函数的负梯度拟合,可找到一种通用的拟合损失函数的方法,这样无论是分类问题还是回归问题,通过其损失函数的负梯度拟合,就可以用GBDT来解决分类回归问题。(拟合残差只是考虑到损失函数为平方损失的特殊情况,负梯度是更加广义上的拟合项,更具普适性。)
损失函数
GBDT 主要依据不同的损失函的梯度进行更新,针对回归与分类问题,有不同的损失函数如下:
- 回归问题
-
- 平方损失函数 L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y, f(x))=(y-f(x))^{2} L(y,f(x))=(y−f(x))2
-
- 绝对损失函数 L ( y , f ( x ) ) = ∣ y − f ( x ) ∣ L(y, f(x))=|y-f(x)| L(y,f(x))=∣y−f(x)∣
- 分类问题
-
- 指数函数损失函数 L ( y , f ( x ) ) = e ( − y f ( x ) ) L(y, f(x))=e^{(-y f(x))} L(y,f(x))=e(−yf(x))
-
- 对数损失函数(对数似然损失函数)
-
-
- 二分类问题 L ( y , f ( x ) ) = log ( 1 + exp ( − y f ( x ) ) ) L(y, f(x))=\log (1+\exp (-y f(x))) L(y,f(x))=log(1+exp(−yf(x)))
-
-
-
- 多分类问题 L ( y , f ( x ) ) = − ∑ k = 1 K y k log ( p k ( x ) ) L(y, f(x))=-\sum_{k=1}^{K} y_{k} \log \left(p_{k}(x)\right) L(y,f(x))=−k=1∑Kyklog(pk(x))
-
回归
-
- 损失函数,以平方差损失函数为例: L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y, f(x))=(y-f(x))^{2} L(y,f(x))=(y−f(x))2
-
- 则对应的负梯度为 r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) = y i − f t − 1 ( x ) r_{t i}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f _{t-1}(x)}=y_{i}-f _{t-1}(x) rti=−[∂f(xi)∂L(yi,f(xi))]f(x)=ft−1(x)=yi−ft−1(x)
-
- 按照上述负梯度介绍构建回归树,并再集成。
分类
这里我们再看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数(上述损失函数所介绍)的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。
除了负梯度计算,其他过程和回归梯度拟合一致。
正则化
GBDT的正则化主要分三种:
- 加入步长v限制:
对于前一轮的基学习器的迭代 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)v 的取值范围为[0,1]。对于同样的训练集学习效果,较小的 v 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。 - 设置 子采样比例
-
- 注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为 1,则全部样本都使用,等于没有使用子采样。如果取值小于 1,则只有一部分样本会去做 GBDT 的决策树拟合。选择小于 1 的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在0.5, 0.8 之间。 使用了子采样的 GBDT 有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做 boosting 的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
- 对基学习器即 CART 回归树进行正则化剪枝
优点与缺点
- 优点
- 预测精度高
- 适合低维数据
- 能处理非线性数据
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
- 缺点
- 由于弱学习器之间存在依赖关系,难以并行训练数据.
- 如果数据维度较高时会加大算法的计算复杂度
sklearn 参数
在scikit-learning中,GradientBoostingClassifier对应GBDT的分类算法,GradientBoostingRegressor对应GBDT的回归算法
GradientBoostingRegressor(loss=’ls’, learning_rate=0.1, n_estimators=100,
subsample=1.0, criterion=’friedman_mse’, min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3,
min_impurity_decrease=0.0, min_impurity_split=None, init=None,
random_state=None, max_features=None, alpha=0.9, verbose=0,
max_leaf_nodes=None, warm_start=False, presort=’auto’,
validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)
- n_estimators:弱学习器的最大迭代次数,也就是最大弱学习器的个数。
- learning_rate:步长,即每个学习器的权重缩减系数a,属于GBDT正则化方化手段之一。
- subsample:子采样,取值(0,1]。决定是否对原始数据集进行采样以及采样的比例,也是- [ ] GBDT正则化手段之一。
- init:我们初始化的时候的弱学习器。若不设置,则使用默认的。
- loss:损失函数,可选{‘ls’-平方损失函数,‘lad’绝对损失函数-,‘huber’-huber损失函- [ ] 数,‘quantile’-分位数损失函数},默认’ls’。
- alpha:当我们在使用Huber损失"Huber"和分位数损失"quantile"时,需要指定相应的值。默认是0.9,若噪声点比较多,可适当降低这个分位数值。
- criterion:决策树节搜索最优分割点的准则,默认是"friedman_mse",可选"mse"-均方误差与’mae"-绝对误差。
- max_features:划分时考虑的最大特征数,就是特征抽样的意思,默认考虑全部特征。
- max_depth:树的最大深度。
- min_samples_split:内部节点再划分所需最小样本数。
- min_samples_leaf:叶子节点最少样本数。
- max_leaf_nodes:最大叶子节点数。
- min_impurity_split:节点划分最小不纯度。
- presort:是否预先对数据进行排序以加快最优分割点搜索的速度。默认是预先排序,若是稀疏数据,则不会预先排序,另外,稀疏数据不能设置为True。
- validationfraction:为提前停止而预留的验证数据比例。当n_iter_no_change设置时才能用。
- n_iter_no_change:当验证分数没有提高时,用于决定是否使用早期停止来终止训练。