RandomForest中的包外误差估计out-of-bag (oob) error estimate
1. 引入
从RandomForest的鼻祖Breiman的comments(参考1)中,可以看到他说过:对于RandomForest的validation,没有必要像其他模型一样做cross-validation了,可以直接用RandomForest在内部就提供了out-of-bag (oob) error estimate
,用这种方法就可以看出RF的训练效果了。
那我们该怎么理解out-of-bag (oob) error estimate
呢?
2. 原理:oob error estimate
首先解释几个概念
- bootstrap sampling
bootstrap sampling
是自主采样法,指的是有放回的采样。这种采样方式,会导致约有36%的样本永远不会被采样到。
具体计算过程:假设有m个样本,有放回的采样,每次被采样到的概率是(1/m),每次不被采样到的概率是(1-1/m);则(1-1/m)的n次方,当n足够大是,极限为1/e(约等于36%)。
- Bagging
Bagging
是并行集成学习方法最著名的代表,他是基于bootstrap sampling
做的有放回抽样,多次抽样后组成多组训练集,来训练多个模型。
RandomForest就是基于Bagging
做了一个扩展:随机选择属性(特征)。
- out-of-bag (oob) error
out-of-bag (oob) error是 “包外误差”的意思。
它指的是,我们在从x_data中进行多次有放回的采样,能构造出多个训练集。根据上面1中bootstrap sampling
的特点,我们可以知道,在训练RF的过程中,一定会有约36%的样本永远不会被采样到。
注意,这里说的“约36%的样本永远不会被采样到”,并不是针对第k棵树来说的,是针对所有树来说,36%的样本永远不会在任何一棵树的训练集中出现过。
那这36%的样本,就是out-of-bag (oob) data
,包外数据。
用这个包外数据来做evaluation,就相当于用测试集来做evaluation。所以RF不需要再用测试集来做evaluation了。
3. 编程:oob error estimate
上面解释清楚了oob error estimate
的原理,这里给一段示例代码来说明他的用法。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# step-01: get data
data = load_iris()
x_data=data.data
y_data=data.target
# step-02: train rf
clf = RandomForestClassifier(random_state=0, oob_score=True)
clf.fit(x_data,y_data)
# step-03: oob error estimate
print(clf.oob_score_)# 0.9333333333333333
这里注意4点:
- 不需要再划分训练集和测试集
- RandomForestClassifier的参数oob_score要设置为True(默认为False)
- RandomForestClassifier的参数bootstrap要设置为True(默认为True)
- 通过访问RandomForestClassifier对象的实例变量oob_score_就能得到1-oob_error的值
4. 总结
本文描述了参考1中对RandomForest的关键部分out-of-bag (oob) error estimate
的理解,也给出了参考代码。
参考
- https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
- 周志华《机器学习》2.2节“评估方法”
- 周志华《机器学习》8.3节“Bagging与随机森林”
RandomForest中的包外误差估计out-of-bag (oob) error estimate相关推荐
- R语言使用randomForest包构建随机森林模型(Random forests)、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB
R语言使用randomForest包中的randomForest函数构建随机森林模型(Random forests).使用importance函数查看特征重要度.使用table函数计算混淆矩阵评估分类 ...
- clisp语言中的包
1. 包简介 clisp中的包就像一个名字空间一样,可在包中定义变量.函数等 包的另一个作用分离不同功能的模块代码组织. 包具有导入导出的概念,有特定关键字实现这个功能. make-package 包 ...
- [跟我学UML] UML包图中的包引入和包合并
缩略语 UIS UML Infrastructure Specification UML基础结构规范 UML Unifed Modeling Language ...
- 如何读取jar包外的properties和log4j.properties等配置文件
一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生... 一般在项目中使用prop ...
- Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件
项目中,经常把一部分功能独立出来,做一个java project,然后打成jar包供其他项目引用.这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采 ...
- 如何读取jar包外的properties文件和log4j.properties
2019独角兽企业重金招聘Python工程师标准>>> 时间有限,不做排版和具体讲述问题产生的过程,下面是我的解决方案,已证实有效,其中Log4jP = "log4j.pr ...
- c++读取txt文件中的数字_在Python中读取包中的数据文件的三种方式
我们知道,写Python代码的时候,如果一个包(package)里面的一个模块要导入另一个模块,那么我们可以使用相对导入: 假设当前代码结构如下图所示: 其中test_1是一个包,在util.py里面 ...
- rust笔记7 rust中的包管理
rust相比于C++,一个优势在于有一个现代化的包管理系统,我们不用搞各种命令空间和依赖的问题.这里主要记录了一般文件打包的方式. rust中声明包的关键字是mod,如果是公共的,则需要声明为pub ...
- Linux 中的包管理器是什么?它是如何工作的?
文章目录 1.Linux 中的包管理器是什么? 2.什么是包? 3.包管理器如何工作? 4.不同类型的包管理器 1.Linux 中的包管理器是什么? Linux 发行版之间的主要区别之一是包管理系统( ...
最新文章
- android 数据库表格数据库数据库中,Android SQLite数据库中的表详解
- ARM的流水线与PC值的关系
- 安卓TTS语音合成经验分享(科大讯飞语音+)集成
- Android后台保活实践总结:即时通讯应用无法根治的“顽疾”
- 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
- 藤条生长为字母的动画
- cookie无法读取bdstoken_第二章(第12节):cookie操作
- java svn 版本号_eclipse中的Java文件自动根据svn版本号生成注释
- java cas原理_Java并发之原子变量及CAS算法-上篇
- oracle with as用法_as的用法那么多,你知道多少?
- Python写数据结构:循环队列
- 测试专家谈IT从业人员修炼之道
- 4.性能之巅 洞悉系统、企业与云计算 --- 观测工具
- Apache JMeter web 应用测试工具使用快速入门
- 170517、Redis 的安装与使用(单节点)
- matlab中对于xf(x)的积分,[matlab 积分]MATLAB求积分?
- 华为设备接口视图_华为交换机的三种视图
- Node-RED使用指南:5:设置管理员的登录密码
- 芯片在计算机中作用是什么,逻辑芯片的作用是什么
- 足球相关的英文专业术语(持续更新中...Ctrl+F可直接进行搜索)