spark云计算环境下的大数据

标题:a parallel random forest algorithm for big data in a spark cloud computing environment

摘要

【如何高效且准确地从数据集中获取有价值的知识】备受关注。
本文展示了一种在Apache Spark平台上的大数据并行随机森林(PRF)算法
PRF算法是对基于结合数据并行和任务并行优化的混合方法进行的优化。

  1. 从数据并行优化的角度出发,采用垂直数据划分的方法来有效降低数据通信成本;采用数据复用的方法来重用训练数据集和减少数据量。
  2. 从任务并行优化的角度出发,在随机森林训练过程中,采用双并行方法,根据PRF的并行训练过程和RDD的依赖关系,建立任务有向无环图(DAG),为DAG中的任务调用不同的任务调度程序。
  3. 为了提高算法对大数据,高维数据和噪声数据的准确性,我们在训练过程中采用了降维方法,在并行化之前的预测过程中采用了加权投票方法。

在分类的准确性、性能和可伸缩性方面,优于spark MLlib实现的相关算法以及其他研究。
随着随机森林模型和Spark集群规模的扩大,PRF算法的优势更加明显。

1. introduction

1.1 动机

spark利用了RDD模型和建立在内存计算框架上的DAG(有向无环图)模型。
RF(随机森林)是一种较好的大数据挖掘算法,利用特征子空间去构造模型,切能同时训练所有决策树,故适用于并行。

1.2 贡献

总的:提出了一种在Apache Spark平台上的大数据并行随机森林(PRF)算法。
基于一种结合了数据并行优化和任务并行优化的方法优化了PRF算法。
为了提高PRF的分类准确性,在并行前使用优化方法。

  1. 优化算法提高了PRF的准确性:在训练过程中使用降维方法;在预测过程使用加权投票方法。
  2. PRF的混合并行方法来改进算法性能:数据并行、任务并行。
    数据并行优化时,采用垂直数据划分方法和数据复用方法。
  3. 基于数据并行优化,然后提出spark上的任务并行优化。基于RDD模型构建PRF的训练任务DAG,然后在DAG中利用不同的任务调度器来执行任务。PRF的性能将会显著提高。

2. 相关工作

为了解决高维度数据以及噪声数据:

  • Xu提出一种降维算法,结合数据集来获得具有详细纹理的图像对,并得到改进的图像配准。
  • Tao团队和Lin团队提出一些高维数据的分类算法,利用多核学习框架和多级最大容限特征,实现二进制分类问题的高效降维。
  • Strobl和Bernard研究了RF的可变重要度量,并提出了一些改进的模型。
  • Taghi团队比较了助推和袋装技术,并提出了一个噪声和不平衡数据的算法。
  • Yu团队和Biau团队专注于高维和噪声数据,将RF运用于很多地方比如说多类动作检测和面部特征检测。

基于上述工作,本文提出了一种新的优化方法来解决高维和噪声问题。通过构建RF来降维,利用低计算成本来提高算法的准确度。


关于大规模数据的分类算法,有很多现有方法:(略)
关于在并行分布式环境中的资源分配和任务并行执行方法,已经有:(略)
本文方法专注于在异构集群和分布式系统上的并行任务调度,取得了很好的成果。


Apache Spark Mllib基于数据并行优化对RF算法(本文中称为Spark-MLRF)进行了并行化,以提高算法的性能。但是有很多缺陷:

  1. 在确定连续特征的最佳分割段的阶段,使用对数据集的每个分区进行采样的方法来减少数据传输操作。 但是,这种方法的成本是其精度降低。
  2. 由于Spark-MLRF中的数据划分方法是一个水平划分,因此特征可变增益比(GR)计算的数据通信是一个全局通信。

为了提高RF算法的性能,缓解并行和分布式大规模数据的数据通信成本和工作量不平衡问题,我们提出了一种基于Spark RDD和DAG模型的混合并行数据并行和任务并行优化的RF并行方法。

与现有研究结果相比,本文方法在不降低算法精度的前提下,减小了训练数据集的数据量。 此外,我们的方法缓解了大规模数据在并行和分布式环境下的数据通信和工作负载不平衡问题。

3. 随机森林算法优化

  1. 在训练过程执行降维算法。
  2. 在预测过程执行加权投票算法。

3.1 随机森林算法

