使用Scikit-learn训练BaggingRegressor
引言
在机器学习中,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 |
通过调整 bootstrap 和 bootstrap_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)
- 点赞
- 收藏
- 关注作者
评论(0)