【笔记】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三个方法. 首先,提出一个思想,如果想提升预测的准确率,一个很好的方法就 ...
随机推荐
- Kafka:Springboot整合Kafka消息队列
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 项目结构 pom依赖包 <?xml version="1 ...
- 其他:什么是元数据?(Metadata)?
元数据 任何文件系统中的数据分为数据和元数据.数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限.文件拥有者以及文件数据块的分布信息(inode...)等等 ...
- <jsp:param>传递参数,出现乱码问题
今天在学习<jsp:forward>和<jsp:param>时,用<jsp:param>传递参数时,出现乱码问题,部分代码如下: 1 <jsp:forward ...
- hfctfwp(re)
1.easy python revering 看字节码操作,昂哥直接看直接写exp太强了,我就直接手动写了个源码出来(昂哥永远滴神) arr0=[249,91,149,113,16,91,53,41, ...
- Vue | 路由守卫面试常考
前言 最近在整理基础,欢迎掘友们一起交流学习 结尾有彩蛋哦! Vue Router 路由守卫 导图目录 路由守卫分类 全局路由守卫 单个路由守卫 组件路由守卫 路由守卫执行的完整过程 路由守卫分类 全 ...
- ESP32非易失性存储整型数据笔记
基于ESP-IDF4.1 1 #include <stdio.h> 2 #include "freertos/FreeRTOS.h" 3 #include " ...
- MySQL存储引擎——InnoDB和MyISAM的区别
MySQL5.5后,默认存储引擎是InnoDB,5.5之前默认是MyISAM. InnoDB(事务性数据库引擎)和MyISAM的区别补充: InnoDB是聚集索引,数据结构是B+树,叶子节点存K-V, ...
- Linux中ftp服务器搭建
一.FTP工作原理 (1)FTP使用端口 [root@localhost ~]# cat /etc/services | grep ftp ftp-data 20/tcp #数据链路:端口20 ftp ...
- C语言:位运算符
异或 ^ 两个二进制位相同结果为0:不相同结果为1 1^1=0 1^0=1 0^1=1 0^0=1 按位或 | 两个二进制位 ...
- C语言:printf("")标志详解
%d 十进制整数 %ld 十进制长整型 %hd 十进制短整型 %o 八进制整数 %X %x 十六进制 整数 %f 以十进制形式输出 float 类型: %lf 以十进制形式输出 double 类 ...