失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 机器学习集成方法Bagging Boosting和Stacking

机器学习集成方法Bagging Boosting和Stacking

时间:2019-04-22 14:05:49

相关推荐

机器学习集成方法Bagging Boosting和Stacking

一. 概述

集成学习是一种训练多个弱学习器从而得到更好预测结果的方法。一般情况来说,集合弱学习器可以得到更准确更强力的模型。

1. 弱学习器

弱学习器,弱学习器常指泛化性能略优于随机猜测的学习器,例如在二分类问题桑精度略高于50%的分类器。在集成学习中,弱学习器又称基学习器,常指决策树这类预测能力不太理想的简单模型,是组成同质集成模型的重要部分。

弱学习器往往存在两类问题:

(1)high variance。即模型过于复杂,在所选训练集表现优良而在测试集表现不佳(即overfitting)。

(2)high bias。即模型不够精确,在所选训练集和测试集均表现不佳(即underfitting)。

而好的模型需要保证bias+variance最小,即保证测试误差(test error)最小。

不同的弱分类器有不同的特性,有些容易过拟合,有些容易欠拟合。而弱分类器的选择和模型的特性需要配合。如果选择low bias和high variance的模型,就应该选择可以减少variance 的集成算法。相反,

如果选择low variance 和 high bias的模型,应该选择可以减少bias的集成算法。

2. 集成学习的分类

集成学习模型主要有三类:

1.Bagging: “并行”训练同质的弱学习器,然后将他们进行综合产生结果较好的模型。该种方法可以有效减少模型的variance(即overfitting)。

2.Boosting: “链式”训练同质的弱学习器,后一个模型在前一个模型上进行修正和完善。该种方法可以减少模型的bias(即underfitting)。

3.Stacking: 通常用于异质的弱分类器。“并行”训练不同的弱学习器,同时使用一个元模型(meta model)用来学习如何将这些模型结合在一起,从而提高模型的预测能力。

其中,Bagging和Boosting属于同质集成,即只包含同种类型的个体学习器的集成。而Stacking一般由不同类型的个体学习器组成。综合来说,bagging主要是减少variance,而boosting和stacking可以训练bias小的模型(虽然同时variance也可以被减小)。

二. 关于Bagging(Bootstrap aggregating)

1.Bootstrapping

Bootstrap方法是常用的统计学方法,实质是对观测信息进行不放回抽样,从而对总体的分布特性进行统计推断。

需要注意的是,抽取出的样本的大小要远远小于总体样本大小,这样才能保证样本之间的相关性尽量小,使估计尽量准确。但在实际应用中,因为完全独立的抽样难以实现,往往需要生成多个bootstrap样本来估计总体统计分布。

2.Bagging

(1)Bagging的流程

从初始数据集中使用Bootstrap算法抽取多个大小相同的子数据集,在每个数据集上建立模型。最终将结果进行“平均”,得到集成模型。

(2)“平均”的方法

对回归问题来说,每个个体学习器的结果都直接进行平均,输出为集成模型的结果。

对于分类问题,则需要每个个体学习器进行“投票表决”(voting)。而“投票表决”分为两种,一种为“硬投票”(hard-voting),另一种则为“软投票”(soft-voting)。“硬投票”为每个个体学习器进行分别预测,得票最多的类别则为最终集成模型的结果。“软投票”为将每个个体学习器的每个类别的可能性进行平均,平均可能性最大的类别为最终集成模型的结果。

(3)树和森林

树模型是非常常见的基学习器(弱学习器),由多个树组成的集成模型称为“森林”。

组成森林的树分为两种:

第一种,“浅树”(shallow trees)。浅树一般有high bias,low variance 的特性(欠拟合)。常用于“链式”模型(sequential methods)。

第二种,“深树”(deep trees)。深树一般有high variance,low bias的特性(过拟合)。常用于“并行”模型(bagging methods)。

随机森林就是一种由在bootstrap样本上训练的层数较多的树组成的集成模型。树的数量可以有效减少单棵树较高的variance。同时,为了进一步避免每一棵树之间的相关性,随机森林不仅进行数据集抽样,还会进行特征的随机抽样。这样的方法不仅可以减少结果之间的相关性,还可以有效增加模型对于缺失值的稳定性—含有缺失值的观测数据在特征抽样时未抽取含有缺失值特征的情况下,仍然可以建立回归或分类模型得到结果。因此随机森林模型结合bagging算法和随机特征空间选择来建立更稳定的模型。

三. 关于Boosting

1.Boosting

Boosting算法使用叠加的方法训练模型,其中每一个模型都在前一个模型的基础上进行优化,即着重学习预测错误的观测数据。

(1)Boosting弱学习器的选择

