小白的集成学习之路——Bagging学习

Bagging

前提说明:本文是在我学习集成学习时的浅显总结,由于个人水平暂时有限,故基本没有推导与公式过程,可能部分内容还存在错误的理解,请谅解。

一、含义

Bagging是(bootstrap aggregation)的缩写,并不是Bag的动名词形式。Bootstraping的名称来自于成语 ‘’pull up by your own bootstraps‘’, 意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法。可以看到,Bagging的两个关键词分别是“自助”和“聚合”。通过以上分析,我把bagging的流程总结为:首先采用自助采样生成不同的基分类器,之后采用常用的方法来聚合基分类器,即:在分类任务上投票,在回归问题上取平均。此外,Bagging即可以出来2分类问题也可以处理多分类问题。Bagging算法流程与示意图如下:
在这里插入图片描述

在这里插入图片描述

特别,注意的是,自主采样赋予Bagging一个额外优势。即,给定m个训练样本,第i个样本被选中0,1,2,…次的概率近似为 λ = 1 \lambda=1 λ=1的泊松分布,所以第i个样本至少出现一次的概率为 1 − ( 1 / e ) ≈ 0.0632 1-(1/e)\approx0.0632 1(1/e)0.0632。故存在约36.8%的包外样本可以用来估算基分类器的好坏,继而对Bagging算法的泛化误差进行估算。Bias(偏差) & Variance(方差)理论忘记的同学可以参考以下的链接:偏差方差理论。可以简单的认为Bias 和 Variance 分别代表
在这里插入图片描述

二、特性

通常Bagging需要配和不稳定学习器一起使用,一般来说学习器越不稳定,效果提升越大。(对训练数据不敏感的学习器称为“稳定学习器”)
在这里插入图片描述
由于Bagging采用的是自助采样生成数据样本,数据样本和原始数据之间有63.2%的重复。如果基分类器对训练数据分布不敏感,得到的基分类器之间将很相似,因此,结合后对泛化能力提升会很有限。上图中,决策树为不稳定学习器,而决策树桩更倾向于稳定学习器。这样,我们就可以清楚的理解上图的图a、b了。同时,由于未剪枝树比剪枝树更不稳定,故如上图c所示,未剪枝树的Bagging比剪枝树的Baggging效果更好。所以,我们可以得到如下结论:当我们使用Bagging时,无需对决策树进行剪枝。

为什么Bagging在不稳定基学习器上各位有效呢?这是由于Bagging可以明显降低方差,这一点让我联想到SWA算法。具体的理论分析,请待我搞懂后再叙述吧~~~

三、结合代码分析

这里我用分类的决策树和SVM作例子展示(使用sklearn)

from sklearn import datasets
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from itertools import product
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import BaggingClassifier
import matplotlib.pyplot as plt
iris = datasets.load_iris()
X,y = iris.data[:,[0,2]],iris.target
#???data[:,[0,2]]
#Training
clf1 = DecisionTreeClassifier(max_depth=4)

clf2 = SVC(gamma='scale',kernel='rbf',probability=True)
#gamma:核函数系数
# kernel:算法中采用的核函数类型,‘rbf’:径像核函数/高斯核
# probability:是否启用概率估计

Bclf1 = BaggingClassifier(base_estimator=DecisionTreeClassifier(max_depth=4))
Bclf2 = BaggingClassifier(base_estimator=SVC(gamma='scale',kernel='rbf',probability=True))

clf1 = clf1.fit(X,y)
Bclf1 = Bclf1.fit(X,y)
clf3 = clf2.fit(X,y)
Bclf2 = Bclf2.fit(X,y)
 
# Plotting decision regions
x_min,x_max = X[:,0].min() - 1,X[:,0].max() + 1
y_min,y_max = X[:,1].min() - 1,X[:,1].max() + 1
xx,yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
# 生成网格点坐标矩阵:
# 坐标矩阵——横坐标矩阵XX中的每个元素,与纵坐标矩阵YY中对应位置元素,共同构成一个点的完整坐标。
# 如B点坐标(X12,Y12)=(1,1)(X12​,Y12​)=(1,1)
f, axarr = plt.subplots(2, 2, sharex='col', sharey='row', figsize=(10, 8))
# sharey‘row’ 时,每一行的子图会共享 x 或者 y 轴
for idx,clf,tt in zip(product([0,1],[0,1]),
                      [clf1,Bclf1,clf2,Bclf2],
                      ['Decison Tree(depth=4)','Bagging with Decison Tree(depth=4)','Kernel SVM','Bagging with Kernel SVM']):
    Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
    '''
    numpy中的ravel()、flatten()、squeeze()都有将多维数组转换为一维数组的功能,区别:
    ravel():如果没有必要,不会产生源数据的副本
    flatten():返回源数据的副本
    squeeze():只能对维数为1的维度降维
    另外,reshape(-1)也可以“拉平”多维数组
    '''
    '''
    np.r_ 是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于 pandas 中的 concat()。
    np.c_ 是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
    '''
    Z = Z.reshape(xx.shape)
    axarr[idx[0], idx[1]].contourf(xx, yy, Z, alpha=0.4)
    # contourf绘制等高线的,contour和contourf都是画三维等高线图的,不同点在于contour() 是绘制轮廓线,contourf()会填充轮廓
    axarr[idx[0], idx[1]].scatter(X[:, 0], X[:, 1], c=y,
                                  s=20, edgecolor='k')
    axarr[idx[0], idx[1]].set_title(tt)
plt.show()

在这里插入图片描述
从上图可以看到,SVM使用Bagging后的效果要稍微好于不使用,奇怪的是决策树使用后似乎变差了。

将SVM换成KNN(稳定学习器)后:
在这里插入图片描述
可以发现,在KNN中使用几乎没有变化。

之后我把学习器的数量由默认的10换成20后,bagging决策树的效果也变好了。
在这里插入图片描述

[1]. https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning
[2].集成学习(基础与算法) 周志华

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值