本文来自之前在Udacity上自学机器学习的系列笔记。这是第14篇,介绍了监督学习中的集成学习。
什么是集成学习
如果我们要对邮件进行判断,是否属于垃圾邮件。首先,我们有一大堆做好分类的邮件数据集。通过观察属于垃圾邮件的数据,每次观察一部分,可以得到一个关于垃圾邮件的规则。比如说,规则一是垃圾邮件有关于“促销”的文字;规则二是邮件包含了“尼日利亚王子”;规则三邮件内容很短,只有两行文字等。最后,我们将这些规则合并起来,组成一个总的判断规则来对邮件进行判断。这种方法就是集成学习。
综上,集成学习就是将多个学习器结合起来构成一个总的更强的学习器。集成学习需要解决两个问题,第一个是如何得到多个的学习器,我们称之为基学习器;第二个是得到了多个学习器后如何结合起来。
一般有两类比较流行的集成方法,分别是Bagging和Boosting。Bagging的多个学习器之间没有强关联,而且采用均值合并的集成方式;Boosting的多个学习器之间有强关联,而且采用加权平均的集成方式。
Bagging
Bagging,又叫做Bootstrap Aggregation,具体做法是,从从训练集中随机抽取一部分样本,使用适合的基学习器训练后,将样本放回并重复抽取和训练的步骤,直至得到多个学习器后,对测试集数据进行预测,得到多个结果,通过均值合并的方式得到最终预测结果。
比如说下图的数据点。红色是训练集,绿色是测试集。我们随机选择5个包含5个训练集样本点的子集,然后计算三阶多项式拟合曲线。得到5条曲线后,进行均值合并得到图示的红色表示出来的三阶多项式曲线。而蓝色表示的是按照线性回归得到的四阶多项式拟合曲线。相比较两者后发现,虽然蓝色线比红色线在训练集上的表现更好,但是红色线在测试集上的表现更好。这是因为,红色线所代表的集成方法通过随机选择不同子集的数据进行均值合并,避免了受到训练集个别数据的影响而产生的过拟合。
Bagging模型中典型的代表是随机森林(RandomForest,RF)模型。
Boosting
Boosting的中心思想是选择“难”的数据,集成则是用到加权平均。与Bagging相比,这里的基学习器存在强关联,后一个基学习器是基于前一个基学习器的。Boosting选择“难”数据的过程,就是基于上一个基学习器,对预测结果不好的数据增加权重,来构造下一个基学习器。
在介绍具体做法前,先认识两个概念。
误差
在之前的线性回归等模型中,评价指标是使用预测值与实际值之间的误差的平方和计算得出。并不会考虑每个预测样本的权重,或者说每个预测样本的权重都是一样的。这里的误差概念考虑了样本的权重,权重系数定义为:
比如说有四个数据点,其中两个预测有误差,分配的权重都是1/20,那么这个值就是1/10。如果不考虑权重,而是1/2。
弱学习器(Weak Learner)
弱学习器的定义是,不管权重分布如何,学习器得到的结果都会不小于1/2。即
结合上面的误差和弱学习器的定义,我们可以写出Boosting的伪代码为:
给定数据集,,,对于每一个时间步,构建一个数据的权重分布,寻找弱学习器,使得。最后输出。
其中,数据的权重分布具体做法是:首先设置,然后令,其中,其中是一个归一化因子。
最终输出则是基于的加权平均,定义为
上述具体的推导可以参考这篇论文的介绍:
http://ww.web.stanford.edu/~hastie/Papers/SII-2-3-A8-Zhu.pdf
大概意思就是,boosting在每一轮构建基学习器时,都会用上所有的训练集数据。一开始给出初始均等的权重假设进行学习,然后每一轮构建的基学习器,通过计算可以得到相应的预测结果、误差。然后将学习器、预测结果和误差作为输入给到下一轮的基学习器的构建。这个时候,预测结果差的会相应地加大权重进行学习。最后,根据各个基学习器的预测结果按照具体定义的权重系数进行加权平均。然后将得到的结果输入到一个阈值函数,得到一个相应的类别。
比如说,对下图方形区域的数据点进行分类,分别进行了三次的基学习器学习,最终可以得到一个“折线”形式的决策边界,将数据点分隔开来。
上述提到的模型可以参考sklearn的文档和代码说明