Boosting算法和Bagging算法一样,对于回归和分类问题均适用。但与Bagging算法专注于减少基模型的variance不同,Boosting算法专注于减少模型的bias。Boosting选择的基学习器一般为low variance但是high bias的模型,例如层数较少的树模型。

(2)Boosting 模型的训练

当决定了弱学习器的类型,我们仍然要解决两个问题:

一,在每一轮中如何“改造”旧学习器?

二,如何将新的学习器叠加到旧的学习器上?

下文中的两个不同的Boosting算法 — adaptive boosting 和 gradient boosting将会对这两个问题进行讨论。简要来说,这两种不同的算法在建立和合成弱学习器的过程中有所不同。Adaptive boosting 会更新每一例观测数据的权重,而gradient boosting会更新每一例观测数据的值。这两种算法都认为,最优模型是弱学习器的加权集合。

2. Adaptive boosting

Adaboost算法的核心就是由分类效果较差的弱分类器逐步地强化成一个分类效果较好的强分类器。而强化的过程,就是逐步提高预测错误的样本的权重,从而得到预测准确率更高的强分类器。

Adaboost算法主要为几个步骤:

(1)均匀分配各个观测数据(每行)的权值。

(2)基于现有权值选择当前最好的弱学习器并计算现有分类器误差率,从而得到分类器的权值

(3)误分类的观测数据的权值升高,相对的,正确预测的观测数据的权值减小。

(4)使用更新过的权值建立模型。

(5)重复(2)-(4)步。

(6)直到误分类观测数据为0或达到学习轮数,则停止学习,依据不同弱分类器的权值进行模型集成。

其中需要注意的是,分类器误差率会随着观测数据的权值的变化而变化,而分类器权值和分类器误差率呈负相关,即分类器误差率越小,相应的分类器权值则越大。而观测数据的权值由上一轮弱分类器观测数据的权值和当前弱分类器的误差率相关。

3. Gradient boosting

(1)梯度下降算法

梯度下降法的基本思想可以类比为一个下山的过程:假设我们被困在山上,需要找到山谷。但此时山上的雾很大,导致下山的最优路径无法一眼确定,我们只能走一步算一步。具体来说,以当前的所处的位置为基准,寻找这个位置最陡峭的地方往下走(即梯度的负方向)。然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置再走一步,如此反复采用同一个方法,最后就能成功的抵达山谷。当然,这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处,即得到一个局部最优解。

当然上图并不是标准的凸函数,可以用不同的初始位置进行梯度下降,来寻找更小的极小值点。如果损失函数是标准的凸函数,就可以很轻松地找到最低点。

总结来说,按照梯度下降算法的思想,它将按如下操作达到最低点(局部最低点):

一,明确自己现在所处的位置

二,找到相对于该位置而言下降最快的方向

三,沿着第二步找到的方向走一小步,到达一个新的位置,此时的位置肯定比原来低

四,回到第一步

五,在最低点处终止

那么,在数学语言中如何描述以上五步呢?

首先,在一元函数中,某点的变化率(即斜率)由一元函数的导数来表示。导数越大,说明函数在该点的变化越大。而导函数本身则代表函数沿着x方向的变化率。

而在二元函数z = f(x,y) 中,它对x和y的偏导数分别表示**“函数在y方向不变的情况下,函数值沿x方向的变化率”“函数在x方向不变的情况下,函数值沿y方向的变化率”**

而函数在其他方向上的变化率怎么表示呢?

在一平面中,任意一向量都可以用两个不共线的基向量表示,也就是说在任意方向的变化,都可以分解到x和y两个方向上。

如想求 μ \mu μ方向上的变化率,根据导函数的定义代入:

其中 α \alpha α是 μ \mu μ方向与x正方向的夹角。使用洛必达法则,分子分母同时对 Δ \Delta Δ μ \mu μ求导,得:

这是一个自变量是 α \alpha α的函数,我们将其命名为方向导数。其表明随着 α \alpha α的不同,方向不同,函数的变化率也会不同。那么,方向导数本身代表的就是函数变化率与方向的关系,而梯度方向就是函数变化率最大的方向,更本质地来说是函数增长最快的方向。所以,当我们要最小化损失函数时,只需要使损失函数沿着负梯度前行,就能使损失函数最快下降。

二元函数的推导结论同样适用于更高元的函数:

在单变量函数中,梯度其实就是函数的微分,代表着函数在某个给定点的的切线的斜率。在多变量函数中,梯度是一个向量,梯度的方向就指出了函数在给定点的上升最快的方向。

经过证明,多元函数中,只要函数的每一个变量都沿着关于这个变量的偏导所指定的方向来变化,函数的整体变化就能达到最快。将高元函数某点每一个变量求偏导,组成一个向量。那么该向量的方向就是函数在该点处增长最快的方向,其负方向就是函数减少最快的方向。

由此引入梯度下降的公式:

