【笔记】Bagging和Pasting以及oob(Out-of-Bag)
Bagging和Pasting以及oob(Out-of-Bag)
Bagging和Pasting
前面讲到soft voting classifier和hard voting classifier两个方法,但是这是有很大的问题的,集成学习就是集合多个算法让这几个算法一起计算投票,最后得到好的结果,算法的种类有很多,但是算法的种类再多也是有限的,从投票的角度看,仍然不够,投票票数越多,得到的结果才越好,可以看出来,聚集更多的分类器来得出更好的分类结果是很重要的问题
那么就要创建更多的子模型,集成更多子模型的意见,同时这些子模型之间是不可以一致的,为了保证投票有意义,子模型和子模型之间要具有差异性才可以
那么问题就变成了,怎么创建多个子模型,同时还让每一个子模型都具有差异性,方法就是,每个子模型都只看样本数据的一部分,需要注意的是,尽管这种方法会让每个子模型的准确率降低,但是每个子模型在这种情况下不需要特别高的准确率
假设一个子模型的准确率只有51%,那么如果只有一个子模型,整体的准确度就是51%,但是如果有三个子模型,整体的准确度就是51.5%,计算方式

可以发现是有提升的,如果有五百个子模型,那么整体准确率就是65.6%

可以发现子模型越多,提升越大,这是取51%的准确率,一般不会这么极端,集成学习的威力还是很厉害的
只看样本数据的一部分可以使用两种方式,一种是放回取样,一种是不放回取样,方式操作和名字一样,一般称放回取样的方式为bagging,不放回取样的方式成为pasting,其中bagging更加的常用,因为训练子模型的数量比起pasting要多,同时,bagging不会很依赖随机性,像pasting就很依赖,比如五百个样本,每个子模型取一百个样本,一共就五个模型,模型少不说,划分数据的方式也对最后的结果影响很大,虽然bagging也需要看划分数据的方式,但是因为模型足够多,所以这个随机性就被慢慢抵消掉了
具体实现操作
(在notebook中)
加载好需要的包,还是用虚拟数据,种子为42,绘制图像
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=42)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
图像如下

对数据集进行划分
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
因为要集成很多单独的算法,所以这里使用的每一个子模型的算法模型都是决策树模型(决策树更容易产生出差异比较大的子模型)
然后使用sklearn中的BaggingClassifier类,实例化操作一样,传入的参数,首先传入使用的算法,设置子模型数量为500,每一个子模型观察的样本数据为100,将bootstrap参数设置为True,使用放回取样的方式
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,max_samples=100,
bootstrap=True)
在对数据进行训练以后,计算分类准确度
bagging_clf.fit(X_train,y_train)
bagging_clf.score(X_test,y_test)
结果如下

将子模型的数量设置为5000,然后进行训练,得到训练结果以后计算分类准确度
bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=5000,max_samples=100,
bootstrap=True)
bagging_clf2.fit(X_train,y_train)
bagging_clf2.score(X_test,y_test)
结果如下

可以发现,准确度上升了一些,理论上,子模型数量越多,准确度越高
oob(Out-of-Bag)
可以发现,使用放回取样的时候,会导致有些样本可能根本就取不到,平均有37%的样本是取不到的,这部分样本称为oob(out of bag)
在遇到这种情况的时候,其实可以不使用测试数据集,直接使用放回取样中没有取到的样本部分来作为测试数据集就可以
具体实现
(在notebook中)
使用上面的环境布置以及虚拟数据可以得到图像

这里不做数据集的分割,和上面的代码操作大致相同,不过要在BaggingClassifier实例化的时候传入新的参数oob_score,将其设置为True,在计算准确度的时候就可以直接使用oob_score_来得到使用未使用部分的数据的测试准确度
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,max_samples=100,
bootstrap=True,oob_score=True)
bagging_clf.fit(X,y)
bagging_clf.oob_score_
结果如下

通过bagging可以发现可以发现bagging是很容易并行化处理的,可以使用n_jobs来调节使用的核心数量(并行线路数),为了体现出变化,测试一下时间
%%time
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,max_samples=100,
bootstrap=True,oob_score=True)
bagging_clf.fit(X,y)
%%time
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,max_samples=100,
bootstrap=True,oob_score=True,n_jobs=-1)
bagging_clf.fit(X,y)
结果如下(对比时间可以发现,使用全部核心来处理比默认要快不少)


对于bagging的更多的东西
之前产生差异化的操作是让每一个子模型去看一个更小的数据集,其实还可以使用random_subspaces针对特征进行随机取样,同时还有random_patches(对行和列都进行随机操作),其可以既针对样本,又针对特征进行随机采样
和上面的代码区别不大,添加的参数max_features,代表了每次观察的特征数,这里设置为1,参数bootstrap_features,就是特征的随机采样的方式,设置为True,就是放回取样,关掉样本的随机采样只需要将子模型的最大样本数设置成总体的样本数就可以,设置两个,一个对特征数进行放回取样,一个对样本数量和特征数量都进行放回取样,最后分别训练数据,计算准确度
random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,
max_samples=500,
bootstrap=True,
oob_score=True,
n_jobs=-1,
max_features=1,
bootstrap_features=True
)
random_subspaces_clf.fit(X,y)
random_subspaces_clf.oob_score_
random_patches_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators=500,
max_samples=100,
bootstrap=True,
oob_score=True,
n_jobs=-1,
max_features=1,
bootstrap_features=True
)
random_patches_clf.fit(X,y)
random_patches_clf.oob_score_
结果如下


