Bagging(Bootstrap Aggregating)详解

Bagging 是一种集成学习技术,其全称为 Bootstrap Aggregating,是一种通过对训练数据进行自举采样(Bootstrap Sampling)来生成多个不同的数据集,并对每个数据集训练一个基模型,最终通过平均(回归)或投票(分类)来融合模型结果的技术。

Bagging 主要用于减少模型的方差,提高模型的稳定性和泛化能力。它特别适用于高方差模型(如决策树)。


1. Bagging 的核心思想

Bagging 的核心思想可以分为以下几个关键点:

  1. 自举采样(Bootstrap Sampling)

    • 从原始训练数据集中有放回地随机采样,生成多个子数据集,每个子数据集大小与原数据集相同。
    • 由于是有放回采样,每个子数据集可能包含重复样本,也可能漏掉一些样本(约 63.2% 的样本会被采样到)。
  2. 基模型的独立训练

    • 在每个子数据集上分别训练一个基模型,基模型通常是高方差的模型(如决策树)。
    • 基模型之间的独立性是 Bagging 提升效果的基础。
  3. 结果融合

    • 对回归任务,基模型的预测值取平均值。
    • 对分类任务,基模型的预测结果通过投票决定最终分类。
  4. 并行化训练

    • 由于每个基模型是独立训练的,Bagging 可以充分利用并行计算资源,提升训练效率。

2. Bagging 的优势

  1. 减少方差

    • Bagging 减少了高方差模型的波动性,提升了模型的稳定性。
  2. 防止过拟合

    • 通过随机采样和多模型融合,Bagging 能有效降低模型的过拟合风险。
  3. 适合非稳定模型

    • Bagging 特别适用于非稳定的高方差模型(如决策树),对低方差模型(如线性回归)提升效果有限。
  4. 天然支持并行化

    • 每个基模型独立训练,因此 Bagging 非常适合分布式和并行计算。

3. Bagging 的具体算法步骤

假设我们有一个训练数据集 ( D ) 和一个基学习器 ( f ),Bagging 的步骤如下:

  1. 从训练集 ( D ) 中,通过有放回采样生成 ( M ) 个子数据集 ( D_1, D_2, \dots, D_M ),每个子数据集的大小与原训练集相同。
  2. 在每个子数据集 ( D_i ) 上训练基学习器 ( f_i ),得到 ( M ) 个基模型 ( f_1, f_2, \dots, f_M )。
  3. 对于新的输入样本 ( x ):
    • 回归任务:输出所有基模型预测值的平均值:
      [
      \hat{y} = \frac{1}{M} \sum_{i=1}^M f_i(x)
      ]
    • 分类任务:输出所有基模型预测值的投票结果:
      [
      \hat{y} = \text{mode}(f_1(x), f_2(x), \dots, f_M(x))
      ]

4. Bagging 的常见实现

4.1 BaggingClassifier

BaggingClassifier 是 Scikit-learn 提供的 Bagging 实现,用于分类任务。

主要参数
  • base_estimator:基学习器(默认是 DecisionTreeClassifier)。
  • n_estimators:基模型数量(默认是 10)。
  • max_samples:每个子数据集中样本数量占原数据集的比例。
  • max_features:每个子数据集中特征数量占原数据集的比例。
  • bootstrap:是否对样本进行有放回采样。
  • bootstrap_features:是否对特征进行有放回采样。
代码示例
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 数据集
X, y = make_classification(n_samples=500, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Bagging 分类器
bagging = BaggingClassifier(
    base_estimator=DecisionTreeClassifier(),  # 基模型为决策树
    n_estimators=50,                          # 50 个基模型
    max_samples=0.8,                          # 每次采样 80% 的数据
    bootstrap=True,                           # 启用有放回采样
    random_state=42
)
bagging.fit(X_train, y_train)

# 模型评估
print("Train Accuracy:", bagging.score(X_train, y_train))
print("Test Accuracy:", bagging.score(X_test, y_test))

4.2 BaggingRegressor

BaggingRegressor 用于回归任务,其参数和用法与 BaggingClassifier 类似。

代码示例
from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# 数据集
X, y = make_regression(n_samples=500, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Bagging 回归器
bagging = BaggingRegressor(
    base_estimator=DecisionTreeRegressor(),
    n_estimators=50,
    max_samples=0.8,
    bootstrap=True,
    random_state=42
)
bagging.fit(X_train, y_train)

# 模型评估
print("Train Score:", bagging.score(X_train, y_train))
print("Test Score:", bagging.score(X_test, y_test))

5. Bagging 的改进算法

5.1 随机森林

  • 随机森林 是 Bagging 的一种扩展,使用决策树作为基学习器,同时引入了随机特征选择。
  • 特点
    • 在每棵树的分裂节点时,随机选择部分特征用于寻找最优分裂点。
    • 进一步增加模型的随机性,降低基模型之间的相关性。
from sklearn.ensemble import RandomForestClassifier

# 随机森林分类器
rf = RandomForestClassifier(n_estimators=50, max_depth=5, random_state=42)
rf.fit(X_train, y_train)
print("Random Forest Accuracy:", rf.score(X_test, y_test))

6. Bagging 的优劣分析

6.1 优点

  1. 减少方差
    • 有效降低高方差模型的波动性。
  2. 提高稳定性
    • 在噪声数据上表现更鲁棒。
  3. 防止过拟合
    • 适合复杂模型的集成,不易陷入过拟合。
  4. 并行化
    • 支持多核并行加速。

6.2 缺点

  1. 对偏差无改进
    • 如果基模型有高偏差(如欠拟合),Bagging 无法显著提升性能。
  2. 计算成本较高
    • 多个模型的独立训练增加了时间和资源开销。
  3. 模型可解释性差
    • 由于是多个模型的集成,难以解释其决策过程。

7. Bagging 的应用场景

  1. 高方差模型
    • 如决策树、神经网络,Bagging 能显著提升性能。
  2. 数据集含噪声
    • Bagging 能有效缓解噪声对模型的影响。
  3. 分类任务和回归任务
    • 通用场景均适用,特别是在数据量较大时。

8. Bagging 和 Boosting 的对比

特性 Bagging Boosting
目标 降低方差 降低偏差
训练方式 并行训练 串行训练
采样方式 每次从训练集中随机采样 通过调整样本权重聚焦错误样本
适合场景 高方差模型,防止过拟合 低偏差模型,提升预测能力
代表算法 BaggingClassifier, Random Forest AdaBoost, Gradient Boosting

总结

Bagging 是一种通过并行训练多个基模型来提高预测性能的集成学习方法。它在高方差模型上表现优异,并且通过引入随机性和模型融合有效提升了模型的泛化能力。Bagging 的代表算法有随机森林,它广泛应用于分类和回归任务中。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