集成学习——Boosting

一、引言

在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型。但是,实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。集成学习就是组合多个弱监督模型以期得到一个更好更全面的强监督模型,它是基于这样一种思想:将多个监督模型的判断进行适当的结合,要比其中任何一个单独的监督模型要好,因为即便某一个弱监督模型得到了错误的判断,其他的弱监督模型也有可能将错误纠正回来。

根据弱学习器的生成方式,目前的集成学习方法大致可分为两大类:

  • 序列化方法:各个弱学习器之间存在强依赖关系、必须串行化生成,以Boosting为代表;
  • 并行化方法:各个弱学习器之间不存在强依赖关系、可同时生成,以Bagging为代表;

本文主要介绍Boosting方法,下图是Boosting方法的示意图。

Boosting方法是可以将弱学习器提升为强学习器的一类方法,它的工作机制是:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本进行调整,使得先前基学习器预测错误的训练样本在后续收到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复进行,直至基学习器数目达到事先指定的值MMM,最终将这MMM个基学习器进行加权结合。

二、前向分步算法

在详细介绍Boosting方法之前,我们首先介绍一下前向分步算法,因为大多数Boosting方法都可以看作是前向分步算法的特例。

具体来说,假设有加法模型
f(x)=∑m=1Mβmb(x;γm)f(\mathbf{x}) = \sum_{m = 1}^M \beta_mb(\mathbf{x};\gamma_m) f(x)=m=1∑M​βm​b(x;γm​)
其中,b(x;γm)b(x;\gamma_m)b(x;γm​)为基函数,γm\gamma_mγm​为基函数的参数,βm\beta_mβm​为基函数的系数。我们的目标是极小化损失函数
min⁡βm,γm∑i=1NL(yi,f(xi))\min_{\beta_m,\gamma_m} \sum_{i = 1}^N L(y_i,f(\mathbf{x}_i)) βm​,γm​min​i=1∑N​L(yi​,f(xi​))
其中,L(⋅)L(\cdot)L(⋅)为损失函数。

由于f(x)f(\mathbf{x})f(x)是加法模型
f2(x)=f1(x)+βb(x;γ2)f3(x)=f2(x)+β3b(x;γ3)...fm(x)=fm−1(x)+βmb(x;γm)\begin{aligned} f_2(\mathbf{x}) &= f_1(\mathbf{x}) + \beta_b(\mathbf{x};\gamma_2) \\ f_3(\mathbf{x}) &= f_2(\mathbf{x}) + \beta_3b(\mathbf{x};\gamma_3) \\ ...\\ f_m(\mathbf{x}) &= f_{m - 1}(\mathbf{x}) + \beta_mb(\mathbf{x};\gamma_m) \end{aligned} f2​(x)f3​(x)...fm​(x)​=f1​(x)+βb​(x;γ2​)=f2​(x)+β3​b(x;γ3​)=fm−1​(x)+βm​b(x;γm​)​
因此,前向分步算法的基本思路是:每步只学习一个基函数及其系数,逐步逼近目标函数,从而简化优化的复杂度。

