首页 > 编程语言 >Python Bagging算法详解与应用案例

Python Bagging算法详解与应用案例

时间:2024-10-21 12:21:03浏览次数:11  
标签:Bagging Python train self 详解 test model 模型

这里写目录标题

Python Bagging算法详解与应用案例

引言

Bagging(Bootstrap Aggregating)是一种集成学习方法,通过构建多个模型并结合它们的输出,提高模型的稳定性和准确性。它在分类和回归问题中都有广泛应用,特别是在提高基础模型(如决策树)的性能方面。本文将深入探讨Bagging的基本原理,提供Python中的面向对象实现,并通过多个案例展示其实际应用。


一、Bagging的基本原理

1.1 Bagging的概念

Bagging的基本思想是通过对训练数据进行重采样,生成多个不同的训练集,然后在这些训练集上训练多个模型,最后将这些模型的输出进行汇总。Bagging通常用于减少模型的方差,提高模型的鲁棒性。

1.2 Bagging的步骤

  1. 重采样:从原始训练集中有放回地抽取多个子集(每个子集大小与原始集相同)。
  2. 模型训练:在每个子集上训练一个独立的模型。
  3. 结果汇总:对所有模型的预测结果进行平均(回归)或投票(分类)。

1.3 Bagging的优势与挑战

优势

  • 减少过拟合,提升模型泛化能力。
  • 提高模型的准确性和稳定性。

挑战

  • 计算成本较高,尤其是在基础模型较复杂时。
  • 对于弱学习器的提升效果有限。

二、Python中Bagging的面向对象实现

在Python中,我们将使用面向对象的方式实现Bagging算法,主要包含以下类和方法:

  1. Bagging:实现Bagging的基本逻辑。
  2. DecisionTree:作为基础模型使用的决策树。
  3. Trainer:用于训练和评估模型。

2.1 DecisionTree 类的实现

我们首先实现一个简单的决策树模型,作为Bagging的基础学习器。

import numpy as np

class DecisionTree:
    def __init__(self, max_depth=None):
        self.max_depth = max_depth
        self.tree = None

    def fit(self, X, y):
        self.tree = self._build_tree(X, y)

    def _build_tree(self, X, y, depth=0):
        # 这里应包含决策树的构建逻辑
        # 返回一个树节点
        pass

    def predict(self, X):
        return np.array([self._predict(row, self.tree) for row in X])

    def _predict(self, row, node):
        # 递归地根据节点做预测
        pass

2.2 Bagging 类的实现

Bagging类用于实现Bagging的逻辑。

class Bagging:
    def __init__(self, base_estimator, n_estimators=10):
        """
        Bagging类
        :param base_estimator: 基础学习器
        :param n_estimators: 基础学习器数量
        """
        self.base_estimator = base_estimator
        self.n_estimators = n_estimators
        self.models = []

    def fit(self, X, y):
        n_samples = X.shape[0]
        for _ in range(self.n_estimators):
            # 有放回地重采样
            indices = np.random.choice(n_samples, n_samples, replace=True)
            X_sample = X[indices]
            y_sample = y[indices]

            # 训练基础学习器
            model = self.base_estimator
            model.fit(X_sample, y_sample)
            self.models.append(model)

    def predict(self, X):
        # 汇总所有模型的预测结果
        predictions = np.array([model.predict(X) for model in self.models])
        return self._aggregate(predictions)

    def _aggregate(self, predictions):
        # 分类任务投票,回归任务平均
        return np.round(np.mean(predictions, axis=0))

2.3 Trainer 类的实现

Trainer类用于训练和评估Bagging模型。

class Trainer:
    def __init__(self, model):
        self.model = model

    def train(self, X, y):
        self.model.fit(X, y)

    def evaluate(self, X, y):
        predictions = self.model.predict(X)
        accuracy = np.mean(predictions == y)
        return accuracy

三、案例分析

3.1 使用Bagging进行分类

在这个案例中,我们将使用Bagging对鸢尾花数据集进行分类。

3.1.1 数据准备
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
data = load_iris()
X = data.data
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3.1.2 模型训练
# 实例化基础学习器
base_estimator = DecisionTree(max_depth=3)
bagging_model = Bagging(base_estimator, n_estimators=10)

trainer = Trainer(bagging_model)
trainer.train(X_train, y_train)
3.1.3 结果评估
accuracy = trainer.evaluate(X_test, y_test)
print(f'Bagging Model Accuracy: {accuracy:.2f}')

3.2 使用Bagging进行回归

在这个案例中,我们将使用Bagging对波士顿房价数据集进行回归。

3.2.1 数据准备
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

# 加载数据
boston = load_boston()
X = boston.data
y = boston.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
3.2.2 模型训练
# 实例化基础学习器
base_estimator = DecisionTree(max_depth=5)
bagging_model = Bagging(base_estimator, n_estimators=20)

