集成学习常见的两种集成方案为bagging和boosting,其中bagging是一种基于投票的并行方案,boosting是一种基于改变原始数据集分布的迭代串行方案(某些环节也可并行)。bagging的代表算法为随机森林,boosting的代表算法有adaboost、gbdt、xgb等。
bagging方案图:从训练集从进行子抽样组成每个基模型所需要的子训练集,对所有基模型预测的结果进行综合产生最终的预测结果
boosting方案图:训练过程为阶梯状,基模型按次序一一进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次都进行一定的转化。对所有基模型预测的结果进行线性综合产生最终的预测结果:
AdaBoost算法有AdaBoost.M1和AdaBoost.M2两种算法,AdaBoost.M1是我们通常所说的Discrete AdaBoost,而AdaBoost.M2是M1的泛化形式。adaboost是由Yoav Freund和Robert E. Schapire 首先提出来的一种用于二分类问题的集成方法;紧接着出现的Adaboost.M1将二分类扩展到多分类问题;而AdaBoost.M2不仅可以处理多分类问题,还引入了置信度的概念,进一步扩展了AdaBoost算法;AdaBoostMH算法则是基于AdaBoost.M1算法的一种标签转化方案的多标签算法。关于AdaBoost算法的一个结论是:当弱分类器算法使用简单的分类方法时,boosting的效果明显地统一地比bagging要好.当弱分类器算法使用C4.5时,boosting比bagging较好,但是没有前者明显。后来又有学者提出了解决多标签问题的AdaBoost.MH和AdaBoost.MR算法,其中AdaBoost.MH算法的一种形式又被称为Real Boost算法---弱分类器输出一个可能度,该值的范围是整个R, 和与之相应的权值调整,强分类器生成的AdaBoost算法。事实上:Discrete AdaBoost是指,弱分类器的输出值限定在{-1,+1},每个弱分类器有相应的权值,从而构成一个强分类器。adaboost采用的集成方式是对基分类器的结果进行加权求和,如果结果大于0则样本被分为正类,如果结果小于0则样本被分为负类。adaboost算法要做的就是每次迭代过程中,赋予被错误分类的样本更大的权重。
1). adaboost算法
adaboost算法要做的就是每次迭代过程中,赋予被错误分类的样本更大的权重
最终一个样本的预测值为:
adaboost采用的集成方式是对基分类器的结果进行加权求和,如果结果大于0则样本被分为正类,如果结果小于0则样本被分为负类
从算法步骤中我们可以看出,权重的更新方式为:
如果一个样本被上一个分类器正确分类,那么它的权重将乘以e**-at(大于0小于1),如果这个样本被上一个分类器错误分类,那么它的权重将乘以e**at。也就是说错误分类的样本权值相对于正确分类的样本权值扩大了e**2at倍,而e**2at=(1-et)/et。常用的改变权重方式为样本抽样和标签系数转化。
2).adaboost.m1算法
adaboost算法对权值更新函数做了更改使其适用于多分类问题
adaboost.m1算法和adaboost算法的不同点在于:
a.H(x)的形式发生了变化,没用使用sign()映射转化,但是其本质任然没有发生改变,任然可以看做是对基分类器的分类结果进行头片产生最终结果,而且基分类器的权重本质上也为ln(1-et)/et。
b.两者的本质区别在于第10步,对比我们可以发现为了适应多分类问题,adaboost的权值更新函数做了一定的调整。权值更新方案为:
如果一个样本被上一个分类器错误分类,那么它的权重不变,如果这个样本被上一个分类器正确分类,那么它的权重将乘以et/(1-et),也就是说错误分类的样本权值相对于正确分类的样本权值扩大了(1-et)/et倍(因为如果更改分类错误样本我们不知道其具体偏向哪个类别错误)。
3).adaboost.m2算法
在adaboost.M2中算法对基分类器的输出形式做出了限制,给定一个样本,基分类器对c1到cm的类都输出一个介于0和1之间的值,表示这个样本属于某个类的概率,且这些值相加等于1
adaboost.M2的思路还是提高难以被正确分类的样本的权重,例如样本可以被分为A,B,C三类,某个样本xi真实类别标签为A,第k轮分类器对xi的分类结果为:
类别 A B C
概率 0.1 0.5 0.6
显然当前基分类器对这个样本的分类不理想,那么adaboost.M2算法会根据步骤8来计算计算当前基分类器的误差,接着步骤10会修改错误类B,C的权重,进而在下一次迭代的步骤6中更新这个样本的权重。