前向分步算法的具体流程如下:

  1. 初始化f0(x)=0f_0(\mathbf{x}) = 0f0​(x)=0;
  2. 对m=1,2,...,Mm=1,2,...,Mm=1,2,...,M
    a. 极小化损失函数
    (βm,γm)=arg⁡min⁡β,γ∑i=1NL(yi,fm−1(xi)+βb(xi;γ)(\beta_m, \gamma_m) = \arg \min_{\beta, \gamma} \sum_{i=1}^N L(y_i, f_{m - 1}(\mathbf{x}_i) + \beta b(\mathbf{x}_i;\gamma) (βm​,γm​)=argβ,γmin​i=1∑N​L(yi​,fm−1​(xi​)+βb(xi​;γ)
    b.更新
    fm(x)=fm−1(x)+βmb(x;γm)f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + \beta_mb(\mathbf{x};\gamma_m) fm​(x)=fm−1​(x)+βm​b(x;γm​)
  3. 得到加法模型
    f(x)=fM(x)=∑m=1Mβmb(x;γm)f(\mathbf{x}) = f_M(\mathbf{x}) = \sum_{m = 1}^M \beta_mb(\mathbf{x};\gamma_m) f(x)=fM​(x)=m=1∑M​βm​b(x;γm​)

这样,前向分步算法将同时求解所有的βm\beta_mβm​和γm\gamma_mγm​的优化问题简化为逐次求解各个βm\beta_mβm​和γm\gamma_mγm​的问题。

三、AdaBoost

AdaBoost算法是从弱学习算法出发,反复学习,得到一系列弱分类器(又称基本分类器),然后组合这些弱分类器,构成一个强分类器。它通过改变训练数据的概率分布(训练数据的权值分布),针对不同的的训练数据分布调用弱学习算法学习一系列弱分类器。那么,就有以下两个问题需要解决:

  1. 在每一轮如何改变训练数据的权值或是说概率分布;
  2. 如何将多个弱分类器组合成一个强分类器;

对于第一个问题,AdaBoost算法是这样解决的:提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些下载 到正确分类的数据,由于其权值增大而在下一轮的训练中得到更大的关注。而对于第二问题,AdaBoost算法采用加权多数表决的方法,即加大分类误差率小的弱分类器的权值,使其在表决中起到较大的作用,而减小分类误差率较大的弱分类器的权值,使其在表决种起到较小的作用。下面我们将详细介绍AdaBoost算法。

首先,给定二分类训练集
T={(x1,y1),(x2,y2),...,(xN,yN)}T = \{ (\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), ..., (\mathbf{x}_N, y_N)\} T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)}
其中xi∈Rn\mathbf{x}_i \in \mathbb{R}^nxi​∈Rn表示实例,yi∈{+1,−1}y_i \in \{+1, -1\}yi​∈{+1,−1}表示实例对应的标签。

AdaBoost方法的具体步骤如下:

  1. 初始化训练数据的权值分布
    D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2,...,ND_1=(w_{11}, ..., w_{1i}, ..., w_{1N}),w_{1i}=\frac{1}{N}, i = 1,2,...,N D1​=(w11​,...,w1i​,...,w1N​),w1i​=N1​,i=1,2,...,N
  2. 对于m=1,2,...,Mm = 1, 2, ..., Mm=1,2,...,M
    a. 使用具有全职分布DmD_mDm​的训练数据集学习,得到弱分类器
    Gm(x)G_m(\mathbf{x}) Gm​(x)
    b. 计算Gm(xi)G_m(\mathbf{x}^i)Gm​(xi)在训练集上的分类误差率
    ϵm=∑i=1NwmiI(Gm(xi≠yi))\epsilon_m = \sum_{i = 1}^N w_{mi}I(G_m(\mathbf{x}^i \neq y_i)) ϵm​=i=1∑N​wmi​I(Gm​(xi​=yi​))
    c. 计算弱分类器Gm(xi)G_m(\mathbf{x}^i)Gm​(xi)的权重系数
    αm=12log⁡1−ϵmϵm\alpha_m = \frac{1}{2} \log \frac{1-\epsilon_m}{\epsilon_m} αm​=21​logϵm​1−ϵm​​
    d. 更新训练数据集的权值分布
    Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)wm+1,i=wmiZmexp(−αmyiGm(xi))Zm=∑i=1Nwmiexp(−αmyiGm(xi))(规范化因子)\begin{aligned} D_{m+1} &= (w_{m+1, 1}, ..., w_{m+1, i}, ..., w_{m+1, N}) \\ w_{m+1, i} &= \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(\mathbf{x}^i)) \\ Z_m &= \sum_{i=1}^N w_{mi} exp(-\alpha_my_iG_m(\mathbf{x}^i)) (规范化因子) \end{aligned} Dm+1​wm+1,i​Zm​​=(wm+1,1​,...,wm+1,i​,...,wm+1,N​)=Zm​wmi​​exp(−αm​yi​Gm​(xi))=i=1∑N​wmi​exp(−αm​yi​Gm​(xi))(规范化因子)​
  3. 构建弱分类器的加权组合
    f(x)=∑i=1MαmGm(x)f(\mathbf{x}) = \sum_{i=1}^M\alpha_mG_m(\mathbf{x}) f(x)=i=1∑M​αm​Gm​(x)

