组合算法是将若干个弱分类器组合成一个强分类器的一种策略。常用的组合算法包括bagging、RandomForest、AdaBoost、GBDT等。
Bootstrapping
Bootstrapping法就是利用有限的样本资料经由多次重复抽样,重新建立起足以代表母体样本分布之新样本。Bootstrapping是一种有放回的抽样方法,是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。
Bagging(Bootstrap aggregation,Breiman,1996)
一个贴近生活的例子
假设你是一个病人,希望根据你的症状,让医生做出诊断。正确的做法,你会看多个医生,根据这些医生的不同诊断结果,选择大多数医生都认同的诊断结果。当然,由于你不知道这些医生的医术水平的高低,所以,保险的做法就是认为,每个医生诊断结果的权威性都是相同的。同时,在你让医生诊断的过程中,由于医生的诊断习惯不同,他们会根据自己的特点,选择自认为可以判断你病情的症状作为自己的判断依据,有些医生可能会测量你的温度,也有些可能会看你的气色,当然,也不排除可能会看你的手相的江湖郎中。不管怎样,你都将通过上述的过程,得到你想要的诊断结果。这种结果,通常要比你只看一个医生而得到结果更加可信。
算法过程:
输入:D(d个训练元组的集合),k(组合分类器中的模型数),一种学习方法
输出:组合分类器
方法:
(1)for i = 1 to k do // 创建k个模型
(2)通过对D有放回抽样,创建自助样本 Di
(3)使用 Di 和学习方法导出模型 Mi
(4)endfor使用组合分类器对元组x分类:让k个模型都对x分类并返回多数表决
AdaBoost(Freund & Schapire,1996)
AdaBoost是一种Boosting算法,Boosting算法的基本思想就是:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。Boosting算法可以认为是对Bagging算法的一种改进,还是让面看病的例子。Boosting算法会将不同医生根据其医术的高低,分别赋予一个权重,现实中也应该如此,对于那些妙手回春的医生,其给出的诊断结果理应更加可信。
AdaBoost算法是一种流行的Boosting算法,其算法步骤如下:
输入:D(类标记的训练元组集),k(轮数,每轮会产生一个分类器),一种分类学习方法
输出:组合分类器
方法:
(1)初试化训练数据的权重分布: D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2,...,N
(2)对 m=1,2,...,M
(a)使用具有权值分布 Dm 的训练数据集学习,得到基本分类器 Gm(x):χ→{−1,+1}
(b)计算 Gm(x) 在训练数据集上的分类误差率: em=P(Gm(xi)≠yi)=∑Ni=1wmiI(Gm(xi)≠yi)
(c)计算 Gm(x) 的系数: αm(x)=12ln1−emem
(d)更新训练数据集的权值分布: Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N) , wm+1,i=wmiZmexp(−αmyiGm(xi)) ,这里, Zm 是规范因子: Zm=∑Ni=1wmiexp(−αmyiGm(xi)) ,它使 Dm+1 成为一个概率分布
(3)构建基本分类器的线性组合: f(x)=∑Mm=1αmGm(x) ,得到最终分类器: G(x)=sign(f(x))=sign⟮∑Mm=1αmGm(x)⟯