其中, α \alpha α在梯度下降算法中被称作学习率或者步长。 α \alpha α不能太大也不能太小。太小的话,可能迟迟走不到最低点;太大的话,会导致错过最低点。

另外,梯度前的负号表示我们是朝着梯度相反的方向前进,即函数值减少最快的方向。

(2)GBDT(Gradient Boosting Decision Tree)

GBDT是一种常用的梯度提升模型,其利用了损失函数的负梯度在当前模型的值作为提升树的残差(pseudo-residuals)来拟合新的树。

GBDT主要由四个概念组成:决策树(Decision Tree)、缩减(Shrinkage或Learning rate)、Random Sampling。该版本的GBDT可以适用于所有的回归问题(包括线性和非线性),也可用于二分类问题。

需要注意的是,GBDT中的决策树都是回归树(regression tree)。GBDT是一个加法模型,优化目标是使得损失函数最小。所以GBDT的核心在于累加所有树的结果,而只有回归树的结果加减才有意义。而决策树的建立过程有许多超参数会起到作用,包括树的数量(n_estimators)、深度(max_depth)、叶子结点的数量(max_leaf_nodes)、可以进行分割的最小观测数据量(min_samples_split)、每次分割要保证减少的最小信息熵(min_impurity_decrease)等等。

GBDT的的核心在于:每一棵树学的是之前所有树预测值和的残差,残差+预测值 = 真实值。残差向量就是全局最佳的优化方向。在回归问题中,一般使用均方误差(mean-square error, MSE),即预测值和实际观测值之间差的平方的均值来评估模型拟合的好坏。而预测值和观测值的差值为残差。

Shrinkage的思想认为,每次只走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即,需要多学几棵树,减少树的深度,减小学习率(learning rate α \alpha α)来改善过拟合。

Random Sampling指的是每次迭代训练基学习器时,使用的均是从完整的训练数据集中随机抽取的子数据集(不放回抽样)。一般来说有三种模式:1.创建每个树之前抽取关键词。2.创建每个树之前抽取特征。3.每次划分时抽取特征。根据经验来说,每次选取50%的数据可以有效避免过拟合。

有时树的叶子结点的预测值-也称为叶子的权值(leaf weight)可以使用L1或L2进行正则化。这样可以有效避免过拟合。

四. 关于Stacking

Stacking(又称stacked generalization)与Bagging和Boosting主要有两点不同:1.Stacking算法使用异质的弱分类器(不同的模型),而bagging和boosting则使用同质的弱分类器(相同的模型)2.Stacking算法使用meta-model来结合各个模型,而bagging和boosting则使用确定性算法。

1.Stacking基本概念

概括来说,stacking算法是训练meta-model来整合不同的弱分类器从而得到最终的预测模型的算法。其中不可或缺的两个元素,一是选定不同的弱分类器,二是训练meta-model来将这些弱分类器组合起来。

举例来说,对于一个分类问题来说,我们可以选择KNN、Logistic Regression和SVM作为弱分类器,选择神经网络作为meta-model。meta-model会学习各个弱分类器输出的预测结果并依此返回最终预测结果。需要注意的是,和普通模型一样,回归及分类问题需要不同的弱分类器。

Stacking算法主要分为四步:

1.将训练集数据分为两份。

2.在第一份数据集上训练选择的多个模型作为弱分类器。

3.使用每一个弱分类器在第二份数据集上进行预测。

4.在第二个数据集上以弱分类器的预测结果作为输入训练元模型,找到可以得到最佳预测结果的各个弱分类器的结合方法。

因为把数据集一分为二会大幅减少可用的训练数据量,所以可以应用k折交叉验证来改善模型训练结果。

2.多层Stacking

Stacking算法可以扩展成为多层stacking。举例来说,一个三层的stacking算法,就包括第一层的N多个弱分类器、第二层以第一层弱分类器预测结果为输入的M个元模型以及第三层以第二层弱分类器预测结果为输入的最后一个元模型。但是,增加stacking算法的层数是一个非常消耗数据和时间的事情:如果使用交叉验证,这样多层的模型对数据集大小的要求更高;如果使用交叉验证,那会需要建立数量庞大的模型,运行速度会慢很多。

参考资料:

1./stacking-ensemble-machine-learning-with-python/

2./ensemble-methods-bagging-boosting-and-stacking-c9214a10a205

3./p/61083714

4./pinard/p/5970503.html

5./p/c7e642877b0e

6./supplemental_media/udacityu/315142919/Gradient%20Descent.pdf

7./qq_41800366/article/details/86583789

8./shine19930820/article/details/65633436

9./peizhe123/p/5086128.html

10./stacking-ensemble-for-deep-learning-neural-networks/

如果觉得《机器学习集成方法Bagging Boosting和Stacking》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。