上述步骤中,wmiw_{mi}wmi​表示第mmm轮第i个实例的权重,从其更新公式
wm+1,i=wmiZme−αm,Gm(xi)=yiwm+1,i=wmiZmeαm,Gm(xi)≠yi\begin{aligned} w_{m+1, i} &= \frac{w_{mi}}{Z_m}e^{-\alpha_m}, G_m(\mathbf{x}^i) = y_i \\ w_{m+1, i} &= \frac{w_{mi}}{Z_m}e^{\alpha_m}, G_m(\mathbf{x}^i) \neq y_i \end{aligned} wm+1,i​wm+1,i​​=Zm​wmi​​e−αm​,Gm​(xi)=yi​=Zm​wmi​​eαm​,Gm​(xi)​=yi​​
可以看出,如果上一轮训练中的某个实例被正确分类,那么它在下一轮训练中的权值将减小;如果上一轮训练中的某个实例被错误分类,那么它在下一轮训练中的权值将增大。

另外,上述步骤中,αm\alpha_mαm​表示第mmm个弱分类器前面的权重系数,即弱分类器Gm(x)G_m(\mathbf{x})Gm​(x)在最终强分类器中的重要程度。从其公式中可以看出,当ϵm≤12\epsilon_m \leq \frac{1}{2}ϵm​≤21​时,αm≥0\alpha_m \geq 0αm​≥0,并且随着ϵm\epsilon_mϵm​的减小而增大,所以分类误差率越小的弱分类器在最终分类器中的作用越大。

AdaBoost算法可以看作是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二分类学习算法。上述的这个定理的证明在此就不再赘述,具体可以参考李航的《统计学习方法》第8.2.3小节。

三、Boosting Tree

如果基函数是决策树,那么这种Boosting方法称为Boosting Tree。Boosting Tree可以表示为决策树的加法模型
fM(x)=∑m=1MT(x;θm)f_M(\mathbf{x}) = \sum_{m=1}^M T(\mathbf{x};\theta_m) fM​(x)=m=1∑M​T(x;θm​)
其中,T(x;θm)T(\mathbf{x};\theta_m)T(x;θm​)表示决策树。

对于二类分类问题,只需将Adaboost算法中的基分类器二类分类树,即可得到二类分类问题的Boosting Tree。

对于回归问题,假设有回归树将输入空间划分为JJJ个互不相交的区域R1,R2,...,RJR_1, R_2,...,R_JR1​,R2​,...,RJ​,并且在每个区域上确定输出的常量cjc_jcj​,那么回归树可以表示为
T(x;θ)=∑j=1JcjI(x∈Rj)T(\mathbf{x};\theta) = \sum_{j=1}^J c_j I(\mathbf{x} \in R_j) T(x;θ)=j=1∑J​cj​I(x∈Rj​)

