Ensemble Learning(Trees, Forests, Bagging, Boosting)

1.概述

有监督学习任务中,对于一个相对复杂的任务而言,我们的目标是学习出一个稳定且在各个方面表现都较好的模型,但实际情况往往不会如此理想,有时只能得到多个有偏好的模型(弱监督模型或弱可学习weakly learnable模型)。集成学习就是组合这里的多个弱可学习模型得到一个更好更全面的强可学习 strongly learnable模型,集成学习潜在的思想是即便某一个弱学习器得到了错误的预测,其他的弱学习器也可以将错误纠正回来,实现的效果就是将多个“专家”的判断进行适当的综合,要比任何一个“专家”单独的判断好,实际上就是“三个臭皮匠顶个诸葛亮”的道理。

在PAC的学习框架中,强可学习与弱可学习是等价的,也就是一个概念是强可学习的充分条件是这个概念是弱可学习的。

集成学习可用于分类问题集成,回归问题集成,特征选取集成,异常点检测集成(isolated forest)等,可以说所有的单一机器学习模型经过集成都可以形成集成学习模型。本文对各类集成学习做一个比较全面的总结。

2.CART

分类和回归树或CART模型(Classification and regression tree),也称为决策树,通过递归地划分输入空间并在输入空间划分出的每个区域定义一个局部模型。整个模型可以用一棵树表示,每个区域对应一片叶子。

我们首先考虑如下图 a 所示回归树,其中所有输入都是实值。树由一组嵌套决策规则组成。在每个节点 \large i 处,将输入向量 \large \mathbf x 的 第 \large d_i 特征 \large x_i与阈值 \large t_i进行比较,然后将输入向下传递到左分支或右分支,具体取决于其高于还是低于阈值。在树的每个叶子节点,模型指定任何输入的预测输出值落在对应的输入空间内,考虑下图a中的回归树。第一个节点被询问 \large x_1是否小于某个阈值\large t_1;如果是,将继续询问\large x_2是否小于另一个阈值\large t_2。如果是,我们将输入对应到左下叶子节点,这对应于如下空间区域

                                                        \large R \{x: x_1 < t_1, x_2 <t_2 \}

我们可以根据定义的一种与轴平行的切分法将原始的整个输入区域划分为多个区域,最终结果是将2d输入空间划分成5个区域,如下图 b 所示.我们可以将这些划分出的每个区域赋一个对应的均值,形成如图b所示的分段恒定表面。比如区域 1 的输出(均值)可定义如下

                                                \large w_1 = \frac{\sum_{n=1}^{N} y_{n}\mathbb{I}(x_n \in R_1)}{\sum_{n=1}^{N} \mathbb{I}(x_n \in R_1)}

比较正式的回归树的定义如下

                                                 \large f(x;\theta) = \sum_{j=1}^{J} w_{j}\mathbb{I}(x \in R_j)

Ensemble Learning(Trees, Forests, Bagging, Boosting)_第1张图片

其中,J 是节点的数量,R_j是第j 个叶子节点所指定的区域, w_j 是对应的节点的预测输出。

为了拟合上述回归树模型,需对应如下的loss 函数

                         \mathcal L(\theta) = \sum_{n=1}^{N} \mathit l(y_n,f(x_n;\theta))=\sum_{j=1}^{J}\sum_{x_n \in R_j}^{} l(y_n,w_j)

然而上述函数是不可微的,因为所需学习的是离散的树结构。事实上,找到数据的最佳划分是NP难问题。标准做法是使用贪婪策略,也就是启发式的寻优,在整个过程中,我们一次迭代生成树的一个节点。CART、C4.5和ID3都使用了这种方法,这是主流的三种实现方式。具体而言,都是通过计算Gini指数寻找最佳切分点逐步实现完全的切分效果。

 如果我们让树变得足够深,理论上可以在训练集上获得0个错误的划分结果, 通过将输入空间划分为足够小的区域可实现恒定的输出结果。 然而这通常会导致过拟合,为了防止过拟合出现,一是制定启发式的规则,比如节点的样本少于指定的阈值或达到指定的深度时停止生长;二是无限划分各个叶子节点,使其不再能够继续切分,再通过合并子树将其剪枝回来。

