集成学习
集成学习,顾名思义就是将多个学习器集成在一起来完成某个任务。其一般结构为:
- 先产生一组个体学习器;
- 然后再用某种策略将这些个体学习器结合起来。
但是并不是说把任何的个体学习器结合起来都可以有效果的提升,其对于学习器的准确率和多样性是有一定要求的,如下例所示:
我们可以看到,对于第二种学习器集成方式,由于其三个学习器对于测试集的预测结果都是一样的,虽然每个学习器的准确率比较高,但是集合在一起并没有达到我们预想的性能提升的目的;对于第三种学习器的集成,虽然其多样性得到了保证,但是每个学习器的准确率很低,导致在集成之后性能不升反降;而对于第一种学习器的集成,因为其即保证了个体学习器的准确性,又保证了不同学习器之间的差异性,从而在集成之后性能相对于个体学习器有了很大的提升。因此,对于集成学习,想要达到预想中相对于个体学习器性能的提升,我们即需要保证每个个体学习器自身比较高的准确率,还要保证学习器的多样性。但是实际上个体学习器的准确性和多样性是冲突的,即学习器的准确性如果很高的话,要增加多样性就需要牺牲准确性。对于集成学习,如何产生好而不同的个体学习器一直都是集成学习的研究核心。而且通常来说对于弱学习器,其集成后的性能提升是要优于强学习器的。
对于集成学习,个体学习器的差异会带来集成策略的不同。当我们的个体学习器都是同质的(学习器都是同种类型的),此时的个体学习器我们成为基学习器,其主要由两大类集成策略是:Boosting和Bagging;当个体学习器是异质的,集成策略的典型代表是Stacking算法。
Boosting
Boosting是一族可将弱学习器提升为强学习器的算法,该算法的学习机制是:首先基于初始训练集样本训练一个基学习器,然后根据该学习器的表现来对训练集样本的分布进行调整从而使得下一次训练的时候学习器能够更加care前一个学习器学习错误的样本而减少对学习正确样本的关注;然后让调整后的样本作为训练集再训练一个基学习器,重复上面的步骤直至基学习器的个数达到了我们的要求T。我们可以看到boosting算法的核心在于其会不断的依据上一次学习器的训练结果来调整下一次训练的训练集的样本分布从而使得下一次的学习器更加的关注上一次学习器错分的样本,因此boosting算法都是一种强关联算法,即各个学习器之间的依赖性很强,其训练是按照序列化的方式来进行训练的。
AdaBoost
target:求得能够使得在样本分布
Dt
下关于
ht(x)
的指数损失函数最小的参数
α
AdaBoost是最常用的Boosting算法。在这里先假设我们的真实函数为
f(x)
,第t个基学习器为
ht(x)
,由基学习器组成的集成模型为
H(x)=∑Tt=1αtht(x)
,那么我们学习的目标就是要最小化指数损失函数
让损失函数关于 αt 求导并为0有:
target:证明在样本分布
Dt
下的损失函数最小和在原样本分布上的损失函数最小是等价的,并导出样本分布
Dt
的调整方式
AdaBoost算法在获得第
Ht−1
之后样本分布将进行调整,使下一轮的基学习器
ht
能纠正
Ht−1
的一些错误。最好的情况就是
ht
学习器纠正了
Ht−1
所有的错误。因此我们可以设定我们的目标为最小化损失函数
在这里说明一下,另 t=−f(x)ht(x) ,那么从 e−f(x)ht(x) 到 1−f(x)ht(x)+12 是对函数 et 在 t=0 处泰勒展开的结果
那么最小化损失函数 l 就相当于:
如果我们另样本 Dt=D⋅e−f(x)Ht−1(x)Ex∼D[e−f(x)Ht−1(x)] ,那么在样本分布 D 下的最小化损失函数等价于在样本分布
我们可以看到,在上面的公式中,当真实函数 f(x) 的值与预测函数 ht(x) 的值相同的越多, E[f(x)ht(x)] 的值就越大,因此上面的目标函数还可以写成
即理想的基学习器
对于样本分布的变化,有:
这样我们就得到了样本的调整方式。通过上面对算法的描述我们可以看到AdaBoost算法的学习方式是一个渐进的过程,即后一个基学习器在学习的时候更加关注前一个基学习器学错的样本。这一点我们通过样本调整公示就可以看到,当真实函数 f(x) 的值与预测值 h(x) 不相等的时候,e的值是在不断变大的,当相等的时候,是变小的,因此在样本分布调整之后,我们会看到分错样本的权值会变大而分对样本的权值则会变小。而且由于参数 α 的存在,使得权重越大的基学习器对样本分布的变化影响越大。而且由于前面学习器学习的结果对于后面学习器学习的偏好有很大的影响,因此我们说AdaBoost算法的学习器之间是强关联的。
这里说到样本,着重说一下样本权值怎么使用的问题,对于可接受样本权值的基学习算法,我们的样本权值对学习器偏好的影响是在损失函数部分,即在计算损失函数的时候,是进行有权运算的,如下所示
这里有一点需要注意,那就是我们在训练的每一轮都要检查该学习器的学习性能,如果该学习器的误差 ϵ>0.5 ,那么我们就立即抛弃该学习器并停止学习。这是因为如果误差大于0.5就会导致学习器的权值小于0,这是不可接受的。因此AdaBoost在使用带权样本进行学习时可能会导致 早停的现象发生。而对于基于重采样的方式,当该学习器不满足条件的时候,可以重新采样再学习一个新的学习器,因此重采样的方式可以获得重启动的机会从而避免早停问题的发生。因为如果发生早停,可能导致集成的学习器性能不佳,因为目标轮数可能远远未达到。
还有一点就是Boosting算法会更加关注如何降低偏差,我们通过其学习的方式就可以看出来,每一个新的学习器的目标是不断降低残差的,即更关注没有学明白的样本,因此Boosting算法能基于泛化能力非常弱的学习器构建出很强的集成学习器。
AdaBoost伪代码(来源于周志华老师的机器学习书,如果侵权请联系本人删除,谢谢):
由于集成学习内容很多,故分成两部分来记笔记。