当前位置: 首页 > news >正文

【机器学习】集成学习:使用scikitLearn中的BaggingClassifier实现bagging和pasting策略

1.当所集成的若干模型对应的训练算法相同,但每个模型是在训练集上的不同随机子集上训练使,对应的集成学习策略叫做bagging和pasting。

2.进一步,bagging和pasting的区别是,bagging是放回的采样,在训练某一预测模型时,允许多次使用同一样本。bagging和pasting均允许不同的模型训练时采样同一实例。

3.待所有模型的训练都完成后,采用硬投票类似的统计法用于分类,采用取平均的方法应用于回归任务。这种方法也可以叫做是聚合,经聚合后,偏差(由于使用的是相同算法训练的模型)相近或更低,方差显著降低。

对于决策树来讲,它属于无参模型,特别容易出现过拟合,此时采用集成学习,可以达到减少其方差的目的。

4.其优势在于,可以应用于cpu并行的进行训练以及预测,最后再将结果进行聚会。
其代码如下:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=500,
    max_samples=100, bootstrap=True, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)

上述代码集成了500棵决策树的预测结果,每次训练模型随机采样100个实例进行训练,当预测模型自身带有可供概率预测的方法时,如含predict_proba()方法时,BaggingClassifier分类器将做软投票,否则使用硬投票的方法完成分类。当想使用pasting时,在上述代码中设置bootstrap=False即可。

当训练样本为2维时(这里使用的是月亮数据集),下面提供的代码可供绘制预测的边界:

from matplotlib.colors import ListedColormap

def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.45, -1, 1.5], alpha=0.5, contour=True):
    #等距划分X及y轴的数据,分割成网
    x1s = np.linspace(axes[0], axes[1], 100)
    x2s = np.linspace(axes[2], axes[3], 100)
    x1, x2 = np.meshgrid(x1s, x2s)
    #拉直,降维
    X_new = np.c_[x1.ravel(), x2.ravel()]
    y_pred = clf.predict(X_new).reshape(x1.shape)
    #定义颜色地图
    custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
    #该函数绘制带填充的等高线,由于最终分成2类,所以是两种颜色填充
    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
    if contour:
        custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
        plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
    plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
    plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
    plt.axis(axes)
    plt.xlabel(r"$x_1$", fontsize=18)
    plt.ylabel(r"$x_2$", fontsize=18, rotation=0)

调用绘图处:

fig, axes = plt.subplots(ncols=2, figsize=(10,4), sharey=True)
plt.sca(axes[0])
plot_decision_boundary(tree_clf, X, y)
plt.title("Decision Tree", fontsize=14)
plt.sca(axes[1])
plot_decision_boundary(bag_clf, X, y)
plt.title("Decision Trees with Bagging", fontsize=14)
plt.ylabel("")
plt.show()

绘制最终结果为:
在这里插入图片描述
可以看到右图中,经过集成学习后,模型的方差要好很多。

特别注意,当使用bagging时,由于抽样后被放回(bootstrap=True),有些实例被放回,而有些实例从未被使用,这部分实例比例固定约占30%,这部分未被使用实例被称为“包外实例”,可使用这部分实例进行包外评估,代替测试集对模型进行评估。其代码如下:

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=500,
    bootstrap=True, oob_score=True, random_state=40)
bag_clf.fit(X_train, y_train)
#打印出包外分数
bag_clf.oob_score_

BaggingClassifier类也支持对特征进行采样。由两个超参数控制:max_features和bootstrap_features。它们的工作方式与max_samples和bootstrap相同,但用于特征采样而不是实例采样。因此,每个预测器将用输入特征的随机子集进行训练。
当保留所有训练实例,但是对特征进行抽样,这种方法叫随机子空间法,代码如下:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=500,
    #每次取全部样本训练
    max_samples=1.0, bootstrap=False, random_state=42,bootstrap_features=True,
    #当特征数很多时,固定抽取0.5的特征进行训练
    max_features=0.5)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)

相关文章:

  • 算法与数据结构 --- 串,数组和广义表 --- 串
  • 【Python Web】Flask框架(四)Bootstrap的使用及案例
  • MySQL------数据表的创建和简单、条件,模糊查询
  • 【arduino】I/O端口操作
  • 微服务项目:尚融宝(44)(核心业务流程:借款申请(1))
  • 11、Java——吃货联盟订餐系统(对象+数组)
  • Java高性能实体类转换工具MapStruct
  • C++引用的概念
  • 基于ResNetRS的宝可梦图像识别
  • SpringBoot+Easyexcel读取多sheet支持xls,xlsx版本的excel
  • Ubuntu22.04 安装配置流水账
  • SwiftUI 动态岛开发教程之什么是Dynamic Island,快速完整demo
  • 关于我博客付费专栏:写给粉丝的致歉信
  • uni-app 高度自适应
  • 拼多多anti-token 字段加解密学习分析
  • [译]CSS 居中(Center)方法大合集
  • [译]Python中的类属性与实例属性的区别
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【node学习】协程
  • JavaScript新鲜事·第5期
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • log4j2输出到kafka
  • Python实现BT种子转化为磁力链接【实战】
  • Redis 中的布隆过滤器
  • Webpack入门之遇到的那些坑,系列示例Demo
  • XML已死 ?
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 面试遇到的一些题
  • 批量截取pdf文件
  • 我的面试准备过程--容器(更新中)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #100天计划# 2013年9月29日
  • #define用法
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (八)c52学习之旅-中断实验
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十)c52学习之旅-定时器实验
  • (转)VC++中ondraw在什么时候调用的
  • (转)可以带来幸福的一本书
  • *上位机的定义
  • .Net IE10 _doPostBack 未定义
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET是什么
  • /bin/bash^M: bad interpreter: No such file or directory
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [Bada开发]初步入口函数介绍
  • [BZOJ1053][HAOI2007]反素数ant
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]