当损失函数采用MSE(平方误差损失函数)时,那么
L(y,fm(x))=[y−fm−1(x)−T(x;θm)]2=[r−T(x;θm)]2\begin{aligned} L(y, f_{m}(\mathbf{x})) &= [y - f_{m-1}(\mathbf{x}) - T(\mathbf{x};\theta_m)]^2 \\ &= [r - T(\mathbf{x};\theta_m)]^2 \end{aligned} L(y,fm​(x))​=[y−fm−1​(x)−T(x;θm​)]2=[r−T(x;θm​)]2​
其中,rrr是当前模型拟合数据的残差。因此,回归问题的Boosting Tree算法只需简单地拟合当前模型地残差,其具体过程如下:

  1. 初始化f0(x)=0f_0(\mathbf{x}) = 0f0​(x)=0;
  2. 对m=1,2,...,Mm=1,2,...,Mm=1,2,...,M
    a. 计算残差
    rmi=yi−fm−1(xi)r_{mi} = y_i - f_{m-1}(\mathbf{x}_i) rmi​=yi​−fm−1​(xi​)
    b. 拟合残差rmir_mirm​i学习一个回归树,得到 T(x;θm)T(\mathbf{x};\theta_m)T(x;θm​)
    c. 更新
    fm(x)=fm−1(x)+T(x;θm)f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + T(\mathbf{x};\theta_m) fm​(x)=fm−1​(x)+T(x;θm​)
  3. 得到回归问题的Boosting Tree
    fM(x)=∑m=1MT(x;θm)f_M(\mathbf{x}) = \sum_{m=1}^M T(\mathbf{x};\theta_m) fM​(x)=m=1∑M​T(x;θm​)

四、Gradient Boosting Decision Tree

当损失函数是平方误差损失函数或指数函数时,每一步优化很简单,但是对于一般的损失函数,优化就会变得比较复杂。Gradient Boosting算法就是针对这一问题提出的。

具体来说,我们希望在第mmm步学习到的基本分类器fm(x)f_m(\mathbf{x})fm​(x)使得L(y,fm−1(x)+fm(x))L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))L(y,fm−1​(x)+fm​(x))尽可能地在L(y,fm−1(x))L(y, f_{m-1}(\mathbf{x}))L(y,fm−1​(x))的基础上变得更小,因此,我们只需要使L(y,fm−1(x)+fm(x))L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))L(y,fm−1​(x)+fm​(x))的值比L(y,fm−1(x))L(y, f_{m-1}(\mathbf{x}))L(y,fm−1​(x))小即可。那么,我们的目标函就变成:
max⁡[L(y,fm−1(x))−L(y,fm−1(x)+fm(x))]\max[L(y, f_{m-1}(\mathbf{x})) - L(y, f_{m-1}(\mathbf{x}) + f_{m}(\mathbf{x}))] max[L(y,fm−1​(x))−L(y,fm−1​(x)+fm​(x))]
又因为在第mmm轮,fm−1(x)f_{m-1}(\mathbf{x})fm−1​(x)已经确定,所以把它设为constconstconst,那么
max⁡[L(y,const)−L(y,const+fm(x))]\max[L(y, const) - L(y, const+ f_{m}(\mathbf{x}))] max[L(y,const)−L(y,const+fm​(x))]

根据泰勒展开,有
L(y,const+fm(x))≈L(y,const)+L′(y,const)fm(x)L(y, const+ f_{m}(\mathbf{x})) \approx L(y, const) + L'(y, const)f_{m}(\mathbf{x}) L(y,const+fm​(x))≈L(y,const)+L′(y,const)fm​(x)
若令fm(x)=−L′(y,const)f_m(\mathbf{x})=-L'(y, const)fm​(x)=−L′(y,const),那么
L(y,const+fm(x))≈L(y,const)−L′(y,const)2<L(y,const)L(y, const+ f_{m}(\mathbf{x})) \approx L(y, const) - L'(y, const)^2 < L(y, const) L(y,const+fm​(x))≈L(y,const)−L′(y,const)2<L(y,const)

因此,在第mmm轮,可以用损失函数的负梯度作为残差的近似值,拟合一个回归树。