基于决策树模型的集成分类器算法。

  • 利用bootstrap抽样方法,从原始数据生成k个不同的训练数据子集。
  • 通过这些子集生成k个决策树。
  • 这些决策树构建了一个随机森林。
    (图1)

测试数据集的每个样本都由所有决策树预测,最终的分类结果将根据这些树的投票结果返回。


step1: 采样k个训练子集
原始数据集S:N*M(N个样本,每个样本M个特征量)
从原始数据集S中利用bootstrap采样方法采样k个训练子集。

插入一个bootstrap抽样方法的诠释
设总体的分布F未知,但已经有一个容量为n的来自分布F的数据样本,自这一样本按放回抽样的方法抽取一个容量为n的样本,这种样本称为bootstrap样本或称为自助样本。相继的、独立的自原始样本中取很多个bootstrap样本,利用这些样本对总体F进行统计推断。这种方法称为非参数bootstrap方法,又称自助法。此方法可以用于当人们对总体知之甚少的情况,它是近代统计中的一种用于数据处理的重要使用方法。
Bootstrap的思想,是生成一系列bootstrap伪样本,每个样本是初始数据有放回抽样。

在此文中应用bootstrap抽样,就是在S中有放回的抽N次,构成新的样本集 S1 。如此重复做k次bootstrap抽样,就形成了 S1S2...Sk 的训练子集。此时 Si :N*M(注意因为后面提到的降维方法所以正确的训练子集应该是 Si :N*m)。 STrain ={S1、S2…、Sk}。而未被选入到训练子集的样本构成集合 SOOB={OOB1,OOB2,...,OOBk}


step2: 构建每个决策树模型
从每个训练子集 Si 当中利用C4.5或者CART算法构建每个元决策树。在每棵树的成长过程当中,从 Si 中的M个特征量中随机挑选出m个特征量。在节点分裂过程中,计算每个特征量的增益率,最好的一个特征量被挑选出来最为最终的分裂节点。重复分裂过程直至到达叶子结点。最终,k棵决策树从k个训练子集中训练出来。


step3: k个决策树集合成RF模型

3.2 高维数据的降维

在每个决策树的训练过程中,每个特征量的增益率被计算并降序排列。最高的k个变量选为主要变量。然后从剩下的M-k个(原始数据的特征变量有M个)变量中随机挑选m-k个出来,这样,数据集的维数从M降到m。(图2)


step1:
在每颗决策树的训练过程中,在节点分裂前都会计算每个特征量的熵,目标特征量在训练子集 Si 的熵Entropy( Si )被定义为:
(略)
c1是 Si 中目标特征量所取的不同值的数量;pa是取值a的概率
step2:
Si 的第j个特征量 yij 的熵Entropy( yij )被定义为:
(略)
step3:
每个特征量的自分裂信息I( yij )被定义为:
(略)
于是,每个特征量的信息增益G( yij )被定义为:
(略)
利用信息增益来衡量特征量,最大值很容易被挑选出来,但是会导致过拟合问题。为了解决这一问题,增益率就被用于衡量特征量,增益量最高的特征量将会被挑选出来。特征量 yij 的增益率GR( yij )被定义为:
(略)
为了降低训练数据集的维度,我们根据特征量的增益率来计算每个特征量的重要性。然后,挑选最重要的特征以及删除最不重要的特征。每个特征量的重要性VI( yij )被定义为:
(略)


所有特征量的重要性都被计算出来后降序排列,前k个将被选出来,然后再在剩余的M-k个特征量中随机选取m-k个。最后,数据集的维度从M降到m。
Algorithm 1中详细介绍了训练过程降维的步骤。

对比于原始RF算法,我们的降维方法保证了m个被选择的特征量都是最优的,同时保持与原始算法一致的计算复杂度。这个方法平衡了特征选择的准确性和多样性,也防止了过拟合。

3.3 加权投票算法

原始RF算法在预测和投票阶段使用传统直接投票方法。若RF模型存在噪声决策树的话,很可能会导致测试集数据的误判,最后导致准确度的降低。为了解决这个问题,提出加权投票方法。每棵树的分类或回归的准确性被认为是树的投票权重。


一颗决策树的分类准确性 CAi 被定义为正确分类在所有分类中的占比,被定义为:
(略)
在预测过程中,由RF模型中的所有决策树预测测试数据集X的每个记录,然后获得测试记录的最终投票结果。 当X的目标变量是定量数据时,RF被训练为回归模型。 预测的结果是k树的平均值。 X的加权回归结果 Hr(X) 被定义为:
(略)
类似地,当X的目标特征是定性数据时,RF被训练为分类模型。 预测结果是k树分类结果的多数票。X的加权分类结果 Hc(X) 被定义为:
(略)


