在这篇文章中总结bagging的概念与意义,并以随机森林为例,进行详细讨论。
Bagging
在上篇中我们提到,“好而不同”是集成学习的关键问题。Boosting通过序列化获取更好效果的学习器,来达到更好的集成,却损失了“不同”这一性质。Bagging是集成学习中的另一类算法,它的目标就是既要“好”又要“不同”。为了实现“不同”这一目标,Bagging把训练样本划分为子集,这样不同子集训练出的学习器的独立性就会提高。而Bagging又使子集都存在一定重叠,因为如果采样出的子集都完全不同,说明每个学习器都只用到了一小部分数据,甚至不足以有效学习。这种重叠的子集划分就完成了让每个学习器训练更充分,变得更“好”的这个目标。
具体来说,对一个有$m$个样本的数据集,Bagging首先进行子集划分,对每个子集,从数据集中做$m$次有放回的随机选取,最后生成$T$个子集。由于$\lim_{m \to \infty} (1-1/m)^m \to 1/e \approx 0.368$,所以会有$36.8\%$的数据我们是没有取到的。随后,Bagging分别使用这$T$个数据集训练出$T$个学习器。在预测时,如果是分类任务,则使用简单投票法,如果是预测任务,则使用简单平均法。下图是具体流程
最后一步的输出表示的是简单投票法,投票得数最多的$y$成为最后的结果。假设单个基学习器的计算复杂度是$O(m)$,那么最后算法的复杂度就趋于$O(m)$,因为最后的投票计算复杂度很小。
随机森林
随机森林 (Random Forest) 是Bagging的一种变体算法,它在以决策树构建Bagging的基础上,抛弃了原本的最优属性划分原则,规定从已有的$d$个属性点中随机取出$k$个属性点构成子集,并从子集中得到最优属性点。推荐值为$k=log_2d$。
随机森林简单,易实现,计算开销小,且在很多现实任务中表现很好。因为其不仅具有Bagging对数据集扰动的性质,还具有对属性点划分的第二重扰动,这使得学习器之间独立性较好。随机森林与Bagging收敛性相似,起始性能较差,但随着学习器数目的增加,却能达到更低的误差。而且不难理解,由于只选出了$k$个属性进行选取,其训练性能要优于$Bagging$。
参考资源
[1]机器学习西瓜书,周志华