GBDT的具体流程如下所示:

  1. 初始化
    f0(x)=arg⁡min⁡c∑i=1NL(yi,c)f_0(\mathbf{x}) = \arg \min_c \sum_{i=1}^NL(y_i,c) f0​(x)=argcmin​i=1∑N​L(yi​,c)
  2. 对m=1,2,...,Mm=1,2,...,Mm=1,2,...,M
    a. 计算残差(负梯度)
    rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)r_{mi} = -[\frac{\partial L(y_i, f(\mathbf{x}_i))}{\partial f(\mathbf{x}_i)}]_{f(\mathbf{x}) = f_{m-1}(\mathbf{x})} rmi​=−[∂f(xi​)∂L(yi​,f(xi​))​]f(x)=fm−1​(x)​
    b. 拟合残差rmir_mirm​i学习一个回归树,得到第mmm棵树的叶结点区域Rmj,j=1,2,...,JR_{mj}, j=1,2,...,JRmj​,j=1,2,...,J
    c. 对j=1,2,...,Jj=1,2,...,Jj=1,2,...,J,计算
    cmj=arg⁡min⁡c∑xi∈RmjL(yi,fm−1(xi)+c)c_{mj} = \arg \min_c \sum_{\mathbf{x}_i \in R_{mj}} L(y_i,f_{m-1}(\mathbf{x}_i) + c) cmj​=argcmin​xi​∈Rmj​∑​L(yi​,fm−1​(xi​)+c)
    d. 更新
    fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)f_m(\mathbf{x}) = f_{m-1}(\mathbf{x}) + \sum_{j=1}^J c_{mj} I(\mathbf{x} \in R_{mj}) fm​(x)=fm−1​(x)+j=1∑J​cmj​I(x∈Rmj​)
  3. 得到回归问题的Boosting Tree
    fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)f_M(\mathbf{x}) = \sum_{m=1}^M \sum_{j=1}^J c_{mj} I(\mathbf{x} \in R_{mj}) fM​(x)=m=1∑M​j=1∑J​cmj​I(x∈Rmj​)

五、XGBoost

XGBoost全名叫(Extreme Gradient Boosting)极端梯度提升,是 GBDT的改进版,既可以用于分类也可以用于回归问题中。

XGBoost仍然是加法模型,它将MMM个树(CART树)的结果进行求和,作为最终的预测值,即:
y^=∑m=1Mfm(x),fm∈FF={f(x)=wq(x)}(q:Rn→T,w∈RT)\begin{aligned} \hat{y}= \sum_{m=1}^M f_m(\mathbf{x}),f_m \in \mathcal{F} \\ \mathcal{F} = \{ f(\mathbf{x}) = w_{q(\mathbf{x})}\} (q : \mathbb{R}^n \to T, w \in \mathbb{R}^T) \end{aligned} y^​=m=1∑M​fm​(x),fm​∈FF={f(x)=wq(x)​}(q:Rn→T,w∈RT)​

其中,F\mathcal{F}F是CART树的函数空间,qqq表示一棵树的结构,它将实例映射到对应的叶结点,TTT表示树的叶子结点的个数,www表示叶子结点的权重。

XGBoost的目标函数与GBDT相比,增加了正则化项,具体如下:
min⁡∑i=1NL(yi,y^i)+∑m=1MΩ(fm)Ω(f)=γT+12λ∣∣w∣∣2\begin{aligned} \min \sum_{i=1}^N L(y_i, \hat{y}_i) + \sum_{m=1}^M \Omega(f_m) \\ \Omega(f) = \gamma T +\frac{1}{2} \lambda||w||^2 \end{aligned} mini=1∑N​L(yi​,y^​i​)+m=1∑M​Ω(fm​)Ω(f)=γT+21​λ∣∣w∣∣2​
上式的第一项是损失误差,第二项是正则项,控制树的复杂度,防止过拟合。

根据泰勒展开式:
f(x+Δx)≈f(x)+f′(x)Δx+12f′′(x)Δxf(x+\Delta x) \approx f(x) + f'(x)\Delta x + \frac{1}{2} f''(x)\Delta x f(x+Δx)≈f(x)+f′(x)Δx+21​f′′(x)Δx

