这篇文章仅仅是为了帮助自己理解在分布式环境下是如何进行随机森林模型构建的,文章中记录的内容可能不太准确,仅仅是大致上的一个理解。

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上构造随机森林模型过程的一点理解的更多相关文章

  1. python的随机森林模型调参

    一.一般的模型调参原则 1.调参前提:模型调参其实是没有定论,需要根据不同的数据集和不同的模型去调.但是有一些调参的思想是有规律可循的,首先我们可以知道,模型不准确只有两种情况:一是过拟合,而是欠拟合 ...

  2. daal4py 随机森林模型训练mnist并保存模型给C++ daal predict使用

    # daal4py Decision Forest Classification Training example Serialization import daal4py as d4p import ...

  3. lkl风控.随机森林模型测试代码spark1.6

    /** * Created by lkl on 2017/10/9. */ import org.apache.spark.sql.hive.HiveContext import org.apache ...

  4. Spark随机森林实现学习

    前言 最近阅读了spark mllib(版本:spark 1.3)中Random Forest的实现,发现在分布式的数据结构上实现迭代算法时,有些地方与单机环境不一样.单机上一些直观的操作(递归),在 ...

  5. spark 随机森林算法案例实战

    随机森林算法 由多个决策树构成的森林,算法分类结果由这些决策树投票得到,决策树在生成的过程当中分别在行方向和列方向上添加随机过程,行方向上构建决策树时采用放回抽样(bootstraping)得到训练数 ...

  6. 使用基于Apache Spark的随机森林方法预测贷款风险

    使用基于Apache Spark的随机森林方法预测贷款风险   原文:Predicting Loan Credit Risk using Apache Spark Machine Learning R ...

  7. 笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本内容来源于CDA-DSC课程内容,原内容为& ...

  8. R语言︱机器学习模型评估方案(以随机森林算法为例)

    笔者寄语:本文中大多内容来自<数据挖掘之道>,本文为读书笔记.在刚刚接触机器学习的时候,觉得在监督学习之后,做一个混淆矩阵就已经足够,但是完整的机器学习解决方案并不会如此草率.需要完整的评 ...

  9. Spark随机森林实战

    package big.data.analyse.ml.randomforest import org.apache.spark.ml.Pipeline import org.apache.spark ...

随机推荐

  1. 【不知道怎么分类】HDU - 5963 朋友

    题目内容 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始 ...

  2. nc发送数据到端口

    head -n 1 /etc/passwd  | nc localhost 9200

  3. git stash功能的使用

    一,git stash的作用: 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录 说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com ...

  4. centos8安装fastdfs6.06集群方式二之:tracker的安装/配置/运行

    一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...

  5. centos8上配置openssh的安全

    一,openssh服务版本号的查看 1,查看当前sshd的版本号 : [root@yjweb ~]# sshd --help unknown option -- - OpenSSH_7.8p1, Op ...

  6. centos6.8 Mysql5.6.22 升级 mysql-5.7.20

    一.检查系统环境 二.备份数据库 mysqldump –all-databases > allbackupfile.sql (建议:有条件的话可使用图形化界面备份,操作灵活) 三.下载安装文件 ...

  7. 解决加密PDF文档无法复制文字的问题

    有的时候在网络上搜索到一篇心仪的PDF文档,想复制其中内容时提示无法复制. 如果只想摘抄其中部分文字内容,可以使用Firefox浏览器打开这篇加密文档. Firefox浏览器自带PDF插件,打开后即可 ...

  8. js工厂函数

    经常会遇到工厂函数这个词,不过javascript不是严格的面向对象语言,不像java,C#拥有类,所以工厂函数会变得比较模糊. 简单来讲,就是创建一个可以用来创建实例的函数,这样每一个实例都是独立的 ...

  9. uart接口介绍和认识

    接口/总线/驱动 UART (Universal Asynchronous Receiver/Transmitter) 通用异步收发器. UART是用于控制计算机与串行设备的芯片.有一点要注意的是,它 ...

  10. VMware Workstation Pro 虚拟机安装CentOS-7

    一.下载CentOS-7镜像 我是通过阿里开源镜像站下载的, 下载url:https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下载CentOS-7-x86 ...