Datawhale-集成学习-学习笔记Day2-bagging
bagging
与投票法类似,bagging也将所有及模型的结果统一在一起,来当作模型最终的结果。但是bagging在投票法的基础上又更前进了一步,采用了一定的策略来影响基模型的训练,从而进一步降低模型的方差。
在投票法中我们说过,我们希望各个模型之间会有较大的差异性,来获取更好的结果。但是在实际操作中,我们使用的模型往往是同质的。所以,在bagging我们使用不同的采样方法来增加模型的差异性。
主要的步骤大概如下:
- 我们在样本中放回的抽取k个样本组成采样集
- 重复N次步骤1,获取N个采样集
- 基于每个采样集训练出一个基学习器,在将所有模型的结果进行统一
Bagging同样是一种降低方差的技术,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效果更加明显。在实际的使用中,加入列采样的Bagging技术对高维小样本往往有神奇的效果。
为什么bagging可以降低方差
首先,我们拥有n个基于随机采样的采样集,并且分别对这些采样集训练出了i个不同的基模型,记为 G i ( x ) G_i(x) Gi(x)。
所以,我们将这些基模型bagging可以记为:
F
(
x
)
=
(
∑
i
N
G
i
(
x
)
)
/
n
F(x) = (\sum_i^NG_i(x))/n
F(x)=(i∑NGi(x))/n
我们可以记子模型
G
i
(
x
)
G_i(x)
Gi(x)的方差为
σ
2
\sigma^2
σ2。这样根据方差公式:
D
(
F
(
x
)
)
=
σ
2
/
n
D(F(x)) = \sigma^2/n
D(F(x))=σ2/n
因为n>=1,所以模型的方差是减小了的。但是对于结果的期望是没有改变的。
案例实现
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
X, y = make_classification(
n_samples=1000,
n_features=20,
n_informative=15,
n_redundant=5,
n_classes=2,
random_state=5
)
# print(X.shape, y.shape)
model = BaggingClassifier()
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
print('Accuracy: %.3f (%.3f)' % (np.mean(n_scores), np.std(n_scores)))