bagging是一种与上一节实现的MajorityVoteClassifier关系紧密的集成学习技术,如下图所示:
不过,此算法没有使用相同的训练集拟合集成分类器中的单个成员分类器。由于原始训练集使用了boostrap抽样(有放回的随机抽样),这也就是bagging被称为boostrap aggregating的原因。为了用更具体的例子来解释boostrapping的工作原理,我们使用下图所示的示例来说明。在此,我们有7个不同的训练样例(使用索引1~7来表示),在每一轮的bagging循环中,它们都被可放回随机抽样。每个bootstrap抽样都被用于分类器Cj的训练,这就是一棵典型的未剪枝的决策树:
bagging还与我们在第3章中曾经介绍过的随机森林紧密相关。实际上,随机森林是bagging的一个特例,它使用了随机的特征子集去拟合单棵决策。bagging最早由Leo Breiman在1994年的一份技术报告中提出。他还表示,bagging可以提高不稳定模型的准确率,并且可以降低过拟合的程度。我强烈建议读者阅读L.Breiman的论文[1],以更深入了解bagging。此文献可在网上免费获取。
为了检验一下bagging的实际效果,我们使用第4章中用到的葡萄酒数据集构建一个更复杂的分类问题。在此我们只考虑葡萄酒中的类别2和类别3,且只选择Alcohol和Hue这两个特征。
接下来,我们将类标编码为二进制形式,并将数据集按照六四分的比例划分为训练集和测试集:
scikit-learn中已经实现了BaggingClassifier相关算法,我们可从ensemble子模块中导入使用。在此,我们将使用未经剪枝的决策树作为成员分类器,并在训练数据集上通过不同的booststrap抽样拟合500棵决策树:
然后我们将计算训练数据集和测试数据集上的预测准确率,以比较bagging分类器与单棵未剪枝决策树的性能差异:
基于上述代码执行的结果可见,未经剪枝的决策树准确地预测了训练数据的所有类标;但是,测试数据上极低的准确率表明该模型方差过高(过拟合):
虽然决策树与bagging分类器在训练集上的准确率相似(均为1.0),但是bagging分类器在测试数据上的泛化性能稍有胜出。下面我们比较一下决策树与bagging分类器的决策区域:
由结果图像可见,与深度为3的决策树线性分段边界相比,bagging集成分类器的决策边界显得更平滑:
本节我们只是简单通过示例了解了bagging。在实战中,分类任务会更加复杂,数据集维度会更高,使用单棵决策树很容易产生过拟合,这时bagging算法就可显示出其优势了。最后,我们需注意bagging算法是降低模型方差的一种有效方法。然而,bagging在降低模型偏差方面的作用不大,这也是我们选择未剪枝决策树等低偏差分类器作为集成算法成员分类器的原因。
[1] L.Breoman.Bagging Predictors.Machine Learing,24(2):123-140,1996.