Bagging meta-estimator

基本描述

在集成算法中,bagging 方法会在原始训练集的随机子集上构建一类黑盒估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。 该方法通过在构建模型的过程中引入随机性,来减少基估计器的方差(例如,决策树)。 在多数情况下,bagging 方法提供了一种非常简单的方式来对单一模型进行改进,而无需修改背后的算法。 因为 bagging 方法可以减小过拟合,所以通常在强分类器和复杂模型上使用时表现的很好(例如,完全决策树,fully developed decision trees),相比之下 boosting 方法则在弱模型上表现更好(例如,浅层决策树,shallow decision trees)。

bagging 方法有很多种,其主要区别在于随机抽取训练子集的方法不同:

  • 如果抽取的数据集的随机子集是样例的随机子集,我们叫做 Pasting 。
  • 如果样例抽取是有放回的,我们称为 Bagging 。
  • 如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间 (Random Subspaces)。
  • 最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁 (Random Patches) 。

在 scikit-learn 中,bagging 方法使用统一的 BaggingClassifier 元估计器(或者 BaggingRegressor ),输入的参数和随机子集抽取策略由用户指定。max_samples 和 max_features 控制着子集的大小(对于样例和特征), bootstrap 和 bootstrap_features 控制着样例和特征的抽取是有放回还是无放回的。 当使用样本子集时,通过设置 oob_score=True ,可以使用袋外(out-of-bag)样本来评估泛化精度。

采样概率

在Bagging中,一个样本可能被多次采样,也可能一直不被采样,假设一个样本一直不出现在采样集的概率为(1-1/N) ** N,那么对其求极限可知,原始样本数据集中约有63.2%的样本出现在了,Bagging使用的数据集中,同时在采样中,我们还可以使用袋外样本(out of Bagging)来对我们模型的泛化精度进行评估.

最终的预测结果

  • 对于分类任务使用简单投票法,即每个分类器一票进行投票(也可以进行概率平均)
  • 对于回归任务,则采用简单平均获取最终结果,即取所有分类器的平均值

虽然在Bagging中引入的随机分割增加了偏差,但是因为多个模型的集成平均,同时也使得我们在总体上获取了更好的模型,在本篇文章中,我们称之为Bagging的特性一,在后面我们将会验证这一特性。

简单的实用

基于KNN的Bagging算法

关于参数和方法要注意的是:

  • 首先控制特征子采样与样本子采样是否采用,采用的话是否要注意控制比例(一般而言,不要采取较小的数值,太小的特征子采样和样本子采样都会造成子学习器的性能太差.一般而言特征选择越少,方差越大,这点可以与最后的实验方差偏差分解对比分析).
  • 其次控制Bagging中的随机数参数random_state固定,不然不同实验的结果将不一致,同时要注意的很多时候random_state对于测试误差的影响很大,因此加入你想要在某一个数据集上使用Bagging,那么建议多尝试几个不同的Random_state
  • oob_score = True 对性能有一定的提升(使用袋外样本进行泛化能力的评估,但是很多时候效果并不明显,或者看不出什么效果)
  • 其他参数一般默认即可
from sklearn.ensemble import BaggingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# load data
from sklearn import datasets,model_selection
def load_data():iris=datasets.load_iris() # scikit-learn 自带的 iris 数据集X_train=iris.datay_train=iris.targetreturn model_selection.train_test_split(X_train, y_train,test_size=0.25,random_state=0,stratify=y_train)bagging = BaggingClassifier(KNeighborsClassifier(),max_samples=0.1,max_features=0.5,random_state=1)X_train,X_test,y_train,y_test=load_data()bagging.fit(X_train,y_train)
y_pre = bagging.predict(X_test)
print(accuracy_score(y_test,y_pre))
0.9473684210526315
bagging = BaggingClassifier(KNeighborsClassifier(),max_samples=0.1,max_features=0.5,random_state=1)X_train,X_test,y_train,y_test=load_data()bagging.fit(X_train,y_train)
y_pre = bagging.predict(X_test)
print(accuracy_score(y_test,y_pre))
0.9473684210526315
import matplotlib.pyplot as plt
import numpy as npparam_range = range(1,11,1)
sores_list = []
for i in param_range:baggingclf = BaggingClassifier(KNeighborsClassifier(),max_samples = i/10,max_features=0.5,random_state=1000,oob_score=True)baggingclf.fit(X_train,y_train)y_pre = baggingclf.predict(X_test)sores_list.append(accuracy_score(y_test,y_pre,normalize=True))plt.plot(param_range,sores_list)
plt.show()