algorithm 2中详细描述加权投票方法。
在RF的加权投票方法中,每个树分类器对应于测试数据投票的指定合理权重。 因此,这提高了RF的整体分类准确度并减少了泛化误差。

3.4 计算复杂度

(略)

4. RF算法在spark上的并行化

为了提高RF算法的性能,缓解并行分布环境下大规模数据的数据通信成本和工作量不均衡问题,提出了一种spark上的并行随机森林算法。该算法优化采用基于数据并行和任务并行相结合的并行方式优化。

  • 数据并行优化的角度来看,执行垂直数据分割方法和数据多路复用方法。这些方法在不降低算法精度的前提下,减少了分布式环境下的数据量和数据传输操作次数。
  • 任务并行优化的角度,在PRF的训练过程中实现了双并行方法算法,根据RDD对象的依赖关系创建一个DAG任务。然后,调用不同的任务调度程序执行DAG中的任务。双并行训练方法最大限度地实现了PRF的并行化,提高了PRF的性能。最大限度地降低Spark集群间的数据通信成本,实现更好的工作负载均衡。

4.1 数据并行优化

数据并行优化包括垂直数据分割以及数据复用方法。

  • 首先,利用RF算法的特征变量的自然独立性和计算任务的资源需求,提出了一种训练数据集的垂直数据划分方法。训练数据被且分为若干个特征子集,每个特征子集以静态数据分配的方式分配给Spark集群。
  • 其次,为了解决数据量随着RF规模的增加而线性增长的问题,我们通过修改传统的采样方法来呈现PRF的数据复用方法。值得注意的是,我们的数据并行优化方法减少了数据量和数据传输操作的数量,而不降低算法的准确性。PRF规模的增加不会导致数据大小和存储位置的变化。

4.1.1 垂直数据分割

在PRF的训练过程中,每个特征量的增益率计算占据了大部分时间。但是,任务仅仅需要当前特征量和目标特征量的数据。因此,为了减少分布式环境下数据量以及数据传输花费,我们提出了一种垂直数据分割方法。训练数据集被划分成若干个特征子集。

从此小节开始有些难懂,插入随机森林的一些知识

随机森林是用随机的方式建立一个森林,由很多的决策树组成,随机森林的每一棵决策树之间没有关联。在得到森林之后,当有一个新的输入样本进入时,森林中的每一棵决策树分别进行判断,判断样本属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤——剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。

 
假设训练数据集S的大小为N,每个记录含有M个特征量。
每个输入特征量以及目标特征量一起构成一个特征子集 FSj 被定义为:
(略)
注意此时还是原始数据S,所以并没有特征子集 Si ,所以 yij 和上文的定义有所不同
i是数据集S中的每条记录的下标,j是当前特征量的下标
每条记录都有M个值,S有N条记录,故总共有N*M个y
这样一来,在降维之前,S被切分为M-1个特征子集。每个子集都作为RDD对象加载,并且独立于其他子集。
Fig. 3描绘了整个垂直数据切分的过程。
xi 为S中的第i个record, yj 为第i个record的第j个特征量)

4.1.2 数据复用方法

为了解决数据量随着RF规模的增加而线性增长的问题,我们通过修改传统的采样方法来呈现PRF的数据复用方法。在每个采样周期中,我们不复制采样数据,只是将其索引记录到数据采样索引(Data-Sampling-Index,DSI)表中。然后,将DSI表格与特征子集一起分配给所有从属节点。每个决策树训练过程中的计算任务通过DSI表从相同的特征子集中加载相应的数据。因此,每个特征子集被有效地重用,并且尽管RF比例的扩大,训练数据集的数据量将不再增加。

  • 首先,我们创建一个DSI表来保存在所有采样时间内生成的数据索引。如第3.1节所述,RF模型的规模是k。即,对于训练数据集有k个采样时间,并且在每个采样时间记录N个数据索引。表2列出了PRF的DSI表的一个例子。
  • 其次,将DSI表与所有特征子集一起分配给Spark集群的所有从属节点。在随后的训练过程中,将相同特征变量的不同树的增益率计算任务分派给需要的子集所在的从站。
  • 第三,每个增益率计算任务从DSI表中访问相关的数据索引,并根据这些索引从相同的特征子集中获取特征记录。PRF的数据复用方法的过程如图4所示。

