【笔记】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三个方法. 首先,提出一个思想,如果想提升预测的准确率,一个很好的方法就 ...
随机推荐
- Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribute name is preceded by whitespace
Error: Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribut ...
- 通过MMIO的方式实现VIRTIO-BLK设备(一)
背景知识 什么是VIRTIO 使用完全虚拟化,Guest不加任何修改就可以运行在任何VMM上,VMM对于Guest是完全透明的.但每次I/O都将导致CPU在Guest模式与Host模式间切换,在I/O ...
- ESP32构建系统(CMake版)
ESP32 芯片是一款 2.4 GHz Wi-Fi 和蓝牙双模芯片,内置 1 或 2 个 32 位处理器,运算能力最高可达 600 DMIPS. ESP-IDF 即乐鑫物联网开发框架,可为在 Wind ...
- 6.Java方法
一.什么是方法 方法:要去做某件事情,而采取的一些解决办法( Java 中的方法是完成某些事情的) System.out.println(); //类(系统类) 对象(标准输出对象) 方法(print ...
- 痞子衡嵌入式:串行NOR Flash的页编程模式对于量产时间的影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的页编程模式对于量产时间的影响. 任何嵌入式产品最终都绕不开量产效率话题,尤其是对于主控是非内置 Flash 型 ...
- [刘阳Java]_ResourceBundleViewResolver视图解析器_第7讲
ResourceBundleViewResolver是根据proterties文件来找对应的视图来解析"逻辑视图".该properties文件默认是放在classpath路径下的v ...
- SpringBoot自动装配-自定义Start
SpringBoot自动装配 在没有使用SpringBoot之前,使用ssm时配置redis需要在XML中配置端口号,地址,账号密码,连接池等等,而使用了SpringBoot后只需要在applicat ...
- Oracle执行计划总结
一.ORACLE中常见执行计划 表访问的执行计划 1.table access full:全表扫描.它会访问表中的每一条记录. 2.table access by user rowid:输入源rowi ...
- HDFS学习总结之安装
HDFS linux安装总结(基于hadoop-2.6.0-cdh5.7.0 伪分部安装) 1.jdk安装 1) 直接下载jdk包放到安装目录即可(jdk-8u131-linux-x64.tar.gz ...
- Requests方法 --- post 请求body的四种类型
常见的 post 提交数据类型有四种: 1.第一种:application/json:这是最常见的 json 格式,也是非常友好的深受小伙伴喜欢的一种,如下{"input1":&q ...