一般来说,对于判别模型(如神经网络)很难处理缺失的输入。然而,对于树模型,有一些简单的启发式做法可以处理这一点。处理决策树中缺失输入的标准做法是寻找一系列“备份变量”,其可以在任何给定分割处,引申出与所选变量相似的分割结果,这称为代理分割。还有一种做法就是将缺失值编码为新值,然后将该数据视为完全观察到的一部分。

总的来说,树模型受欢迎的原因有以下几个优点

a. 易于解释。

b. 可以轻松处理混合后的离散输入或连续输入

c. 对输入的变换不敏感(因为分割点基于对数据点进行排序,无需对数据进行标准化处理)

d. 实现过程自动进行变量选择

e. 对异常值相对鲁棒

f. 适应速度快,可以很好地扩展到大型数据集

g. 它们可以处理缺失的输入功能

然而,树模型也有一些缺点。主要原因是,与其他类型的模型相比,不能预测的非常精确。这有部分是由于树结构的本身特点决定的。另外一点就是树本身的结构不稳定,对输入数据的微小更改可能会树的整体结构产生重大影响,这是由于树生长过程的层次性会影响树的其它部分所导致的。

3. Ensemble learning

通过上述的分析可知,决策树可能非常不稳定,因为如果训练数据受到干扰,它们的预测结果可能会变化很大。换句话说,决策树是一种高方差估计器。减少方差的一个简单方法是对多个模型求平均,这称为集成学习(Ensemble learning)。集成学习的结果模型具有以下形式:

                                        \large f(y|x)=\frac{1}{|\mathcal{M}|}\sum_{m \in \mathcal{M}}^{}w_mf_m(y|x)

其中f_m(x) 是第 m 个基模型。集成的结果将具有与基模型相似的偏差,但方差更低,通常通过改善偏差-方差 tradeoff 原则实现总体性能提升。

平均法是一种结合回归模型预测的明智做法。对于分类器,有时最好对输出结果进行多数表决,这被称为投票法。

投票法的性能可以得到显著提升,因为我们假设每个预测器都有独立的错误输出。在实际应用中,他们的错误可能是相互关联的,但只要我们集成了足够多样的模型,通过相互抵消错误预测的影响,最终的整体性能是提升的。

3.1 Stacking 

另一种方法是通过使用加权平均或多数表决的做法。

                                        \large f(y|x)=\sum_{m \in \mathcal{M}}^{}w_mf_m(y|x)

这称为叠加法stacking,它表示“stacked generalization”。需要注意的是,叠加法使用的组合权重需在分离出来的一个单独的数据集上进行训练,否则它会将所有权重赋到表现最佳的基模型上。

3.2 与Bayes model averaging的差异

值得注意的是,正如相关文献所指出的,模型集成不同于使用贝叶斯模型平均法。集成学习考虑更大范围的假设,形式如下:

                                \large p(y|x,w,\theta)=\sum_{m \in \mathcal{M}}^{}w_mp(y|x,\theta_m)

而bayes模型平均法BMA使用的是如下形式

        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large p(y|x,\mathcal D)=\sum_{m \in \mathcal{M}}^{}p(m|\mathcal D)p(y|x,m,\mathcal D)

两者的关键区别在于,在BMA的情况下,权重p(m|\mathcal D) 和为1,极限情况下有无穷量数据下,可能会收缩到只选择一个模型(即MAP模型);相比之下集成学习下的权重w_m是任意的,并且不会以这种方式塌陷到单一模型中。

4.Bagging

bagging表示bootstrap aggregating,这是一种简单的集成学习形式,通过对原数据进行随机采样得到不同版本的子数据集,然后训练拟合得到 M 个不同的基模型。这鼓励不同的模型做出不同的预测结果。这些子数据集都是通过放回采样(一种称为bootstrap 采样)来实现,因此任意一个给定的样本可能出现多次,直至每个模型共有 N 个训练样本(其中 N 是原始数据点的数量)。

