写在前面
在接触到kaggle案例后,见识到集成学习的威力,集成学习是一种”博众之长”的思想。例如一个项目,搞算法的、写代码的、做UI的等等均是不同的人,单独出来这些人都不能完成项目,把这些人聚集在一起,发挥自己的专长,则可以高质量的完成工作,而将这些人联系在一起的便是项目规划书。集成学习也是这样的一个思想。有时候单个的学习算法不足以解决问题,可能算法的结果不够准确。但将这些算法模型组合起来便可以得出很好的结果,所以集成学习可以看作成一个框架。
那么集成学习的问题有两个:(1)怎么选择个体学习器;(2)怎么选择结合策略。
个体学习器
这里的个体学习器又叫做“弱学习器”,是指一个模型针对学习任务的结果比随机猜测的准确性好的模型。那么怎么选择学习器呢?目前有两种方法:
(1):选择相同类型的模型,只是模型的参数不同,或者叫做同质的,例如都选择决策树或者多层感知器;
(2):选择不同种类的模型,或者叫做异质的,例如第一个选择支持向量机,第二个选择逻辑回归等。
同质个体学习器的应用是最广泛的,一般常说的集成学习的方法都是指的同质个体学习器。而同质个体学习器使用最多的模型是CART决策树和神经网络。同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法,第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林(Random Forest)系列算法。
boosting
boosting模型整个框架如图:
首先对训练样本中的每个样本赋予一个权值(通常设置为
1m
,
m
是样本的数量)。然后训练出第一个弱学习器,根据第一个学习器的误差较大的样本赋予较大的权值,使得这些样本在后续得到更多的关注。经过权值调整之后,学习第二个学习器,然后再调整权值,如此重复。直到学习器的数量到达预先设定的值。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树(boosting tree)系列算法。提升树系列算法里面应用最广泛的是梯度提升树(Gradient Boosting Tree)。
bagging
bagging的原理示意图如下:
从示意图可以看到bagging和boosting的不同,它并不依赖上一学习器的学习结果,首先从原始训练样本中进行随机采样,一共采样T个样本集,每个样本集和原始样本集数量相同,对这随机采样的T个样本集分别训练一个学习器,最后将这T个学习器进行结合。
这里的采样一般选择放回采样,又叫做自助采样法(Bootstap sampling),所以每个样本可能被重复采样到。但m个样本都相同的情况属于基本不可能发生的事件,且采样得到的各个样本集相同的情况同样是不可能的事件。所以T个样本集学习出T个不同的弱学习器。
结合策略
假设前面学习到的T个学习器分别是
平均法
平均法常用于回归问题,即最后的结果选择为T个学习器结果的平均,平均值又可分为算数平均和加权平均。
算数平均的最后预测结果是:
投票法
对于分类问题的预测,我们通常使用的是投票法。假设我们的预测类别 {c1,c2,...ck} ,对于任意一个预测样本x,我们的T个弱学习器的预测结果分别 {l1,l2...lT} 。最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数,也就是T个弱学习器的对样本x的预测结果中,数量最多的类别ci为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
stacking
上两节的方法都是对弱学习器的结果做平均或者投票,相对比较简单,但是可能学习误差较大,于是就有了学习法这种方法,对于学习法,代表方法是stacking,当使用stacking的结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。