sores_list = []
param_range = range(1,X_train.shape[1]+1)
for i in param_range:baggingclf_2 = BaggingClassifier(KNeighborsClassifier(),max_samples = 0.5,max_features=i,random_state=100,oob_score=True) # 一般而言特征选择越少,方差越大baggingclf_2.fit(X_train,y_train)y_pre = baggingclf_2.predict(X_test)sores_list.append(accuracy_score(y_test,y_pre,normalize=True))plt.plot(param_range,sores_list)
plt.show()

随机数对训练误差与测试误差的影响

sores_list = []
param_range = range(0,101)
for i in param_range:baggingclf_2 = BaggingClassifier(KNeighborsClassifier(),max_samples = 0.8,max_features=0.8,random_state=i)baggingclf_2.fit(X_train,y_train)y_pre = baggingclf_2.predict(X_test)sores_list.append(accuracy_score(y_test,y_pre,normalize=True))plt.plot(param_range,sores_list)
plt.show()

偏差方差分解

之前我们说过:虽然在Bagging中引入的随机分割增加了偏差,但是因为多个模型的集成平均,同时也使得我们在总体上获取了更好的模型.而下面就是对Bagging误差分解后与单个决策树的对比图。Bagging(Tree)相较于Tree增加了偏差,但是降低了方差,最终得到了优于Tree的模型,而同样的Bagging(Tree)_2进一步大幅度增加了偏差,但是同样的方差也大幅度下降,最终得到了效果优于Bagging(Tree)的最终模型。

