在上一篇文章中,我们讨论了决策树的原理及其在分类任务中的应用。然而,单一的决策树模型往往容易过拟合,导致泛化能力较差。为了减小模型的方差,我们可以通过构建多个决策树来提升模型的表现。这种方法被称为Bagging(Bootstrap Aggregating),其核心思想是在训练多个模型时引入差异性,从而避免它们学到相同的内容。
Bagging 的工作原理
Bagging 通过以下步骤来实现:
- 样本采样:从原始训练数据中进行有放回的采样,生成多个不同的子数据集。
- 训练多个模型:使用生成的子数据集训练多个决策树模型。
- 结果聚合:对所有模型的预测结果进行某种形式的聚合(如投票或取平均),从而得到最终的预测结果。
例如,假设我们有一个包含 4 个样本的数据集,每个样本有 2 个特征。我们可以通过 Bagging 生成多个子数据集,并训练相应的决策树模型。最终,使用这些模型的预测结果进行聚合,得到最终的分类结果。
在 Bagging 的变体中,如果采样是无放回的,那么这种方法被称为Pasting。Bagging 允许样本在多个模型中多次被采样,而 Pasting 则不允许在同一模型中重复采样。
1. 手动实现 Bagging
首先,我们将从头开始实现 Bagging。为了简化代码,我们将使用 sklearn
中的 DecisionTreeClassifier
来作为我们的基础模型。
python">from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import random
from scipy import stats
from sklearn.metrics import classification_report# 加载数据集并进行训练集和测试集划分
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True, random_state=42)# 定义模型参数和 Bagging 参数
B = 5 # 基模型数量
m, n = X_train.shape
boostrap_ratio = 1
tree_params = {'max_depth': 2, 'criterion': 'gini', 'min_samples_split': 5}
models = [DecisionTreeClassifier(**tree_params) for _ in range(B)]# 初始化子样本集
xsamples = np.zeros((B, int(boostrap_ratio * m), n))
ysamples = np.zeros((B, int(boostrap_ratio * m)))# 生成子样本集并训练每个基模型
for i in range(B):for j in range(int(boostrap_ratio * m)):idx = random.randrange(m) # 随机采样xsamples[i, j, :] = X_train[idx]ysamples[i, j] = y_train[idx]# 训练模型models[i].fit(xsamples[i], ysamples[i])# 对测试集进行预测
predictions = np.zeros((B, X_test.shape[0]))
for i, model in enumerate(models):yhat = model.predict(X_test)predictions[i, :] = yhat# 聚合预测结果
yhat = stats.mode(predictions)[0][0] # 获取众数作为最终预测结果
print(classification_report(y_test, yhat))
2. 使用 Sklearn 实现 Bagging
sklearn
提供了便捷的 BaggingClassifier
接口来实现 Bagging,下面是使用 sklearn
的代码实现。
python">from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier# 使用 BaggingClassifier 实现 Bagging
tree = DecisionTreeClassifier()
bag = BaggingClassifier(tree, n_estimators=5, max_samples=0.99)bag.fit(X_train, y_train)
yhat = bag.predict(X_test)
print(classification_report(y_test, yhat))
结语
通过本篇文章,我们了解了 Bagging 的基本原理以及如何在 Python 中实现这一算法。Bagging 通过构建多个模型并对它们的结果进行聚合,显著提升了模型的泛化能力。在下一篇文章中,我们将探讨 Bagging 的进阶形式——随机森林(Random Forests),进一步提升分类器的性能。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!