套袋算法(Bagging)是一种集成学习技术,与 MajorityVoteClassifier
相似,不同之处在于 bagging 不是每次使用相同的训练集来拟合单个分类器,而是对初始训练集进行 bootstrap 抽样。这也是 bagging 称为引导聚合(Bootstrap Aggregating)的原因。
基本概念
Bagging 的概念如下图:

为了更具体说明 bagging 分类器如何工作,参见下图中的示例。图中有 n = 7 个训练实例(以索引 1 - 7 表示),在每轮 bagging 中进行有放回地抽样 k 次,然后使用这 k 次的聚合样本(允许包含重复的样本)来拟合分类器。如果聚合样本中的样本数等于实例,则称为 bootstrap 抽样。

bagging 一般使用在较弱的分类器中使用(如未修剪的决策树),以降低其过拟合的问题。在对每个分类器进行拟合后,通过多数投票方法来对结果进行预测。
数据导入及预处理
为了对 bagging 方法进行说明,这里使用 Wine 数据集,并提取值为 2 和 3 的分类标签、特征为 Alcohol 和 OD280/OD315 的样本:
1 | import pandas as pd |
将标签进行编码,并将样本分为 80% 的训练集和 20% 的测试集:
1 | from sklearn.preprocessing import LabelEncoder |
bagging 的 scikit-learn 实现
使用 sklearn.ensemble.BaggingClassifier 进行 bagging。
这里使用未修剪的决策树作为基础分类器,并建立 500 个由不同 bootstrap 样本得到的决策树的集合:
1 | from sklearn.ensemble import BaggingClassifier |
接下来,计算训练集和测试集中的预测准确性,以比较 bagging 分类器与单个未裁剪决策树的表现:
1 | from sklearn.metrics import accuracy_score |
得到结果如下:
1 | Decision tree train/test accuracies 1.000/0.833 |
尽管 bagging 和决策树对于训练集的预测准确率均为 100%,但在测试集上 bagging 的准确率要高于测试集,泛化能力更优。
对bagging 和决策树的决策边界分别绘图。
1 | import numpy as np |

从上图可以看出,bagging 的决策边界相比决策树更为平滑。
在实践中,bagging 往往用于解决由于解决分类器模型的过拟合问题,降低模型的方差。需要注意的是,bagging 无法减少模型偏差(如某些模型太简单,无法很好地捕捉数据中的趋势)。因此 bagging 更适用于低偏差的模型,如未修剪的决策树。