import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor# Settings
n_repeat = 50       # Number of iterations for computing expectations
n_train = 50        # Size of the training set
n_test = 1000       # Size of the test set
noise = 0.1         # Standard deviation of the noise
np.random.seed(0)# Change this for exploring the bias-variance decomposition of other
# estimators. This should work well for estimators with high variance (e.g.,
# decision trees or KNN), but poorly for estimators with low variance (e.g.,
# linear models).
estimators = [("Tree", DecisionTreeRegressor()),("Bagging(Tree)", BaggingRegressor(DecisionTreeRegressor())),("Bagging(Tree)_2",BaggingRegressor(DecisionTreeRegressor(), max_samples=0.5, random_state=100))]n_estimators = len(estimators)# Generate data
def f(x):x = x.ravel()return np.exp(-x ** 2) + 1.5 * np.exp(-(x - 2) ** 2)def generate(n_samples, noise, n_repeat=1):X = np.random.rand(n_samples) * 10 - 5X = np.sort(X)if n_repeat == 1:y = f(X) + np.random.normal(0.0, noise, n_samples)else:y = np.zeros((n_samples, n_repeat))for i in range(n_repeat):y[:, i] = f(X) + np.random.normal(0.0, noise, n_samples)X = X.reshape((n_samples, 1))return X, yX_train = []
y_train = []for i in range(n_repeat):X, y = generate(n_samples=n_train, noise=noise)X_train.append(X)y_train.append(y)X_test, y_test = generate(n_samples=n_test, noise=noise, n_repeat=n_repeat)# Loop over estimators to compare
for n, (name, estimator) in enumerate(estimators):# Compute predictionsy_predict = np.zeros((n_test, n_repeat))for i in range(n_repeat):estimator.fit(X_train[i], y_train[i])y_predict[:, i] = estimator.predict(X_test)# Bias^2 + Variance + Noise decomposition of the mean squared errory_error = np.zeros(n_test)for i in range(n_repeat):for j in range(n_repeat):y_error += (y_test[:, j] - y_predict[:, i]) ** 2y_error /= (n_repeat * n_repeat)y_noise = np.var(y_test, axis=1)y_bias = (f(X_test) - np.mean(y_predict, axis=1)) ** 2y_var = np.var(y_predict, axis=1)print("{0}: {1:.4f} (error) = {2:.4f} (bias^2) "" + {3:.4f} (var) + {4:.4f} (noise)".format(name,np.mean(y_error),np.mean(y_bias),np.mean(y_var),np.mean(y_noise)))# Plot figuresplt.subplot(2, n_estimators, n + 1)plt.plot(X_test, f(X_test), "b", label="$f(x)$")plt.plot(X_train[0], y_train[0], ".b", label="LS ~ $y = f(x)+noise$")for i in range(n_repeat):if i == 0:plt.plot(X_test, y_predict[:, i], "r", label="$\^y(x)$")else:plt.plot(X_test, y_predict[:, i], "r", alpha=0.05)plt.plot(X_test, np.mean(y_predict, axis=1), "c",label="$\mathbb{E}_{LS} \^y(x)$")plt.xlim([-5, 5])plt.title(name)if n == 0:plt.legend(loc="upper left", prop={"size": 11})plt.subplot(2, n_estimators, n_estimators + n + 1)plt.plot(X_test, y_error, "r", label="$error(x)$")plt.plot(X_test, y_bias, "b", label="$bias^2(x)$"),plt.plot(X_test, y_var, "g", label="$variance(x)$"),plt.plot(X_test, y_noise, "c", label="$noise(x)$")plt.xlim([-5, 5])plt.ylim([0, 0.1])if n == 0:plt.legend(loc="upper left", prop={"size": 11})plt.show()
Tree: 0.0255 (error) = 0.0003 (bias^2)  + 0.0152 (var) + 0.0098 (noise)
Bagging(Tree): 0.0196 (error) = 0.0004 (bias^2)  + 0.0092 (var) + 0.0098 (noise)
Bagging(Tree)_2: 0.0195 (error) = 0.0020 (bias^2)  + 0.0075 (var) + 0.0098 (noise)

参考

  • sklearn ApacheCN中文官方文档 : 集成算法
  • sklearn官方文档 : Single estimator versus bagging: bias-variance decomposition
  • 《机器学习》 周志华编著

如果你想了解更多关于其他集成算法,或者Bagging系列算法的其他内容,比如随机森林等,请关注我的博客

转载于:https://www.cnblogs.com/fonttian/p/8480686.html

