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

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. 【学习笔记】扩展卢卡斯定理 exLucas

    引子 求 \[C_n^m\ \text{mod}\ p \] 不保证 \(p\) 是质数. 正文 对于传统的 Lucas 定理,必须要求 \(p\) 是质数才行.若 \(p\) 不一定是质数,则需要扩 ...

  2. linux(centos8):kubernetes安装的准备工作

    一,安装docker-ce19.03.11 1,卸载podman [root@kubemaster ~]# dnf remove podman podman是红帽系os自带的容器,卸载是为了避免冲突 ...

  3. centos8平台安装gitosis服务

    一,git服务器端:准备gitosis需要的各依赖软件 1,确认openssh是否存在?如不存在,以下列命令进行安装 [root@yjweb ~]# yum install openssh opens ...

  4. nginx安全:修改对外的服务软件名称并隐藏版本号(nginx1.18.0)

    一,为什么要隐藏nginx真实的软件名称? 1,nginx响应的Server头部都会携带上服务软件的名字和版本信息, 服务器软件的版本信息暴光在外部,很容易被黑客了解到,就通过相应版本的漏洞来攻击服务 ...

  5. Linux命令行bash的快捷键

    提升效率 锁屏 Ctrl + s 敲什么命令没反应,但是敲上去了,屏幕上不做任何反应 Ctrl + q 再解锁 例如: 先Ctrl + s 锁屏 然后在命令行敲入 [root@C8-1 ~]# rm ...

  6. 纯JS自定义网页滚动条

    前言 由于最近在公司很忙,没什么时间更新,忙中抽时间做了一个JS滚动条,因为火狐浏览器与谷歌浏览器的滚动条自定义样式过于麻烦,所以我打算自己写个方便改样式的滚动条 CSS <style> ...

  7. s == t 何解?

    Integer s=new Integer(9); Integer t=new Integer(9); Long u=new Long(9);     (s==t) 这个是错的,只要有new这个关键字 ...

  8. 去重想到set,排序想到Arrays.sort

    package test; import java.util.Arrays; import java.util.Scanner; import java.util.Set; import java.u ...

  9. java 第一课 笔记

    java是一种解释型语言 Java提供了内存自动管理:不涉及指针:单继承. classpath:字节码文件的路径,执行java.exe时,会查找并解释*.class文件 set classpath=. ...

  10. LeakCanary检测内存泄漏

    内存泄漏原因: 线程造成的内存泄漏 Handler造成的内存泄漏 单例导致内存泄露 静态变量导致内存泄露 非静态内部类导致内存泄露 未取消注册(BroadcastReceiver )或回调导致内存泄露 ...