Fig. 4中,同一个从属节点的任务属于不同的树。这些任务根据DSI中的相应索引从相同的特征子集中获取记录,并计算不同决策树的特征变量的增益比。 之后,将这些任务的中间结果提交给相应的后续任务以构建元决策树。

DSI表中有k个samples,每个sample里有bootstrap抽样来的N个record。总的k个sample里的不同record的数量小于或等于N(有放回抽样可能有重复record出现)。要计算DSI表中k个sample的各个特征量和目标特征量的增益比。在slave1中就是计算这些sample的第1个特征量与目标特征量的增益比;slave2中就是计算各个sample的第2个特征量与目标特征量的增益比。
构建第一颗决策树时,需要sample1(假设DSI表是从sample1开始记录)中的所有涉及到的特征量的增益率(N个record是为了求出增益率)。这时,就从slave1中取出第1个特征量增益比;从slave2中取出第2个特征量增益比;…;第M-1个slave中取出第M-1个特征量的增益比,再根据这些建立第1棵决策树。

4.1.3 静态数据分配

在垂直数据分区之后,对特征子集进行静态数据分配。在PRF的训练过程之前,子集被分配给分布式spark集群。 而且,由于每个特征子集的数据类型和容量的差异,相关的后续计算任务的工作负载也将不同。我们知道,一个Spark集群由一个主节点和多个从节点构成。 我们定义我们的分配函数来确定每个特征子集被分配给哪个节点,并根据其大小来分配每个特征子集。数据分配方案中有三种情况,例子如图5所示。

在图5中,(a)当特征子集的大小大于从属节点的可用存储容量时,将该子集分配给具有相似物理位置的有限多个从属。 (b)当特征子集的大小等于从节点的可用存储容量时,该子集被分配给节点。 (c)当特征子集的大小小于a的可用存储容量时节点将容纳多个特征子集。 在情况(a)中,后续增益率计算任务的数据通信操作发生在当前特征子集所在的从节点之间。这些数据操作是本地通信,但不是全局通信。 在情况(b)和(c)中,在随后的增益率计算处理中,在不同的从节点之间不发生数据通信操作。
Algorithm 3给出了PRF的垂直数据分区和静态数据分配的步骤。
首先通过垂直数据划分功能将 RDD0 划分为(M-1)个 RDDFS 对象。然后,根据每个从节点的容量和从节点的可用存储容量,将每个 RDDFS 分配给从节点。为了重用训练数据集,通过数据Allocation()函数和persist()函数将特征子集的每个RDD对象分配并保存到Spark集群。
输入:原始数据集S
输出: RDDFSj 的id与对应分配的spark节点号

4.2 任务并行优化

PRF的每个决策树是相互独立建立的,决策树的每个子节点也是独立分裂的。PRF模型和决策树模型的结构使计算任务具有自然并行性。基于数据并行优化的结果,提出了PRF的任务并行优化,并在Spark上实现。在PRF训练过程中,采用双并行方法,根据双并行训练过程和RDD对象的依赖关系建立任务DAG。 然后,调用不同的任务调度程序来执行DAG中的任务。

4.2.1 PRF的并行训练过程

提出在PRF训练过程当中spark上的双并行训练方法。在训练过程的第一级,并行建立了PRF模型的k个决策树。 在训练过程的第二级,对每个决策树中的(M-1)个特征变量同时进行树节点分裂计算。

在PRF的每个决策树的训练过程中都有若干个计算任务。根据所需数据资源和数据通信成本,计算任务分为增益率计算任务和节点分裂任务两类,定义如下。

定义3. 增益比计算任务( TGR )是一个任务集,用于计算特征变量与相应特征子集的增益率,其中包括每个特征变量的一系列计算,即熵,自身分割信息,信息增益和增益率。 TGR 任务的结果被提交给相应的后续节点分裂任务。
定义4. 节点分裂任务( TNS )是一个任务集,用于收集相关 TGR 任务的结果并拆分决策树节点,其中包括对每个树节点的一系列计算,如确定最佳分裂变量保持最高增益比值并且通过变量分割树节点。 在树节点分裂之后,将 TNS 任务的结果分配给每个从属节点,以开始PRF的下一阶段训练过程。
Algorithm 4 中详细介绍了PRF模型的并行训练过程。


