Bagging分类器

190 阅读3分钟

本文正在参加 人工智能创作者扶持计划

1、Bagging:有放回的重采样

袋装(Bagging)是一种采用随机又放回抽样选择训练数据构造分类器进行组合的方法。如同找医生看病,选择多个医生,根据多个医生的诊断结果得出最终结果(多数表决),每个医生具有相同的投票权重。

image-20220605161503146

2、训练阶段

在训练过程中,通过又放回抽样,把训练集变成多份,然后对每份训练集学习一个模型。

image-20220605163518206

3、测试阶段

测试阶段,用上一步得到的每个模型来进行一个预测,最后用加权求和方法对模型进行组合。

image-20220605163614558

4、集成学习优势示例

假设有三个分类器,每个分类器的错误率为40%,那么这三个分类器的预测结果有如下8种可能性

image-20220605163645662

上图中prob为每种组合出现的可能性,在这8种组合里面,根据少数服从多数的原则,所以,预测错误的结果为第4、6、7、8行,相当于这四种组合都会预测错误。将这四种组合出现的可能性求和,0.096+0.096+0.096+0.064=35%,很显然,比我们原始的单个分类器的错误率40%要低,因此,我们最后可以做一个做一个泛化。

集成学习分类器错误率:

p(error)=i=m+12m(mi)ri(1r)mip(error)=\sum_{i=\frac{m+1}{2}}^{m } \binom{m}{i} r^{i}(1-r)^{m-i}

image-20220605164403754

可以看到,当我们集成学习分类器越多,错误率越低。

5、集成学习种但分类器的条件

通过集成学习提高分类器的整体泛化能力是有条件的:

  • 分类器之间应该具有差异性
  • 分类器的精度,每个个体分类器的分类精度必须大于0.5

6、Bagging示例

假设我们的数据如下:,有红色和蓝色两个类别。

image-20220605164738998

我们先抽样一部分数据,针对这一部分数据来学习一个简单的弱分类器,也就是我们的一个线性分类器。

image-20220605164846193

随后,我们再抽样一部分数据,又能学习出一个简单的弱分类器,

image-20220605164927813

以此类推,我们可以学习出多个线性分类器,

image-20220605165017129

把这多个线性分类器进行一个合并,我们会发现集成学习的一个优势,如果数据不是线性可分的,可能需要一个非常的模型(比如支持向量机中的核变换),才能对这种线性不可分的数据进行一个分类;继承学习也可以通过多个但分类器来找到一个分类界限,这样的界限并不一定是一个线性分类器,这也是Bagging算法的优点。

image-20220605170210435

7、Bagging算法的优点

  • 降低噪音数据的影响
  • 不易过拟合。

8、实战:Bagging分类器实现iris数据集分类

scikit-learn中,Bagging方法由BaggingClassifier统一提供,以用户输入的基模型和划分子集的方法作为参数。其中max_samplesmax_features控制子集的大小;而bootstrapbootstrap_features控制数据样本和属性是否替换;Oob_score=True可使估计时采用已有的数据划分样本。

任务描述:使用Python语言编程,使用 iris 数据集训练一个 BaggingClassifier 分类器。实例化KNeighborsscifier基估计器的bagging集成,每个估计器都建立在50%样本和50%特征的随机子集上。

BaggingClassifier 使用很简单,三步:

  • 创建 BaggingClassifier 对象
  • 调用 fit 函数
  • 调用 predict 函数进行预测
 # Bagging分类测试
 # 导入相关库
 from sklearn.ensemble import BaggingClassifier
 from sklearn.neighbors import KNeighborsClassifier
 from sklearn.model_selection import train_test_split
 from sklearn.metrics import accuracy_score
 from sklearn.datasets import load_iris
 import numpy as np
 ​
 # 下载数据集
 iris = load_iris()
 X = iris["data"]
 y = iris["target"]
 ​
 print(X)
 print(y)
 np.random.seed(0)
 # 划分数据集
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
 ​
 # 创建 BaggingClassifier 对象
 ########## Begin ##########
 clf = BaggingClassifier(KNeighborsClassifier(),max_samples=0.5, max_features=0.5)
 ##########  End  ##########
 ​
 # 调用 fit 函数执行训练过程
 clf.fit(X_train,y_train)
 ​
 # 打印结果
 print('训练集准确率:', accuracy_score(y_train, clf.predict(X_train)))
 print('测试集准确率:', accuracy_score(y_test, clf.predict(X_test)))