bootstrap的缺点是,每个基模型平均只能看到63%的原始输入样本。原因在于:对数据集数量为N的样本,单个样本不会抽样选中的几率为(1-1/N)^N,在 N 取无穷大的极限情况下,不选中的几率变成1/e,这也就意味着平均只有63%样本被选择,具体如下:                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​  \mathop{\lim}\limits_{N\rightarrow +\infty } (1-1/N)^N = \frac{1}{e}

对于一个给定的基模型,未使用的37%的训练实例通常被称为包外实例oob(out-of-bag
instances )。可以将这些oob实例用于基模型的预测,其性能表现作为测试集性能的预估结果,这为交叉验证提供了一个有用的替代方案。

bootstrap的主要优点是,它可以防止集成过于依赖任何单一训练样本,这也就增强了鲁棒性和泛化性。通过在训练集中略去个别样本,可以发现对决策树产生的影响远大于bagging的结果。

通过对多个模型的预测结果取平均,我们可以得到更为合理的预测模型,这种优势通常随模型数量的增多而增强。

但与此同时,bagging并不总能起到提升性能的效果。特别是,对于集成模型依赖于不稳定的基模型时,此时略去一些可能会显著改变拟合结果的数据就很有必要。

5.Random forests

bagging方法基于这样的假设,即在子数据集上训练相同的算法就会产生足够多样的基模型,这被称为随机森林 Random forests 方法,通过在树的每个节点随机的选择输入变量的子集实现变量的解耦,以及随机选择训练子数据集。通过修改上述GINI指数计算表达式来实现这一点,特征切分维度j在随机选择的特征子集​​​​​​​S_i \subset \{1,2, ..., D \} 上进行优化实现。

6.Boosting

树的集成,无论是通过bagging法还是随机森林算法进行拟合,对应如下的数学形式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​                \large f(x;\theta)=\sum_{m=1}^{M}\beta_mF_m(x;\theta_m)

其中,F_m是第 \large m 棵树,\beta_m 是相应的权重,通常设置为 \beta_m=1。通过允许F_m 函数是通用函数逼近器,比如神经网络模型可以推广上述模型,而不只局限于树模型。上述得到的结果称为加性模型。我们可将其视为具有自适应基函数的线性模型。通常,目标函数选择最小化经验损失(正则化项作为可选项)

        ​​​​​​​        ​​​​​​​                                        \large \mathcal L(f) = \sum_{i=1}^{N} \mathit l(y_i,f(x_i))

Boosting 是一种用于顺序拟合加性模型的算法,其中每个F_m都是一个二分类器具有的返回值F_m \in \{+1,-1 \}。首先在原始数据上拟合F_1, 然后对 F_1 的产生错误预测结果的数据样本进行加权,因此错误分类的样本会得到更多权重,然后将 F_2 拟合到这个加权的数据集上。

