使用Scikit-learn训练BaggingRegressor

举报
yd_37369233 发表于 2026/08/03 17:05:15 2026/08/03
【摘要】 引言在机器学习中,Bagging(Bootstrap Aggregating) 是一种经典的集成学习方法,通过组合多个基学习器的预测结果来降低模型方差、提升泛化能力。本文将从原理出发,详细介绍如何使用 Scikit-learn 中的 BaggingRegressor 训练回归模型,并附上完整的代码示例。 一、什么是BaggingRegressor?BaggingRegressor 是 Sc...

引言

在机器学习中,Bagging(Bootstrap Aggregating) 是一种经典的集成学习方法,通过组合多个基学习器的预测结果来降低模型方差、提升泛化能力。本文将从原理出发,详细介绍如何使用 Scikit-learn 中的 BaggingRegressor 训练回归模型,并附上完整的代码示例。

一、什么是BaggingRegressor?

BaggingRegressor 是 Scikit-learn 的 sklearn.ensemble 模块提供的一个集成元估计器(ensemble meta-estimator) 。它在原始数据集的随机子集上分别训练多个基回归器,然后将它们的个体预测结果进行平均,形成最终的预测。

这种元估计器主要用于降低黑盒估计器(如决策树)的方差——通过在训练过程中引入随机性,然后构建集成模型来提升稳定性。

简单来说:BaggingRegressor = 多个基回归器 + Bootstrap采样 + 预测结果平均

BaggingRegressor 适用于各类非线性回归任务,如房价预测、能源消耗预测等。

二、Bagging的核心思想与算法变体

Bagging 的核心是 Bootstrap 自助采样法——从原始数据集中有放回地抽取多个子样本集,在每个子样本集上训练一个基学习器。由于是有放回采样,每个子样本集中约有 63.2% 的原始样本会被抽到,剩下的约 36.8% 成为 Out-of-Bag(OOB)样本,可用于后续的模型评估。

BaggingRegressor 实际上涵盖了文献中的多种算法变体:

采样方式 算法名称
样本随机子集(无放回) Pasting
样本随机子集(有放回) Bagging
特征随机子集 Random Subspaces
样本+特征随机子集 Random Patches

通过调整 bootstrapbootstrap_features 参数,你可以在这几种策略之间灵活切换。

三、BaggingRegressor 与随机森林的区别

很多初学者容易混淆 BaggingRegressor 和 RandomForestRegressor。它们的核心区别在于:

  • RandomForestRegressor 强制使用决策树作为基估计器,并且在每棵树的节点分裂时随机选择特征子集
  • BaggingRegressor 则更加灵活——你可以选择任意回归器作为基估计器(如 KNN、SVR 等),适用于需要使用自定义模型的场景。

从某种意义上说,随机森林是 Bagging 的一个特例——它使用决策树作为基模型,并在特征层面也引入了随机性。

四、核心参数详解

BaggingRegressor 的主要参数如下:

参数 默认值 说明
estimator None(即 DecisionTreeRegressor) 基估计器。从 1.2 版本起,base_estimator 已重命名为 estimator
n_estimators 10 基估计器的数量。值越大,模型越稳定,但计算量也越大
max_samples 1.0 每个基估计器使用的样本比例/数量。可设为 0.8 来提升泛化能力
max_features 1.0 每个基估计器使用的特征比例/数量
bootstrap True 是否对样本进行有放回采样
bootstrap_features False 是否对特征进行有放回采样
oob_score False 是否使用 OOB 样本估计泛化误差(仅当 bootstrap=True 时可用)
n_jobs None 并行计算的 CPU 核数,设为 -1 则使用所有核心
random_state None 随机种子,保证结果可复现

五、实战:训练一个Bagging回归模型

下面通过一个完整的示例,演示如何使用 BaggingRegressor

5.1 导入依赖与生成数据

from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 生成回归数据集(100个样本,1个特征,加入噪声)
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

5.2 创建并训练模型

# 创建 Bagging 回归模型(基学习器使用决策树)
model = BaggingRegressor(
    estimator=DecisionTreeRegressor(),  # 基估计器
    n_estimators=100,                   # 100棵决策树
    random_state=42                     # 保证可复现
)

# 训练模型
model.fit(X_train, y_train)

5.3 预测与评估

# 预测
y_pred = model.predict(X_test)

# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse:.4f}")
print(f"R² 分数: {r2:.4f}")

5.4 完整代码

from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 1. 生成数据
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 2. 训练模型
model = BaggingRegressor(
    estimator=DecisionTreeRegressor(),
    n_estimators=100,
    random_state=42
)
model.fit(X_train, y_train)

# 3. 预测与评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse:.4f}")
print(f"R² 分数: {r2:.4f}")

六、进阶技巧

6.1 获取特征重要性

虽然 BaggingRegressor 本身不直接提供特征重要性,但你可以通过聚合所有基估计器的特征重要性来获得:

import numpy as np

# 假设基估计器是决策树
feature_importances = np.mean([
    tree.feature_importances_ for tree in model.estimators_
], axis=0)

print("特征重要性:", feature_importances)

6.2 使用OOB评分

开启 oob_score=True 后,模型会自动使用 Out-of-Bag 样本进行验证:

model = BaggingRegressor(
    estimator=DecisionTreeRegressor(),
    n_estimators=100,
    oob_score=True,
    random_state=42
)
model.fit(X, y)
print(f"OOB 评分: {model.oob_score_}")  # 注意:回归任务中 oob_score_ 为 R² 分数

6.3 自定义基估计器

BaggingRegressor 的一大优势是可以使用任意回归器作为基估计器:

from sklearn.neighbors import KNeighborsRegressor

# 使用 KNN 作为基估计器
model = BaggingRegressor(
    estimator=KNeighborsRegressor(n_neighbors=5),
    n_estimators=50,
    random_state=42
)
model.fit(X_train, y_train)
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。