Fig. 6描述了训练过程中的一个任务DAG
任务DAG中有若干个步骤,对应着决策树模型的各层。
stage 1
降维后,根据m-1个特征量生成了m-1个 TGR 任务( TGR1.0 ~ TGR1.(m2) )。这些 TGR 任务计算了相应特征量的增益率以及将结果提交给 TNS1 TNS1 找到最佳分裂特征量然后为当前决策树模型分裂第一个树节点。假设 y0 是最佳分裂量,则 y0 的值在{ v01 v02 v03 }范围内,于是,第一个树节点由 y0 构成,三个子节点从该节点分开,如图6b所示。 树节点分裂后, TNS1 的中间结果分配给所有的从节点。结果包括分裂量和数据索引列表{ v01 v02 v03 }的信息。
stage 2
因为 y0 是分裂量,所以 FS0 没有 TGR 任务。这个问题的潜在工作量平衡问题将在4.3.4节中讨论。 根据 TNS1 的结果为所有其他特征子集生成新的 TGR 任务。 由于{ v01 v02 v03 }的数据索引列表,每个特征子集不超过3个 TGR 任务。 例如,任务 TGR2.11 TGR2.12 TGR2.13 分别利用对应于{ v01 v02 v03 }的索引来计算 FS1 的数据。 FS2 ~ FS(m2) 的情况类似。 然后,将任务 TGR2.11 TGR2.21 TGR2.(m2)1 的结果提交给相同子树节点分裂的任务 TNS2.1 。 其他树节点和其他阶段的任务也是类似的。 这样就构建了每个决策树模型训练过程的任务DAG。 另外,对于PRF模型的k个决策树分别建立k个DAG。

就从slave0中计算出第0个特征量增益比( TGR1.0 );从slave1中计算出第1个特征量增益比( TGR1.1 );…;第M-1个slave中计算出第M-1个特征量的增益比( TGR1.(m1) ),汇集给 TNS1 分裂第一个节点。

4.2.2 任务并行调度

为所有的决策树构建DAG,这些DAG任务呗提交给spark任务调度器。DAG中有两个类型的计算任务,分别有不同的资源需求和并行化。为了改进PRF性能并进一步减少数据通通信花费,我们提出两种不同的任务并行调度器来完成这些任务。

spark中,TaskSchedulerListener模块监控着提交工作,将这一工作分裂成不同的阶段和任务然后提交这些任务给TaskScheduler模块。TaskScheduler模块收到任务后,分配并且使用适当的执行程序执行它们。根据不同的分配,TaskScheduler模块包括三个子模块,比如说local scheduler,cluster scheduler,和messos scheduler。同时,每个人物都有五种类型的属性值:process_local, node_local, no_pref, pack_local以及any。我们设置这两类任务的局部属性的值,并将它们提交到不同的任务调度器中。我们为 TGR 任务调用local scheduler,为 TNS 任务调用cluster scheduler。

(1)为 TGR 任务调用local scheduler
LocalScheduler模块是本地计算机的线程池,DAG Scheduler提交的所有任务都在线程池中执行,然后将结果返回给DAG Scheduler。 我们将每个 TGR 的局部属性值设置为NODE LOCAL,并将其提交给LocalScheduler模块。 在LocalScheduler中,PRF的所有 TGR 任务都分配给相应的特征子集所在的从节点。 这些任务是相互独立的,没有同步约束。如果一个特征子集被分配给多个从节点,则每个决策树的相应 TGR 任务被分配给这些节点。 并且在这些节点之间存在任务的本地数据通信操作。 如果一个或多个特征子集被分配给一个从节点,则相应的 TGR 任务被发布到当前节点。 在后续的计算过程中,当前节点和其他节点之间没有数据通信操作。

(2)为 TNS 任务调用cluster scheduler
ClusterScheduler模块监控整个Spark集群中计算资源和任务的执行情况,并将任务分配给合适的工作器。 TNS 任务独立于所有特征子集,可以在整个Spark集群中进行调度和分配。另外,这些 TNS 任务依赖于相应的 TGR 任务的结果,因此,这些任务有一个等待和同步限制。因此,我们调用ClusterScheduler来执行 TNS 任务。 我们将每个 TNS 的局部属性值设置为ANY并提交给ClusterScheduler模块。
algorithm 5中描述了用于 TNS 任务的任务并行调度方案。
图7中描述了用于上述DAG中的任务的任务并行调度的示意图。