通过不断重复这个过程,直到拟合得到所需数量为M的基模型。(其中 M 是一个超参数,它决定模型的整体复杂度,可以通过在验证集上的性能表现并通过early stopping 实现。

可以看出,只要每个F_m的精度优于偶然性(即使在加权数据集上),那么最终的集成分类器将具有比任何给定的单一预测器有更高的精度,即如果F_m是弱学习器(其准确度仅略高于50%),然后可以使用上面的迭代过程提高它的性能,从而最终 f 成为一个强学习器。 

需要指出的是,boosting通过拟合彼此有依赖的树模型(后面的模型依赖前面的学习效果),来减少强学习器的偏差bias,而bagging和RF则通过拟合独立的树(单独学习得到的子模型)来减小方差variance 。在多数情况下,boosting效果会更好。

6.1 Forward stagewise additive modeling

对于一般(可微)的损失函数,我们依次优化等式上述目标函数\mathcal L(f),其中 f 对应的就是加性模型中的f(x;\theta)。也就是说,在第m 次迭代时,计算如下

        ​​​​​​​        ​​​​​​​        \large (\beta_m, \theta_m)=\mathop{\arg\min}\limits_{\beta, \theta} \sum_{i=1}^{N} l(y_i,f_{m-1}(x_i)+\beta F(x_i; \mathbf {\theta}))

其中,f_m(x)的定义如下:

        ​​​​​​​        ​​​​​​​        \large f_m(x)=f_{m-1}(x)+ \beta_m F(x; \theta_m)=f_{m-1}(x)+ \beta_m F_m(x)

需要注意的是,我们不会调整先前添加的模型的参数。具体的优化步骤的取决于我们选择的损失函数,在某些情况下取决于弱学习器 F 的形式。

6.2 Quadratic loss and least squares boosting

假设我们使用平方误差损失函数,l(y,\hat{y})=(y-\hat{y})^2在这种情况下,在第 m 次迭代步对应第 i 项的目标函数变为:

                         l(y_i,f_{m-1}(x_i)+\beta F(x_i;\theta))=(y_i-f_{m-1}(x_i)-\beta F(x_i;\theta)^2)=(r_{im}-\beta F(x_i;\theta))^2

其中 r_{im}=y_i-f_{m-1}(x_i)  是当前模型在第  i 个观测数据上的残差。通过简单地设置\beta=1,可将F拟合为残差来最小化上述目标函数,这被称为最小二乘提升树。

6.3 Exponential loss and AdaBoost

对于二分类问题而言,假定 \tilde{y}_i \in \{+1,-1\} ,假定弱学习器计算如下表达式:

        ​​​​​​​                        \large p(y=1|x)=\frac{e^{F(x)}}{e^{-F(x)}+e^{F(x)}}=\frac{1}{1+e^{-2F(x)}}

Ensemble Learning(Trees, Forests, Bagging, Boosting)_第2张图片

Ensemble Learning(Trees, Forests, Bagging, Boosting)_第3张图片

6.4 LogitBoost

指数损失的问题在于,它给误分类的样本赋予了过高的权重,表现为对异常值非常敏感。此外,因e^{-\tilde{y}f}不是任何二分类变量 \tilde{y }\in \{+1,-1\}的 pmf 的对数形式;因此,不能从f(x)恢复出概率估计。一种自然的替代方法是使用log-loss,这意味着我们将能够根据学习得到的函数提取得到概率估计,具体如下

        ​​​​​​​                        ​​​​​​​        \large p(y=1|x)=\frac{e^{f(x)}}{e^{-f(x)}+e^{f(x)}}=\frac{1}{1+e^{-2f(x)}}

目标是最小化期望的log-loss,表达式如下:

        ​​​​​​​        ​​​​​​​                \large L_m (F)=\sum_{i=1}^{N}log\left [ 1+exp(-2\tilde{y}_i(f_{m-1}(x)+F(x_i))) \right ]

通过对该目标执行牛顿法更新(类似于IRLS),可以导出如下算法9,这称为logitBoost。

Ensemble Learning(Trees, Forests, Bagging, Boosting)_第4张图片

6.5 Gradient boosting

6.5.1 Gradient tree boosting

在实际应用中,梯度提升Gradient boosting几乎总是假设弱学习器是一个回归树,具有如下形式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large F_m(x)= \sum_{i=1}^{J_m} w_{jm}\mathbb{I}(x \in R_{jm})

其中,区域R_{jm} 的预测输出为 w_{jm}(一般来说,{w}_{jm}可以是一个向量。)这种组合形式称为梯度增强回归树,或梯度树增强。其中一个版本称为MART,它代表“多元加性回归树multivariate additive regression trees””。

为了将其用于梯度提升,我们首先在残差上使用标准回归树学习得到第 m 棵树的区域 R_{jm};然后,我们(重新)赋予按如下形式给每个叶子赋予权重:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large \hat{w}_{jm}=\mathop{\arg\min}\limits_{w} \sum_{x_i \in R_{jm}}^{} \mathcal L(y_i,f_{m-1}(x_i)+w)

对于平方误差(如梯度提升法所采用的)而言,最佳权重\hat{w}_{jm}正好是该叶子节点中残差的均值。

6.5.2 XGBoost

XGBoost 表示极端梯度提升法extreme gradient boosting,它是梯度增强树gradient boosted trees的一个非常有效且广泛使用的扩展改进结果。简言之,它在树复杂度上添加正则化项,同时使用loss函数的二阶近似,而不仅仅是线性近似,它在内部节点(如随机森林)的特征上进行采样,同时利用了处理大型数据集的多核方式进行计算处理,以确保其具有可扩展性。

具体而言,XGBoost优化了以下带有正则化项的目标函数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large \mathcal L(f) = \sum_{i=1}^N l(y_i, f(x_i)) +\Omega (f)

其中正则化项

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large \Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^J w_j^2

T 是叶子节点的数量,\gamma\geq 0,\lambda\geq 0 都是正则化项系数。在第m 步的loss函数如下:

        ​​​​​​​        ​​​​​​​        \large L_m(F_m) = \sum_{i=1}^N l(y_i, f_{m-1}(x_i) + F_m(x_i)) + \Omega(f_m) + \mathrm{constant}

对应的二阶Taylor 展开式如下:

        ​​​​​​​        L_m(F_m) = \sum_{i=1}^n [l(y_i,f_{m-1}(x_i) ) + g_{im} F_m(x_i) + \frac{1}{2} h_{im} F_m^2(x_i)] + \Omega(F_m) + \mathrm{const}​​​​​​​

其中,h_{im} 是Hessian 项:

                                                \LARGE h_{im}=\begin{bmatrix} \frac{\partial^2 l(y_i,f(x_i))}{\partial f(x_i)^2} \end{bmatrix} _{f=f_{m-1}}

在回归树的情况下  F(x)=w_{q(x)}, q:\mathbb{R}^D\rightarrow \{1,2,...T\},指定了 x所属的叶子节点。w \in \mathbb{R}^T 指定的是叶节点的权重,由此上述二阶Taylor展开式可重写为:

        ​​​​​​​        \large \begin{align} L_m(q,w) & \approx \sum_{i=1}^N [g_{im} F_m(x_i) + \frac{1}{2} h_{im} F_{m}^2(x_i)] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2 \nonumber \\ & = \sum^T_{j=1} [(\sum_{i\in I_j} g_{im}) w_j + \frac{1}{2} (\sum_{i\in I_j} h_i + \lambda) w_j^2 ] + \gamma T \nonumber \end{align}

上式简化为如下形式:

                        ​​​​​​​        \large L_m(q,w) = \sum^T_{j=1} [G_{im} w_j + \frac{1}{2} (H_{jm}+\lambda) w_j^2] +\gamma T

这是每个\large w_{jm}项的二次函数,通过求偏导数取极值0,得到最佳权重符合如下形式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                        \large w_j^* = -\frac{G_j}{H_{jm}+\lambda}

然后,用于评估不同树结构 \large q 的损失函数变为:

                                        \large \mathcal L({q,w^*})= -\frac{1}{2} \sum_{j=1}^J \frac{G_{jm}^2}{H_{jm}+\lambda} +\gamma J

我们可以使用递归节点分割法优化上述loss函数。特别地,对于给定的叶节点 \large j,我们考虑将其分割为左子树和右子树,也就是左一半和右一半,即 \large I=I_L \cup I_R,然后我们计算这种分割后的增益(损失减少量)如下:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        \large Gain = \frac{1}{2} \left[\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}\right] - \gamma

​​​​​​​其中,G_L,G_R,H_L,H_R 具体的定义如下:

                                 \large G_L=\sum_{i \in I_L}^{}g_{im}, \quad G_R=\sum_{i \in I_R}^{}g_{im}

                                   \large H_L=\sum_{i \in I_L}^{}h_{im}, \quad H_R=\sum_{i \in I_R}^{}h_{im}

由此,我们可以看到,如果增益为负(比如第一项小于 \gamma ),则不值得分割节点。

文献中提出了一种评价目标函数的快速近似方法,不需要对特征进行排序,采用最佳阈值法进行切分。

你可能感兴趣的:(#,机器学习,集成学习,boosting,机器学习,1024程序员节)