在spark上构造随机森林模型过程的一点理解
这篇文章仅仅是为了帮助自己理解在分布式环境下是如何进行随机森林模型构建的,文章中记录的内容可能不太准确,仅仅是大致上的一个理解。
1.特征切分点统计
不管是连续取值型特征还是离散取值型特征,分裂树结点时都需要寻找最优特征的最优切分点。离散型特征还好一点,对连续型特征,其取值情况多,若是遍历所有数据样本,寻找特征的所有取值情况,然后找出全部的候选分割点,计算每个候选分割点下分割的效果,这个过程的空间和时间的耗费非常大。spark中采取的策略是,在数据样本集中进行随机采样,获取一定数量的样本,依据这批样本中各个特征的取值来计算特征切分点。当然,这样做会损失模型精度,但是提升了计算效率。
2.特征取值分箱
在spark上,不管特征是连续型还是离散型,取值都要分箱,目的是简化计算过程,连续型特征分箱还起到离散化作用。在分箱时,采取的是等频分箱。
经过1,2点中的内容,对原始样本数据进行一些预处理,后面就可以构建RF了。
3.逐层训练
在单机环境下,构建随机森林中每棵树时采用的是递归结点的方式,对左子节点和右子结点,不断地递归构建,直接从根结点到叶子结点,如果单机内存不够用,那么每次构建一个结点时都需要从磁盘中读取一次数据。I/O操作是很费时间的,假设子树个数为m,一棵树上结点个数为n,那么I/O次数为m*n,如果在spark中也按照这种方式来构建随机森林,还有数据传输时网络带宽的开销,在数据量很大时这种方式的效率是不敢想的,因此在spark中构建随机森林时采用了“逐层训练”的方式。
“层” 指树的深度,不同深度代表不同的层。逐层训练过程中,每从样本数据集中读取一次数据时, 就把随机森林中所有树上同一层的结点构建完毕,这样I/O操作的次数就是树的最大深度。以根节点的构造过程为例,说明逐层训练是如何进行:
(1)样本数据集在hdfs上存储时会有多个分区partition,假设RF中有k棵树,在每个partition上首先会对每个样本进行k次0/1抽样(当然,这里也可以设置每个树使用的数据样本占总样本数的比例,不过spark默认是1,这里就以1为例来说明),以此来决定该样本是否用于构建决策树p(p=1,2,...,k);
(2)每棵树会在某个partition所属的服务器上构建,那么在构建RF的第一层、树的根节点时,需要在属于某棵树的样本中寻找最优特征及其最优分割点,在第1,2点中已经描述了切分点选择与分箱的内容,那此时spark中的做法是,先在每个partition上统计每个特征、每个分割点下样本类别的分布情况,然后再把各个partition的统计结果汇总起来,计算结点分割后的gini指数变化(如果是采用gini指数),这样最终可以计算出最优特征及其最优分割点,通过这样的方式,可以把所有的根节点全部构建出来;
(3)根节点构建完成后,一棵树上样本会依据划分结果被标记其属于左子节点还是右子节点(这种标记在之后会不断的更新),那在左子结点和右子结点上,又会重复着根节点上进行的操作,这样可以构建RF上第二层的结点,后续的过程类似,以上就是逐层训练的大致过程。
在spark上构造随机森林模型过程的一点理解的更多相关文章
- python的随机森林模型调参
一.一般的模型调参原则 1.调参前提:模型调参其实是没有定论,需要根据不同的数据集和不同的模型去调.但是有一些调参的思想是有规律可循的,首先我们可以知道,模型不准确只有两种情况:一是过拟合,而是欠拟合 ...
- daal4py 随机森林模型训练mnist并保存模型给C++ daal predict使用
# daal4py Decision Forest Classification Training example Serialization import daal4py as d4p import ...
- lkl风控.随机森林模型测试代码spark1.6
/** * Created by lkl on 2017/10/9. */ import org.apache.spark.sql.hive.HiveContext import org.apache ...
- Spark随机森林实现学习
前言 最近阅读了spark mllib(版本:spark 1.3)中Random Forest的实现,发现在分布式的数据结构上实现迭代算法时,有些地方与单机环境不一样.单机上一些直观的操作(递归),在 ...
- spark 随机森林算法案例实战
随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数 ...
- 使用基于Apache Spark的随机森林方法预测贷款风险
使用基于Apache Spark的随机森林方法预测贷款风险 原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...
- 笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本内容来源于CDA-DSC课程内容,原内容为& ...
- R语言︱机器学习模型评估方案(以随机森林算法为例)
笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...
- Spark随机森林实战
package big.data.analyse.ml.randomforest import org.apache.spark.ml.Pipeline import org.apache.spark ...
随机推荐
- SpringBoot整合Elasticsearch游标查询(scroll)
游标查询(scroll)简介 scroll 查询 可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价. 游标查询会取某个时间点的快照数据. 查询初始化之后 ...
- 基于python实现链式栈
""" 链式栈 linkstack.py 思路分析: 1.源于链表结构 2.封装栈的操作方法(入栈,出栈,栈空,栈顶) 3.链表的开头作为栈顶(不用每次遍历,效率高,怎样 ...
- 如何把C++的源代码改写成C代码?而C改C++只需一步!
★ 如何把C++的源代码改写成C代码? C++解释器比C语言解释器占用的存储空间要大,想要在某些特定场合兼容C++代码,同时为了节省有限的存储空间,降低成本,也为了提高效率,将用C++语言写的源程序用 ...
- openresty使用redis作本地缓存
一,为什么要使用redis作本地缓存? 1,使用缓存通常会有三层 当使用openresty作为web服务器时,我们更看重是的它可以通过lua编程的扩展能力,就openresty而言,它可以实现的功能非 ...
- 数据库备份作业的T-SQL语句
1.关于大容量数据导入导出的一些方法SQL SERVER提供多种工具用于各种数据源的数据导入导出,这些数据源包括本文文件.ODBC数据源.OLE DB数据源.ASCII文本文件和EXCEL电子表格.2 ...
- 修改apt,pip,npm为国内镜像源
apt 原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 编辑源列表文件 sudo vim /etc/apt/sources. ...
- spring-boot-route(二十二)实现邮件发送功能
在项目开发中,除了需要短信验证外,有时候为了节省 短信费也会使用邮件发送.在Spring项目中发送邮件需要封装复杂的消息体,不太方便.而在Spring Boot项目中发送邮件就太简单了,下面一起来看看 ...
- C#之txt的数据写入
一.背景 小伙伴们在使用C#开发时,可能需要将一些信息写入到txt,这里就给大家介绍几种常用的方法. 二.思路 2.1将由字符串组成的数组写入txt 此种方法不需要使用Flush和Close(). 如 ...
- ES概要
ES分布式搜索,依赖了Lucene来提供搜索引擎功能,每个数据节点都是一个Lucene实例,通过将索引进行分片,写入和查询时候操作或查询对应分片,来达到水平扩展的能力 节点 Master node:负 ...
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...