基于Python的机器学习系列(13):Bagging

        在上一篇文章中,我们讨论了决策树的原理及其在分类任务中的应用。然而,单一的决策树模型往往容易过拟合,导致泛化能力较差。为了减小模型的方差,我们可以通过构建多个决策树来提升模型的表现。这种方法被称为Bagging(Bootstrap Aggregating),其核心思想是在训练多个模型时引入差异性,从而避免它们学到相同的内容。

Bagging 的工作原理

        Bagging 通过以下步骤来实现:

  1. 样本采样:从原始训练数据中进行有放回的采样,生成多个不同的子数据集。
  2. 训练多个模型:使用生成的子数据集训练多个决策树模型。
  3. 结果聚合:对所有模型的预测结果进行某种形式的聚合(如投票或取平均),从而得到最终的预测结果。

        例如,假设我们有一个包含 4 个样本的数据集,每个样本有 2 个特征。我们可以通过 Bagging 生成多个子数据集,并训练相应的决策树模型。最终,使用这些模型的预测结果进行聚合,得到最终的分类结果。

        在 Bagging 的变体中,如果采样是无放回的,那么这种方法被称为Pasting。Bagging 允许样本在多个模型中多次被采样,而 Pasting 则不允许在同一模型中重复采样。

1. 手动实现 Bagging

        首先,我们将从头开始实现 Bagging。为了简化代码,我们将使用 sklearn 中的 DecisionTreeClassifier 来作为我们的基础模型。

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 的代码实现。

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),进一步提升分类器的性能。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值