一、Bagging 方法
Bagging(Bootstrap Aggregating)是一种用于提升模型性能的集成学习方法。它通过将多次采样得到的不同训练集分别训练多个模型,然后将这些模型的预测结果结合在一起,来降低模型的方差,从而提升整体的准确性和稳定性。Bagging 的主要步骤如下:
-
数据重采样:从原始训练集(大小为 N)中有放回地随机采样生成多个训练集,每个训练集的大小同样为 N。每个训练集可能会包含重复的样本,而原始训练集中的一些样本可能不会出现在某个特定的采样集中。这种有放回的采样过程称为 Bootstrap。
-
模型训练:对每个采样的训练集分别训练一个模型。常用的模型可以是决策树、神经网络等。
-
集成预测:对于分类问题,使用多个模型预测的结果进行投票(即多数表决),最终的预测结果为得票最多的类别。对于回归问题,取多个模型预测结果的平均值作为最终的预测结果。
公式表示
假设我们有一个训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D = \{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\} D={(x1,y1),(x2,y2),…,(xN,yN)},Bagging 的具体步骤如下:
-
生成 B B B个Bootstrap数据集 D 1 , D 2 , … , D B D_1, D_2, \dots, D_B D1,D2,…,DB,每个 D i D_i Di通过从 D D D中有放回地采样得到。
-
对每个 D i D_i Di 训练一个模型 f i f_i fi。
-
对于分类任务,Bagging的最终预测 y ^ \hat{y} y^为:
y ^ = mode { f 1 ( x ) , f 2 ( x ) , … , f B ( x ) } \ \hat{y} = \text{mode} \{ f_1(x), f_2(x), \dots, f_B(x) \} y^=mode{f1(x),f2(x),…,fB(x)}其中, mode \text{mode} mode表示多数表决。
对于回归任务,Bagging 的最终预测为:
y ^ = 1 B ∑ i = 1 B f i ( x ) \ \hat{y} = \frac{1}{B} \sum_{i=1}^{B} f_i(x) y^=B1i=1∑Bfi(x)
优点
- 降低方差:通过构建多个模型并结合它们的预测结果,Bagging 减少了单个模型的方差,提升了模型的稳定性。
- 防止过拟合:由于对数据进行重采样训练多个模型,Bagging 可以有效防止单个模型过拟合。
缺点
- 计算成本高:Bagging 需要训练多个模型,特别是当基模型复杂或数据量较大时,计算开销会显著增加。
- 模型解释性差:Bagging 是一种集成方法,最终的预测结果来自多个模型的集成,解释单个预测结果背后的机制变得更加复杂。
示例:Bagging 应用于决策树
在经典的 Bagging 方法中,常使用决策树作为基模型。这种方法也被称为 随机森林。通过对多个决策树的集成,可以显著提升单棵决策树的预测性能。
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建数据集
X, y = make_classification(n_samples=1000, 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_model = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=10, random_state=42)
bagging_model.fit(X_train, y_train)
# 预测
y_pred = bagging_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
在这个例子中,BaggingClassifier
使用了多个决策树
n
e
s
t
i
m
a
t
o
r
s
=
10
n_estimators=10
nestimators=10进行集成,最终得到了更加稳定的分类结果。
Bagging 的经典应用包括随机森林,这种方法通过 Bagging 集成多个决策树,显著提高了模型的准确率和鲁棒性。
在 Bagging 方法中,多个模型通过集成的方式预测测试集的结果。具体过程如下:
二、多个模型预测结果过程
1. 训练多个基模型
Bagging 通过有放回的采样方法,从训练集生成多个不同的数据子集,每个子集用来训练一个基模型。假设我们训练了 B B B 个基模型 f 1 , f 2 , … , f B f_1, f_2, \dots, f_B f1,f2,…,fB,每个模型通过不同的训练数据进行学习,但它们的结构通常相同(比如每个模型都是一个决策树)。
2. 测试集上的预测
当我们有一个测试样本 x x x时,Bagging 会让所有训练好的基模型分别对 x x x 进行预测。然后再通过一定的集成策略,得到最终的预测结果。
3. 集成策略
Bagging 常用的集成策略根据任务不同,主要有以下两种:
-
分类问题:
-
每个基模型 f i f_i fi 会给出一个类别预测结果,比如 y ^ i = f i ( x ) \hat{y}_i = f_i(x) y^i=fi(x)。
-
最终的集成结果采用“多数投票法”(majority voting)。即选择出现次数最多的类别作为最终预测结果:
y ^ = mode { y ^ 1 , y ^ 2 , … , y ^ B } \ \hat{y} = \text{mode}\{\hat{y}_1, \hat{y}_2, \dots, \hat{y}_B\} y^=mode{y^1,y^2,…,y^B}其中, mode \text{mode} mode 表示众数操作,即选择频率最高的类别作为最终预测结果。
-
-
回归问题:
-
每个基模型 f i f_i fi 会输出一个数值预测结果 y ^ i = f i ( x ) \hat{y}_i = f_i(x) y^i=fi(x)。
-
最终的集成结果通过平均每个模型的预测结果来得到:
y ^ = 1 B ∑ i = 1 B f i ( x ) \ \hat{y} = \frac{1}{B} \sum_{i=1}^{B} f_i(x) y^=B1i=1∑Bfi(x)这种方法可以减少单个模型预测的方差,从而提高模型的整体性能。
-
示例:多个模型预测测试集结果(分类任务)
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建数据集
X, y = make_classification(n_samples=1000, 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_model = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=10, random_state=42)
bagging_model.fit(X_train, y_train)
# 对测试集进行预测
y_pred = bagging_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Test Accuracy: {accuracy:.2f}")
代码解释:
- 训练多个模型:
BaggingClassifier
使用 10 个决策树(n_estimators=10
)作为基模型。每个基模型在不同的采样训练集上进行训练。 - 预测测试集:
bagging_model.predict(X_test)
让每个基模型对测试集进行预测,然后通过多数投票的方式得到最终的分类结果。 - 集成效果:预测结果通过 10 个模型的集成,减少了单一模型的偏差和方差,提升了准确率。
回归任务集成预测示例
对于回归问题,Bagging 会对每个基模型的预测结果取平均值:
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
# 创建数据集
X, y = make_regression(n_samples=1000, 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_model = BaggingRegressor(base_estimator=DecisionTreeRegressor(), n_estimators=10, random_state=42)
bagging_model.fit(X_train, y_train)
# 对测试集进行预测
y_pred = bagging_model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
在这个回归任务中,每个基模型对测试集的输出值取平均,从而得到更平滑和稳定的预测。