集成算法中的Bagging相关推荐

  1. CTR 预测理论(九):Boosting 集成算法中 Adaboost, GBDT 与 XGBoost 的区别

    https://blog.csdn.net/Dby_freedom/article/details/81975255 最近总结树模型,尝试将主流 Boosting 实现方式做一个分析汇总,文中部分内容 ...

  2. 特征编码在风控建模中的应用(上篇)—WOE是否可以提升集成算法效果?

    序言: 在风控模型开流程中,使用的场景分别有A卡.B卡.C卡等模型,常规使用最多的就是逻辑回归算法.使用逻辑回归算法80%会使用的编码方式就是WOE编码,相信做模型的同学对这种编码方式非常熟悉. 做W ...

  3. 以XGBoost为代表的集成算法体现的哲学思想与数学技巧

    目录 哲学思想一:抓住主要矛盾 为什么AdaBoost要增加前一次错分样本的权重? 为什么lightGBM可以忽略梯度小的样本? 哲学思想二: 矛盾在一定条件下是可以相互转化的. 为什么随机森林比单一 ...

  4. 1.11 集成算法|模型融合Ensemble methods

    sklearn.ensemble 模块包括了集成算法 集成算法的目的是用某个指定的学习算法将几个基学习器base estimator(一个模型称为一个基学习器)的预测结果结合起来,共同构建一个泛化性或 ...

  5. 算法梳理boosting\bagging\RF(1)

    LeetCode题目记录 1.集成学习概念 1.1 集成学习分类 1.2 集成学习步骤 2.个体学习器概念 3.boosting & bagging 3.1 boosting 3.2 bagg ...

  6. bagging算法_集成算法——三个“臭皮匠”级算法优于一个“诸葛亮”级算法

    最近在打算法竞赛的时候用到了集成算法,效果还不错,索性就总结了一篇集成算法的文章,希望能帮到正在转行的数据分析师们.集成算法核心思想集成算法的核心思想是通过构建并结合多个学习器来完成学习任务,也就是通 ...

  7. bagging算法_集成学习(Ensemble Learning)——Bagging与Random Forest(1)

    一. 什么是集成学习 集成学习是通过构建并结合多个学习器来完成学习任务的一类算法. 根据个体学习器(基学习器)之间是否存在强依赖关系可将集成学习分为两类: Boosting 个体学习器之间存在强依赖关 ...

  8. 在深度学习中使用Bagging集成模型

    集成模型是什么? 集成是一种机器学习概念,使用相同的学习算法训练多个模型.Bagging是一种减少预测方差的方法,通过使用重复组合生成多组原始数据,从数据集生成额外的训练数据.Boosting 是一种 ...

  9. 机器学习(4):集成算法(Bagging、Boosting、Stacking)

    目录 一.Bagging模型:随机森林 1.1 bagging的原理 1.2 随机森林算法 Random Forest 1.3 随机森林的推广:极限随机数 extra trees 二.Boosting ...

最新文章

  1. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
  2. Facebook 万字长文:AI 模型全部迁移至 PyTorch 框架
  3. LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法
  4. Altium Designer关闭板观察器,放大镜
  5. 在linux中安装rpm包
  6. 分享php中四种webservice实现的简单架构方法及实例(转)
  7. 8年测试经验,用例设计竟然不知道状态图法?
  8. mysql的ddl的语句有_Mysql操作之部分DDL语句
  9. 103.二叉树的锯齿形层次遍历:DFS解法
  10. 安卓问题报告小记(四):Some projects cannot be imported because they already exist in the workspace...
  11. javaswing个人记账系统 java swing mysql实现的个人记账系统源码(1012)
  12. WP10回滚WP8.1详细教程,变砖也可修复
  13. unrar在linux如何编译,rarlinux(rar\unrar在linux使用)
  14. Bartender编辑数据小标题中嵌入的数据更改无效,无法在条码中显示已经扫描的条码号
  15. 安全测试:听云短信接口安全测试,你的短信接口到底有多危险,可能瞬间损失过万,短信接口防盗刷测试
  16. column xxx is of type integer but expression is of type character varying。String的成员变量存到int的数据库列 报错
  17. “因遭勒索软件攻击,我被认定工作失职开除,并被老东家索赔 21.5 万元”
  18. 简易爬虫实现校园网剩余流量查询
  19. python作品-python实例作品
  20. 真机调试Error type 3 Error: Activity class {com.example.xxxxxx/com.example.xxxx}does not exist

热门文章

  1. Spring-boot 启动完成时执行指定任务
  2. 二、通过工厂方法来配置bean
  3. Java--FutureTask原理与使用(FutureTask可以被Thread执行,可以被线程池submit方法执行,并且可以监控线程与获取返回值)...
  4. 自由落体和抛物线运动
  5. 世界级Oracle专家Jonathan Lewis:我很为DBA们的未来担心(图灵访谈)
  6. flex swf和movieclip之前的微妙关系
  7. Oracle的分区操持
  8. 利用OpenCV的级联分类器类CascadeClassifier和Haar特征实现人脸区域的检测
  9. 计算机技术综合应用,浅谈计算机技术综合应用能力培养.pdf
  10. 直立车各环的调试_平衡小车调试指南(直立环 速度环)