trainer = Trainer(bagging_model)
trainer.train(X_train, y_train)
3.2.3 结果评估
# 评估模型
predictions = bagging_model.predict(X_test)
mse = np.mean((predictions - y_test) ** 2)
print(f'Bagging Model Mean Squared Error: {mse:.2f}')

四、Bagging的优缺点

4.1 优点

  1. 减少方差:Bagging有效地减少了模型的方差,提高了预测的稳定性。
  2. 增强鲁棒性:通过组合多个模型,Bagging对异常值和噪声的影响较小。
  3. 适应性强:可以与多种基础学习器结合,适用性广。

4.2 缺点

  1. 计算复杂性:训练多个模型需要较高的计算成本,尤其是基础学习器较复杂时。
  2. 模型可解释性:Bagging模型的可解释性较差,不易分析各个模型的贡献。

五、总结

本文详细介绍了Bagging算法的基本原理,提供了Python中的面向对象实现,并通过分类和回归的案例展示了Bagging的实际应用。Bagging作为一种有效的集成学习方法,在许多机器学习任务中都有着重要的应用价值。希望本文能够帮助读者理解Bagging的基本概念与实现方法,为进一步的研究和应用提供基础。

标签:Bagging,Python,train,self,详解,test,model,模型
From: https://blog.csdn.net/qq_42568323/article/details/143109005

相关文章

  • K8s-Service详解
    Service介绍在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的......
  • 基于Lambda架构的大数据处理详解
    1.软件项目简介及工作职责在我参与的大数据开发项目中,主要是构建一个实时与离线数据处理并行的系统,以满足业务对高效数据处理和及时响应的要求。该系统旨在收集并处理来自多个数据源的实时和批量数据,主要处理流程分为实时流处理和批量离线处理。在项目中,我的主要工作职责......
  • Python中的深拷贝与浅拷贝
    目录1.可变对象和不可变对象2.用=赋值的问题3.copy模块登场4.重新认识列表对象5.浅拷贝,深拷贝浅拷贝(copy.copy())一维列表的浅拷贝深拷贝(copy.deepcopy())浅拷贝,深拷贝,直接赋值的区别1.可变对象和不可变对象在Python中,数据类型可以分为两大类:可变对象和不可变对象。常......
  • Modbus协议概述及实例详解(一)
        Modbus是一种串行通信协议,最初是由Modicon公司(现为施耐德电气的一部分)在1979年开发,用于实现PLC之间的通信。由于其开放性和可靠性,Modbus已成为工业领域事实上的标准通信协议之一。当然啦,在嵌入式行业也同样流行,比如常见的电源行业,开关电源、模拟电源和数字电源等。......
  • 使用Python解决化学问题的实用指南
    使用Python解决化学问题的实用指南Python作为一种高级编程语言,因其简洁的语法、强大的库支持和活跃的社区,在科学研究领域得到了广泛应用,特别是在化学领域。Python提供了丰富的科学计算和数据处理库,如NumPy、SciPy、Pandas等,以及专为化学设计的库,如RDKit、OpenBabel等,使得......
  • 支持国密算法的数字证书-国密SSL证书详解
    在互联网中,数字证书作为标志通讯各方身份信息的数字认证而存在,常见的数字证书大都采用国际算法,比如RSA算法、ECC算法、SHA2算法等。随着我国加强网络安全技术自主可控的大趋势,也出现了支持国密算法的数字证书-国密SSL证书。那么什么是国密SSL证书?国密SSL证书支持哪种国密算法呢......
  • Maven入门到进阶:构建、依赖与插件管理详解
    文章目录一、Maven介绍1、什么是Maven2、Maven的核心功能二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成1.4、Packaging2、POM、父POM和超级POM2.1、POM(ProjectObjectModel)2.1、父POM(ParentPOM)2.3、超级POM(SuperPOM......
  • MySQL 中 DATETIME 和 TIMESTAMP 时间类型详解
    MySQL的日期类型简介在MySQL中有两种存储时间的数据类型 DATETIME 和 TIMESTAMP,它们在数据库实际应用中,各有各的优势和劣势。一.DATETIME和TIMESTAMP的相同点两个数据类型存储时间的格式一致。均为YYYY-MM-DDHH:MM:SS两个数据类型都包含「日期」和「时间」部分。......
  • [oeasy]python037_ print函数参数_sep分隔符_separator
    print函数参数_sep分隔符_separator回忆上次内容上次了解了类型type本意来自于印记   添加图片注释,不超过140字(可选) 要特别注意type类型   添加图片注释,不超过140字(可选) 给函数传递参......
  • uv 基于rust 编写的python 包管理以及项目管理工具
    uv基于rust编写的python包管理以及项目管理工具包含的特性简单工具可以替换pip,pip-tools,pipx,poetry,pyenv等比pip快10-100倍安装以及管理python版本运行以及安装python应用运行脚本支持类似cargo模式的workspace磁盘空间高效说明对于希望提示快速python包下......