4.3 并行优化算法分析

与Spark-MLRF以及其他RF并行方法比较。

4.3.1 计算复杂度分析

降维后的PRF算法复杂度为:略
在spark上并行后,M个特征训练集在降维过程中并发计算,k个决策树并行训练,复杂度为:略

4.3.2: 数据量分析

数据复用方法,数据被有效重复利用,总体训练数据量减少,且不会随着PRF的规模的增大而变化。

4.3.3 数据通信分析

在PRF模型训练的过程中,如果一个特征子集被分配给多个计算机节点,则在这些节点之间发生后续计算任务的本地数据通信操作。 如果一个或多个特征子集被分配给一个计算机节点,则在随后的计算过程中不存在不同节点之间的数据通信操作。一般来说,决策树训练过程中每个阶段的中间结果都存在少量的数据通信成本。 垂直数据分区和静态数据分配方法减少了分布式环境下的数据通信量,克服了传统并行方法的性能瓶颈。

4.3.4 资源和工作量平衡分析

较其他算法有更好的存储和工作负载平衡。
原因:

  1. 根据spark集群的slave的容量而分配特征数据集。大的特征数据集被分配给多个slave节点, TGR 任务被并发调度。小的特征数据集分配给单个slave节点,当前节点中调度 TGR 任务。
  2. 在树节点分裂的情况下,分裂变量的特征子集所在的从节点将恢复到空闲状态。从PRF的整个训练过程来看,利用PRF的数据复用方法,每个特征子集都被所有的决策树共享和重用,并且可以针对不同树中的不同树节点进行拆分。也就是说,虽然特征子集对决策树是分裂和无用的,但对其他树仍然有用。因此,我们的PRF不仅不会导致资源浪费和工作负载不平衡的问题,而且会充分利用数据资源,实现整体工作量的平衡。

比如说之前 y0 是分裂节点,这个时候第0个特征数据集就在这个决策树中没有作用了,但是这个特征数据集在其他决策树中还是需要被利用上的。

4.3.5 算法可扩展性分析

从三方面讨论PRF算法的稳定性和可扩展性。

  1. 得益于数据复用方法,训练数据集将被有效地重复利用。如果PRF的规模扩大了,即决策树增加,那么数据大小和特征数据集的存储位置不需要改变。唯一改变的是新的决策树带来的计算任务以及小部分数据通信花费。
  2. 当Spark集群的规模扩大时,只有少量具有较高存储负载的特征子集迁移到新的计算机节点,以实现存储负载和工作负载均衡。
  3. 当训练数据集的规模增加时,只需要以相同的垂直数据划分方式从新数据中分割出特征子集,并将每个新子集附加到相应的原始子集上。

因此,可以得出结论:采用混合并行优化方法的PRF算法具有良好的稳定性和可扩展性。

5 实验

5.1实验设置

所有实验在spark云平台上进行,spark平台包括一个主节点和100个从节点(slave nodes)。每个节点都在Ubuntu(乌班图) 12.04.4中执行,并且有一个Pentium(奔腾)(R)双核3.20 GHz CPU和8 GB内存。所有节点通过高速千兆网络连接,并配置Hadoop 2.5.0和Spark 1.1.0。该算法在Scala 2.10.4中实现。实验中使用了两组具有大规模和高维度的数据集。一个来自UCI机器学习库[33],如表3所示。另一个来自实际的医疗项目,如表4所示。

datgasize(original)指的是原始数据的大小;datasize(maximum)指所有比较算法采样的数据峰值大小。

在Spark平台中,训练数据不会作为一个整体加载到内存中。Spark可用于处理大于群集内存总容量的数据集。单个执行器(executor)进程中的RDD对象通过迭代来访问,数据在处理后被缓存(buffered)或丢弃。当不需要缓存RDD对象的结果时,内存的成本非常小。在这种情况下,迭代的结果由高速缓存管理器保留在内存池中。当内存中的数据不适用时,它们将被保存在磁盘上。在这种情况下,部分数据可以保存在内存中,其余部分保存在磁盘中。 因此,可以在Spark上执行峰值大小为2.0TB的训练数据。

5.2 分类准确性

与RF, DRF以及Spark-MLRF比较分类准确性。

5.2.1 不同决策树规模下的分类准确性