可以发现,对特征数进行放回取样比对样本数量和特征数量都进行放回取样的准确度要低一些

【笔记】Bagging和Pasting以及oob(Out-of-Bag)的更多相关文章
- 机器学习:集成学习(Bagging、Pasting)
一.集成学习算法的问题 可参考:模型集成(Enxemble) 博主:独孤呆博 思路:集成多个算法,让不同的算法对同一组数据进行分析,得到结果,最终投票决定各个算法公认的最好的结果: 弊端:虽然有很多机 ...
- Python3入门机器学习经典算法与应用
<Python3入门机器学习经典算法与应用> 章节第1章 欢迎来到 Python3 玩转机器学习1-1 什么是机器学习1-2 课程涵盖的内容和理念1-3 课程所使用的主要技术栈第2章 机器 ...
- 关于Bagging
Bagging分为两种:Bagging和Pasting,前者是概率中的放回随机采样,后者是不放回随机采样:默认是放回采样随机:设置bootstrap=False即设置为不放回采样:默认bootstra ...
- 第七章——集成学习和随机森林(Ensemble Learning and Random Forests)
俗话说,三个臭皮匠顶个诸葛亮.类似的,如果集成一系列分类器的预测结果,也将会得到由于单个预测期的预测结果.一组预测期称为一个集合(ensemble),因此这一技术被称为集成学习(Ensemble Le ...
- 壁虎书7 Ensemble Learning and Random Forests
if you aggregate the predictions of a group of predictors,you will often get better predictions than ...
- Notes : <Hands-on ML with Sklearn & TF> Chapter 7
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 集成算法(chapter 7 - Hands on machine learning with scikit learn and tensorflow)
Voting classifier 多种分类器分别训练,然后分别对输入(新数据)预测/分类,各个分类器的结果视为投票,投出最终结果: 训练: 投票: 为什么三个臭皮匠顶一个诸葛亮.通过大数定律直观地解 ...
- Random Forest 与 GBDT 的异同
曾经在看用RF和GBDT的时候,以为是非常相似的两个算法,都是属于集成算法,可是细致研究之后,发现他们根本全然不同. 以下总结基本的一些不同点 Random Forest: bagging (你懂得. ...
- 《机器学习实战(基于scikit-learn和TensorFlow)》第七章内容学习心得
本章主要讲述了“集成学习”和“随机森林”两个方面. 重点关注:bagging/pasting.boosting.stacking三个方法. 首先,提出一个思想,如果想提升预测的准确率,一个很好的方法就 ...
随机推荐
- [网络编程]mqtt概念&数据包
目录 前言 1. MQTT 简介 2. MQTT 通信模型 2.1 MQTT 协议 2.2 MQTT 协议中的订阅&主题&会话 2.3 MQTT 协议中的方法 3. MQTT 协议数据 ...
- docker搭建数据库高可用方案PXC
前言 本方案主要目的是学习, 该方案不太合适于企业项目 是什么? 白话点, 是个提供了必要环境的虚拟机(类似于java的导入部分包一样和c++的头文件差不多), 所以它比普通的VMWare或者Virt ...
- PHP利用百度ai实现文本和图片审核
之前做平台内容发布审核都是自己构建一套违禁词库,在代码中利用词库判断用户发布的内容,现在可以使用百度ai api完成这个功能.接下来就简单说下怎么做吧: 首先打开百度ai 开发平台 注册一个账号: 注 ...
- Adaptive AUTOSAR 学习笔记 1 - Overview
缩写 AP: AUTOSAR Adaptive Platform CP: AUTOSAR Classic Platform AA: Adaptive Application ARA: AUTOSAR ...
- ROS2学习之旅(15)——编写简单的服务和客户节点(C++)
当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...
- ESP32-http server笔记
基于ESP-IDF4.1 #include <esp_wifi.h> #include <esp_event.h> #include <esp_log.h> #in ...
- java面向对象的理解(个人)
面向对象是Java的基本特征,在程序开发的过程中基于面向过程的一种思维,将功能封装进对象,强调具备这些功能的对象和调用结果,不关注具体的实现过程. 面向对象的特点:是一种更符合人们思考习惯的思想,可以 ...
- 第 3 题:如何理解 HTML5 语义化?
什么是标签语义化? 提升代码可读性,便于团队开发和维护 为什么要标签语义化? 当网页去掉 CSS 样式时,页面能呈现出来清晰的结构 案例 不存在语义化 <div></div> ...
- Windows内核开发-3-内核编程基础
Windows内核开发-3-内核编程基础 这里会深入讲解kernel内核的API.结构体.和一些定义.考察代码在内核驱动中运行的机制.最后把所有知识合在一起写一个有用的驱动. 本章学习要点: 1:通用 ...
- SpringBoot 构造器注入、Setter方法注入和Field注入对比
0. 引入 今天在看项目代码的时候发现在依赖注入的时候使用了构造器注入,之前使用过 Field 注入和 Setter 方法注入,对构造器注入不是很了解.经过查阅资料看到,Spring 推荐使用构造器注 ...