在第mmm轮,目标函数可以改写成:
L(m)=∑i=1NL(yi,y^i(m−1)+fm(xi))+γT+12λ∑t=1Twt2≈∑i=1N[L(yi,y^i(m−1))+gifm(xi)+12hifm2(xi)]+γT+12λ∑j=1Twj2=∑i=1N[gifm(xi)+12hifm2(xi)]+γT+12λ∑j=1Twj2+const\begin{aligned} L^{(m)} &= \sum_{i=1}^N L(y_i, \hat{y}_i^{(m-1)}+f_{m}(\mathbf{x}_i)) + \gamma T + \frac{1}{2} \lambda \sum_{t=1}^T w_t^2 \\ &\approx \sum_{i=1}^N [L(y_i,\hat{y}_i^{(m-1)}) + g_i f_m(\mathbf{x}_i) + \frac{1}{2} h_i f_m^2(\mathbf{x}_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{i=1}^N [g_i f_m(\mathbf{x}_i) + \frac{1}{2} h_i f_m^2(\mathbf{x}_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 + const \end{aligned} L(m)​=i=1∑N​L(yi​,y^​i(m−1)​+fm​(xi​))+γT+21​λt=1∑T​wt2​≈i=1∑N​[L(yi​,y^​i(m−1)​)+gi​fm​(xi​)+21​hi​fm2​(xi​)]+γT+21​λj=1∑T​wj2​=i=1∑N​[gi​fm​(xi​)+21​hi​fm2​(xi​)]+γT+21​λj=1∑T​wj2​+const​

其中,
gi=∂L(yi,y^i(m−1))∂y^i(m−1)hi=∂2L(yi,y^i(m−1))∂y^i(m−1)\begin{aligned} g_i &= \frac{\partial L(y_i,\hat{y}_i^{(m-1)})}{\partial \hat{y}_i^{(m-1)}} \\ h_i &= \frac{\partial^2 L(y_i,\hat{y}_i^{(m-1)})}{\partial \hat{y}_i^{(m-1)}} \end{aligned} gi​hi​​=∂y^​i(m−1)​∂L(yi​,y^​i(m−1)​)​=∂y^​i(m−1)​∂2L(yi​,y^​i(m−1)​)​​

分别表示损失函数的一阶和二阶偏导数。

令Ij={i∣q(xi)=j}I_j = \{ i | q(\mathbf{x}_i) = j \}Ij​={i∣q(xi​)=j} 表示被分配到第jjj个叶子结点上的实例集合,那么
L(m)=∑j=1T[(∑i∈Ijgi)wj+(12∑i∈Ijhi)wj2]++γT+12λ∑j=1Twj2+const=∑j=1T[(∑i∈Ijgi)wj+(12∑i∈Ijhi+λ)wj2]++γT+const\begin{aligned} L^{(m)} &= \sum_{j=1}^T [(\sum_{i \in I_j} g_i) w_j + (\frac{1}{2} \sum_{i \in I_j} h_i) w_j^2] + + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 + const \\ &= \sum_{j=1}^T [(\sum_{i \in I_j} g_i) w_j + (\frac{1}{2} \sum_{i \in I_j} h_i + \lambda) w_j^2] + + \gamma T + const \end{aligned} L(m)​=j=1∑T​[(i∈Ij​∑​gi​)wj​+(21​i∈Ij​∑​hi​)wj2​]++γT+21​λj=1∑T​wj2​+const=j=1∑T​[(i∈Ij​∑​gi​)wj​+(21​i∈Ij​∑​hi​+λ)wj2​]++γT+const​

令Gj=∑i∈IjgiG_j = \sum_{i \in I_j} g_iGj​=∑i∈Ij​​gi​,Hj=∑i∈IjhiH_j = \sum_{i \in I_j} h_iHj​=∑i∈Ij​​hi​,对wjw_jwj​求偏导,令其导数为0:
∂L(m)∂wj=Gj+(Hj+λ)wj=0wj∗=−GjHj+λL(m)∗=−12∑j=1TGj2Hj+λ+γT\begin{aligned} \frac{\partial L^{(m)}}{\partial w_j} &= G_j + (H_j + \lambda)w_j = 0 \\ w_j^* &= -\frac{G_j}{H_j+\lambda} \\ L^{(m)*} &= -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j+\lambda} + \gamma T \end{aligned} ∂wj​∂L(m)​wj∗​L(m)∗​=Gj​+(Hj​+λ)wj​=0=−Hj​+λGj​​=−21​j=1∑T​Hj​+λGj2​​+γT​

L(m)L^{(m)}L(m)代表了当我们指定一个树结构的时候,我们在目标函数上最多减少多少。一般把它叫做结构分数(structure score),可以认为它是类似Gini系数一样更加一般的对于树结构进行打分的函数。通过上式我们还可以看到,当树结构确定时,树的结构得分只与其一阶导数和二阶导数有关,得分越小,说明结构越好。

通常情况下,我们无法枚举所有可能的树结构然后选取最优的,所以我们选择用一种贪婪算法来代替:我们从单个叶结点开始,迭代分裂来给树添加结点。结点切分后的损失函数为:
Lsplit=12[GL2HL+λ+GR2HR+λ−(GL+GR)2HL+HR+λ]−γL_{split} = \frac{1}{2} [\frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L + G_R)^2}{H_L + H_R+\lambda} ] - \gamma Lsplit​=21​[HL​+λGL2​​+HR​+λGR2​​−HL​+HR​+λ(GL​+GR​)2​]−γ

其中,前两项分别表示左子树和右子树的分数,第三项表示不分割可以拿到的分数,最后一项表示加入新叶子结点引入的复杂度代价,它的另一个作用是作为阈值,只有当分裂后的增益大于γ\gammaγ时,才选择分裂,起到了预剪枝的作用。

上式用来评估切分后的增益,我们的目标是寻找一个特征及对应的值,使得切分后的损失减少得最大。具体流程如下图:

XGBoost在实际的应用过程中还增加了其它一些技巧,如

  • 提前终止(Early Stopping)
    通过观察模型在验证集上的错误率,如果它变化不大则可以提前结束训练,控制迭代轮数(即树的个数);
  • 收缩(Shrinkage)
    从迭代的角度可以看成是学习率(learning rate),从集成的角度可以看成每棵树的权重α\alphaα,它的大小经验上可以取0.1,它是对模型泛化性和训练时长的折中;
  • 抽样(Subsampling)
    借鉴Bagging的思想,可以在每一轮树的构建中使用训练集中无放回抽样的样本,也可以对特征做抽样,模拟真实场景下的样本分布波动;
  • 参数放弃(Dropout)
    模拟深度学习里随机放弃更新权重的方法,可以在每新增一棵树的时候拟合随机抽取的一些树的残差,相关方法可以参考:DART: Dropouts meet Multiple Additive Regression Trees

这里就不再赘述了。

参考

  1. 《统计学习方法》
  2. 机器学习算法GBDT
  3. 机器学习–boosting家族之XGBoost算法
  4. xgboost原理
  5. XGBoost原理

笔记—集成学习—Boosting相关推荐

  1. 04 集成学习 - Boosting - AdaBoost算法构建

    03 集成学习 - Boosting - AdaBoost算法原理 十.AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的,于是我就可以对模型进行更新操作了. 构建过程一 1.假 ...

  2. 集成学习-Boosting集成学习算法GBDT

    GBDT算法的核心为:先构造一个(决策)树,然后不断在已有模型和实际样本输出的残差上再构造一颗树,依次迭代. 目录 Decistion Tree(决策树) Gradient Boosting(梯度提升 ...

  3. 【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析

    [机器学习]集成学习-Boosting-GBM(Gradient Boosting Machine)解析 文章目录 [机器学习]集成学习-Boosting-GBM(Gradient Boosting ...

  4. 集成学习——Boosting(AdaBoost,Gradient Boosting)

    集成学习--Boosting 与bagging方法不同,boosting中各个分类器串行生成,第Hn个分类器会受到Hn-1个分类器的影响.其主要思想是使下一个分类器更加关注于在上一个分类器上不能很好预 ...

  5. 笔记︱集成学习Ensemble Learning与树模型、Bagging 和 Boosting、模型融合

    基本内容与分类见上述思维导图. 文章目录 一.模型融合方法 . 概述 1.Voting 2.Averaging 3.Bagging 4.Boosting 5. Stacking (1)nfolds 次 ...

  6. 机器学习 | 算法笔记- 集成学习(Ensemble Learning)

    前言 本系列为机器学习算法的总结和归纳,目的为了清晰阐述算法原理,同时附带上手代码实例,便于理解. 目录 k近邻(KNN) 决策树 线性回归 逻辑斯蒂回归 朴素贝叶斯 支持向量机(SVM) 组合算法( ...

  7. 机器学习集成学习-BOOSTING与BAGGING

    集成算法(Emseble Learning) 是构建多个学习器,然后通过一定策略结合把它们来完成学习任务的,常常可以获得比单一学习显著优越的学习器. 用于减少方差的bagging 用于减少偏差的boo ...

  8. 集成学习boosting算法:AdaboostGBDTXgboostLightGBMCatBoost

    Adaboost&GBDT&Xgboost&LightGBM&CatBoost 0简介 0.0发展史 0.1 经典文章链接/文章总结链接 0.2 bagging和boo ...

  9. 集成学习-Boosting集成学习算法LightGBM

    在2017年年1月微软在GitHub的上开源了一个新的升压工具LightGBM(Light Gradient Boosting Machine ).它是一种优秀的机器学习算法框架,与XGBoost算法 ...

最新文章

  1. 皮一皮:古老中医博大精深!
  2. TypeError: 'module' object is not callable 原因分析(python模块导入注意事项)
  3. 零基础学Python(第五章 运算符)
  4. mongodb与mysql命令对比 (前人笔记+自己添加)
  5. java 递归函数_浅谈java递归函数
  6. python调用菜单响应事件_[Python] wxpython 编程触发菜单或按钮事件
  7. 【TensorFlow】TensorFlow从浅入深系列之七 -- 教你使用验证数据集判断模型效果
  8. 15-传智书城后台程序设计
  9. showdialog url访问页面_静态url在搜索引擎优化中的重要作用
  10. 10、一篇经典的域渗透文章
  11. java 截位法保留小数_资料分析——截位法
  12. C语言数据结构之一元多项式的求导
  13. Python语言程序设计课程论文
  14. 先有鸡还是先有蛋?先有操作系统,还是先有汇编器?(对计算机本质的探讨)
  15. python自学软件-学习python用什么软件
  16. 汽车驱动桥毕业设计【毕业设计(论文) +7张CAD图纸】
  17. java word插件开发_java生成word的几种方案
  18. 云之道知识付费3.1.1【最新开源】全插件,独立版
  19. Oracle 数据库的启停
  20. Loadrunder脚本篇——文件下载

热门文章

  1. 计算机操作系统-文件管理 知识点归纳
  2. 基于ssm框架的农产品扶农商农平台的设计与实现
  3. 微信域名防封,细说微信域名防封技术原理
  4. cocos creator经典游戏英文版《俄罗斯方块》源码H5+安卓+IOS三端源码
  5. Linux:Nginx 正向代理实现内网访问互联网
  6. 单片机C51复习题(课后习题及答案)
  7. bin/hive出错:Exception in thread main java.lang.RuntimeException: java.net.ConnectException: Call Fr
  8. 彗星mysql_为什么彗星被认为是一个“脏雪球”?
  9. Android屏幕上涂鸦画笔标记的实现
  10. 2018 NOIP 提高组 复赛 day1