集成学习算法总结----Boosting和Bagging
集成学习
基本思想:如果单个分类器表现的很好,那么为什么不适用多个分类器呢?
通过集成学习可以提高整体的泛化能力,但是这种提高是有条件的:
(1)分类器之间应该有差异性;
(2)每个分类器的精度必须大于0.5;
如果使用的分类器没有差异,那么集成起来的分类结果是没有变化的。如下图所示,分类器的精度p<0.5,随着集成规模的增加,分类精度不断下降;如果精度大于p>0.5,那么最终分类精度可以趋向于1。
接下来需要解决的问题是如何获取多个独立的分类器呢?
我们首先想到的是用不同的机器学习算法训练模型,比如决策树、k-NN、神经网络、梯度下降、贝叶斯等等,但是这些分类器并不是独立的,它们会犯相同的错误,因为许多分类器是线性模型,它们最终的投票(voting)不会改进模型的预测结果。
既然不同的分类器不适用,那么可以尝试将数据分成几部分,每个部分的数据训练一个模型。这样做的优点是不容易出现过拟合,缺点是数据量不足导致训练出来的模型泛化能力较差。
下面介绍两种比较实用的方法Bagging和Boosting。
Bagging(Bootstrap Aggregating)算法
Bagging是通过组合随机生成的训练集而改进分类的集成算法。Bagging每次训练数据时只使用训练集中的某个子集作为当前训练集(有放回随机抽样),每一个训练样本在某个训练集中可以多次或不出现,经过T次训练后,可得到T个不同的分类器。对一个测试样例进行分类时,分别调用这T个分类器,得到T个分类结果。最后把这T个分类结果中出现次数多的类赋予测试样例。这种抽样的方法叫做bootstrap,就是利用有限的样本资料经由多次重复抽样,重新建立起足以代表原始样本分布之新样本。
Bagging算法基本步骤:
Bagging的优势在于当原始样本中有噪声数据时,通过bagging抽样,那么就有1/3的噪声样本不会被训练。对于受噪声影响的分类器,bagging对模型是有帮助的。所以说bagging可以降低模型的方差,不容易受噪声的影响,广泛应用在不稳定的模型,或者倾向于过拟合的模型。
Boosting算法
Boosting算法指将弱学习算法组合成强学习算法,它的思想起源于Valiant提出的PAC(Probably Approximately Correct)学习模型。
基本思想:不同的训练集是通过调整每个样本对应的权重实现的,不同的权重对应不同的样本分布,而这个权重为分类器不断增加对错分样本的重视程度。1. 首先赋予每个训练样本相同的初始化权重,在此训练样本分布下训练出一个弱分类器;
2. 利用该弱分类器更新每个样本的权重,分类错误的样本认为是分类困难样本,权重增加,反之权重降低,得到一个新的样本分布;
3. 在新的样本分布下,在训练一个新的弱分类器,并且更新样本权重,重复以上过程T次,得到T个弱分类器。
通过改变样本分布,使得分类器聚集在那些很难分的样本上,对那些容易错分的数据加强学习,增加错分数据的权重。这样错分的数据再下一轮的迭代就有更大的作用(对错分数据进行惩罚)。对于这些权重,一方面可以使用它们作为抽样分布,进行对数据的抽样;另一方面,可以使用权值学习有利于高权重样本的分类器,把一个弱分类器提升为一个强分类器。
弱分类器
Boosting处理过程
Boosting算法通过权重投票的方式将T个弱分类器组合成一个强分类器。只要弱分类器的分类精度高于50%,将其组合到强分类器里,会逐渐降低强分类器的分类误差。
由于Boosting将注意力集中在难分的样本上,使得它对训练样本的噪声非常敏感,主要任务集中在噪声样本上,从而影响最终的分类性能。
对于Boosting来说,有两个问题需要回答:一是在每一轮如何如何改变训练数据的概率分布;二是如何将多个弱分类器组合成一个强分类器。而且存在一个重大的缺陷:该分类算法要求预先知道弱分类器识别准确率的下限。
AdaBoosting算法
针对上述Boosting存在的缺陷和问题,Freund和Schapire根据在线分配算法理论提出了AdaBoost算法,是一种改进的Boosting分类算法。
(1)提高那些被前几轮弱分类器线性组成的分类器错误分类的的样本的权值,这样做能够将每次训练的焦点集中在比较难分的训练样本上;
(2)将弱分类器有机地集成起来,使用加权投票机制代替平均投票机制,从而使识别准确率较高的弱分类器具有较大的权重,使其在表决中起较大的作用,相反,识别准确率较低的分类器具有较小的权重,使其在表决中起较小的作用。与Boosting分类算法相比,AdaBoost算法不需要预先获得弱分类算法识别准确率的下限(弱分类器的误差),只需关注于所有弱分类算法的分类精度(分类准确率略大于50%)。
AdaBoosting算法
训练数据:
(x1, y1), …, (xm, ym),其中 xi∈X, yi∈Y={-1, +1}
Dt(i): 样本xi在第t次迭代的权重,D1(i)=1/m
ht(X):弱分类器Ct训练得到的判别函数,ht:X->{-1, +1}
εt:ht(X)的错误率,加权分类误差(weighted error)
αt:分类器的系数,根据误差计算,误差越小,权重越大
上面权重Dt+1(i)的更新是基于前一步的权重Dt(i),而非局域全局更新。
AdaBoost分类算法是一种自适应提升的方法,由于训练的过程是重复使用相同的训练集,因而不要求数据集很大,其自身就可以组合任意数量的基分类器。在AdaBoost算法中,尽管不同的基分类器使用的训练集稍有差异,但这种差异是随机选择造成的,所不同的是,这种差异是前一个基分类器的误差函数。而提升的过程是针对一个特定问题的实际性能,显然这就依赖于具体的数据和单个基分类器的性能。因此,训练的过程需要有充足的训练数据,并且基分类器应当是弱的但又不至于太弱(即分类准确率略大于50%),而提升的过程对噪声和离群点的干扰尤为明显。
Boosting与Bagging的不同之处:
1、Bagging的训练集是随机的,以独立同分布选取的训练样本子集训练弱分类器,而Boosting训练集的选择不是独立的,每一次选择的训练集都依赖于上一次学习的结果,根据错误率取样,因此Boosting的分类精度在大多数数据集中要优于Bagging,但是在有些数据集中,由于过拟合的原因,Boosting的精度会退化。
2、Bagging的每个预测函数(即弱假设)没有权重,而Boosting根据每一次训练的训练误差得到该次预测函数的权重;
3、Bagging的各个预测函数可以并行生成,而Boosting的只能顺序生成。
4、Bagging是减少variance,而Boosting是减少bias。
参考资料:
Ensemble methods. Bagging and Boosting
Bagging, boosting and stacking in machine learning
HITSCIR-TM zkli-李泽魁 Bagging & Boosting
_______________________________
1、集成学习概述
1.1 集成学习概述
集成学习在机器学习算法中具有较高的准去率,不足之处就是模型的训练过程可能比较复杂,效率不是很高。目前接触较多的集成学习主要有2种:基于Boosting的和基于Bagging,前者的代表算法有Adaboost、GBDT、XGBOOST、后者的代表算法主要是随机森林。
1.2 集成学习的主要思想
集成学习的主要思想是利用一定的手段学习出多个分类器,而且这多个分类器要求是弱分类器,然后将多个分类器进行组合公共预测。核心思想就是如何训练处多个弱分类器以及如何将这些弱分类器进行组合。
1.3、集成学习中弱分类器选择
一般采用弱分类器的原因在于将误差进行均衡,因为一旦某个分类器太强了就会造成后面的结果受其影响太大,严重的会导致后面的分类器无法进行分类。常用的弱分类器可以采用误差率小于0.5的,比如说逻辑回归、SVM、神经网络。
1.4、多个分类器的生成
可以采用随机选取数据进行分类器的训练,也可以采用不断的调整错误分类的训练数据的权重生成新的分类器。
1.5、多个弱分类区如何组合
基本分类器之间的整合方式,一般有简单多数投票、权重投票,贝叶斯投票,基于D-S证据理论的整合,基于不同的特征子集的整合。
2、Boosting算法
2.1 基本概念
Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。他可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。在产生单个的基分类器时可用相同的分类算法,也可用不同的分类算法,这些算法一般是不稳定的弱分类算法,如神经网络(BP) ,决策树(C4.5)等。
2.2、Adaboost
Adaboost是boosting中较为代表的算法,基本思想是通过训练数据的分布构造一个分类器,然后通过误差率求出这个若弱分类器的权重,通过更新训练数据的分布,迭代进行,直到达到迭代次数或者损失函数小于某一阈值。
Adaboost的算法流程:
假设训练数据集为T={(X1,Y1),(X2,Y2),(X3,Y3),(X4,Y4),(X5,Y5)} 其中Yi={-1,1}
1、初始化训练数据的分布
训练数据的权重分布为D={W11,W12,W13,W14,W15},其中W1i=1/N。即平均分配。
2、选择基本分类器
这里选择最简单的线性分类器y=aX+b ,分类器选定之后,最小化分类误差可以求得参数。
3、计算分类器的系数和更新数据权重
误差率也可以求出来为e1.同时可以求出这个分类器的系数。基本的Adaboost给出的系数计算公式为
然后更新训练数据的权重分布,
(图片来自李航的统计学习方法)
4、分类器的组合
当然这种组合方式基于分类器的系数的,而分类器的系数又是根据误差率求出来的,所以Adaboots最后影响的就是如何使用误差率,以及训练数据更新权重的的计算系数。
5、Adaboost的一些问题
Adaboost中涉及到一些可以进行调整的参数和计算公式的选择主要有以下几点:
**弱分类器如何选择
**如何更好的实验误差率计算分类器的系数
**如何更好的计算训练数据的权重的分布
**弱分类器如何进行组合
**迭代次数
**损失函数的阈值选取多少
3、Bagging算法
bagging方法bootstrap aggregating的缩写,采用的是随机有放回的选择训练数据然后构造分类器,最后组合。这里以随机森林为例进行讲解。
随机森林算法概述
随机森林算法是上世纪八十年代Breiman等人提出来的,其基本思想就是构造很多棵决策树,形成一个森林,然后用这些决策树共同决策输出类别是什么。随机森林算法及在构建单一决策树的基础上的,同时是单一决策树算法的延伸和改进。在整个随机森林算法的过程中,有两个随机过程,第一个就是输入数据是随机的从整体的训练数据中选取一部分作为一棵决策树的构建,而且是有放回的选取;第二个就是每棵决策树的构建所需的特征是从整体的特征集随机的选取的,这两个随机过程使得随机森林很大程度上避免了过拟合现象的出现。
随机森林算法具体的过程:
1、从训练数据中选取n个数据作为训练数据输入,一般情况下n是远小于整体的训练数据N的,这样就会造成有一部分数据是无法被去到的,这部分数据称为袋外数据,可以使用袋外数据做误差估计。
2、选取了输入的训练数据的之后,需要构建决策树,具体方法是每一个分裂结点从整体的特征集M中选取m个特征构建,一般情况下m远小于M。
3、在构造每棵决策树的过程中,按照选取最小的基尼指数进行分裂节点的选取进行决策树的构建。决策树的其他结点都采取相同的分裂规则进行构建,直到该节点的所有训练样例都属于同一类或者达到树的最大深度。
4、 重复第2步和第3步多次,每一次输入数据对应一颗决策树,这样就得到了随机森林,可以用来对预测数据进行决策。
5、 输入的训练数据选择好了,多棵决策树也构建好了,对待预测数据进行预测,比如说输入一个待预测数据,然后多棵决策树同时进行决策,最后采用多数投票的方式进行类别的决策。
随机森林算法图示
随机森林算法的注意点:
1、 在构建决策树的过程中是不需要剪枝的。
2、 整个森林的树的数量和每棵树的特征需要人为进行设定。
3、 构建决策树的时候分裂节点的选择是依据最小基尼系数的。
随机森林有很多的优点:
a. 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合。
b. 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力。
c. 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。
d. 在创建随机森林的时候,对generlization error使用的是无偏估计。
e. 训练速度快,可以得到变量重要性排序。
f. 在训练过程中,能够检测到feature间的互相影响。
g 容易做成并行化方法。
h. 实现比较简单。
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡
![](https://img2020.cnblogs.com/blog/938105/202010/938105-20201013171833350-276632012.png)