利用表3和表4中的数据,图8显示实验结果。
随着决策树规模的增加,这些算法的分类准确性逐渐增加并且有一个收敛的趋势。
与其他算法对比,PRF算法显著提高了分类准确性。

5.2.2 不同数据规模下的分类准确性

利用表4中的数据,图9显示实验结果。

5.2.3 不同决策树规模下的OOB错误率

在随机森林之Bagging法中可以发现Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立。把这1/3的数据称为袋外数据OOB(out of bag),它可以用于取代测试集误差估计方法。
OOB错误率:对于已经生成的随机森林,用袋外数据测试其性能,假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类,因为这O条数据的类型是已知的,则用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小=X/O;这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。

利用表4中的patient数据集,两类决策树规模(500和1000)。图10和表5展示了实验结果。
PRF的决策树数量增加时,OOB错误率逐渐降低且趋于收敛。

5.3 性能估计

5.3.1 不同数据集下的平均执行时间

四组数据集用于实验中。决策树数量都是500,spark的slave节点数量都是10。图11显示了实验结果。
当数据量很小时,传统RF的执行时间更小,原因是将这些算法提交给Spark集群并配置程序需要一个固定的时间。数据量越大,PRF算法的优势越明显。

5.3.2 不同spark集群规模下的平均执行时间

不同slave节点数进行实验(10到100)。图12展示了实验结果。
当slave节点数从10增加到50时,平均执行时间减少得最明显。因为随着slave节点数大于训练数据集的特征量时,每个特征数据集可能会被分配给多个slave节点,这样增加了数据通信花费。

5.3.3 不同环境下的PRF算法加速

在独立环境和Spark云平台上进行实验来评估PRF的加速。由于训练数据集大小不同,在不同的情况下PRF的执行次数不在同一个范围内。为了直观地观察执行时间的比较,执行时间归一化。
T(i,sa) 为独立环境下数据集 Si 的PRF的执行时间,首先归一化为1,将Spark上PRF的执行时间归一化为:

对于 Si ,在Spark上PRF的加速被定义为:

图13展示了比较分析的结果。
利用并行算法和云环境,在每个实验中,随着从节点数量的增加,Spark上的PRF加速趋于增加。当从节点数等于100时,所有情况下PRF的加速因子在60.0-87.3的范围内,小于理论值(100)。由于分布式环境中存在数据通信时间,应用程序提交和配置时间固定,所以PRF的整体加速比理论值小是可以理解的。由于数据量和内容的不同,PRF在各种情况下的加速比例是不同的。
当从节点数小于50时,每种情况下的加速比都呈现出快速的增长趋势。例如,与独立环境相比,当从节点数等于50时Gas的加速因子是65.5,Patient的加速因子是61.5。但是,从节点数大于50时,每种情况下的加速比例呈现缓慢的增长趋势。这是因为PRF需要更多的数据分配,任务调度和数据通信操作。

5.3.4 不同RF规模下的数据量分析

games数据集为例,图14中展示了不同RF规模下的训练数据大小。
由于采用相同的水平采样方法,RF和Spark-MLRF的训练数据量随着RF模型规模的增大呈现线性增长的趋势。而在PRF中,所有训练特征子集的总数据量是原始训练数据集的2倍。利用PRF的数据复用方法,训练数据集被有效地重用。当决策树数量大于2时,尽管RF尺度扩大,但训练数据的量不会再增加。

5.3.5 数据通信成本分析

不同spark集群规模来比较数据通信成本( CDC )。Spark集群中从属节点的suffer-write大小作为算法的CDC进行监视。
Patient数据集为例,图15展示了 CDC 的比较结果。
PRF的垂直数据分割方法和分配方法以及任务调度方法让大部分计算任务 TGR 从本地slave中获取数据,从而减少了在分布式环境中数据的传输量。

6 总结

提出应用于大数据的一种并发随机森林算法。

PRF算法的准确率通过降维以及加权投票方法优化。
然后,提出了一种结合了数据并行和任务并行优化的PRF混合并行方法并运用于spark平台。
得益于数据并行优化,训练数据集被重复利用,数据量显著减小。
得益于任务并行优化,数据传输成本有效减少,算法性能显著提高。

实验结果表明在分类准确性、性能以及稳定性方面,PRF算法都明显优于其他算法。

未来,我们将专注于云环境下的数据流增量并行随机森林算法,去改善分布式并行环境下的数据分配和算法任务调度机制。

你可能感兴趣的:(spark)