📜  R 编程中具有并行计算的随机森林

📅  最后修改于: 2022-05-13 01:55:20.480000             🧑  作者: Mango

R 编程中具有并行计算的随机森林

R 编程中的随机森林基本上是一种装袋技术。从名字上我们可以清楚地理解,这个算法基本上是创建了一个有很多树的森林。它是一种有监督的分类算法。
在一般情况下,如果我们在森林中有更多的树木,它会给所有人带来最好的审美吸引力,并被视为最好的森林。随机森林分类器的情况也是如此,树的数量越多,准确率越高,因此它是一个更好的模型。在随机森林中,不会使用在决策树中使用的相同方法,即熵和信息增益。在随机森林中,我们从训练集中抽取随机引导样本。

随机森林的优点:

  • 适合处理大型数据集。
  • 学习速度快,准确率高。
  • 可以一次处理大量变量。
  • 在这个算法中,过拟合不是问题。

随机森林的缺点:

  • 复杂性是一个主要问题。由于该算法创建了许多树并组合其输出以产生最佳输出,因此需要更多的计算时间和资源。
  • 通常用于训练随机森林模型的时间段会更长,因为它会生成大量的树。

并行计算

并行计算基本上是指在同一实例中使用两个或多个内核(或处理器)来解决存在的一个问题。这里的主要目标是将任务分解为更小的子任务并同时完成它们。

一个简单的数学示例将阐明并行计算背后的基本思想:

假设我们有以下表达式要评估:

Z= 7a + 8b + 2c + 3d

其中, a = 1,b = 2,c = 9,d = 5。

没有并行计算的正常过程将是:

第 1 步:输入变量的值。

Z = (7*1) + (8*2) + (2*9) + (3*5)

第 2 步:评估表达式:

Z = 7 + (8*2) + (2*9) + (3*5)

第 3 步:

Z = 7 + 16 + (2*9) + (3*5)

第4步:

Z = 7 + 16 + 18 + (3*5)

第 5 步:

Z = 7 + 16 + 18 + 15

第 6 步:

Z = 56


并行计算场景下相同的表达式求值如下:

第 1 步:输入变量的值。

Z = (7*1) + (8*2) + (2*9) + (3*5)

第 2 步:评估表达式:

Z = 7 + 16 + 18 + 15

第 3 步:

Z = 56

所以我们可以看到上面的差异,在第二种情况下,表达式的评估要快得多。

因此,我采用了雷达数据集。它由总共 35 个属性组成。第 35 个属性是目标变量,即“g”或“b”。这个目标变量主要代表电离层中的自由电子。 “g”代表良好”雷达回波是那些显示电离层中某种类型结构的证据,而“b”代表“坏”回波是那些没有的;它们的信号通过电离层。所以基本上,这是一个二元分类任务。让我们从编码部分开始。

加载所需的库:

library(caret)
library(randomForest)
library(doParallel)

读取数据集:

datafile<-read.csv("C:/Users/prana/Downloads/ionosphere.data.csv")
datafile

将目标变量转换为带有标签 0 和 1 的因子变量。如果有缺失值,还要检查缺失值。

datafile$target0]  
  
set.seed(100)

由于没有缺失值,我们有一个干净的数据集。因此,继续进行模型构建部分。将数据集拆分为 80:20 的比例,即分别为训练集和测试集。

Trainingindex<-createDataPartition(datafile$target, p=0.8, list=FALSE)
trainingset<-datafile[Trainingindex, ]
testingset<-datafile[-Trainingindex, ]

没有并行计算的随机森林的实现

现在我们将正常构建模型并记录其所花费的时间:

start.time<-proc.time()
  
model<-train(target~., data=trainingset, method='rf')
  
stop.time<-proc.time()
  
run.time<-stop.time -start.time
  
print(run.time)

输出:

user  system   elapsed
13.05   0.20     13.62

用并行计算实现随机森林

现在用并行计算概念构建模型,在R中加载do Parallel库(这里我们一开始就已经加载了,所以不需要再次加载它)。我们可以看到函数makePSOCKcluster()创建一组并行运行并通过套接字通信的 R 副本。 stopCluster()在 cl 中停止集群中的引擎节点。我们还将记录通过这种方法构建模型所花费的时间。

cl<-makePSOCKcluster(5)
  
registerDoParallel(cl)
  
start.time<-proc.time()
  
model<-train(target~., data=trainingset, method='rf')
  
stop.time<-proc.time()
  
run.time<-stop.time -start.time
  
print(run.time)
  
stopCluster(cl)

输出:

user  system   elapsed
0.56    0.02      6.19

时差对照表

所以现在制定一个表格,向我们展示这两种方法的时间安排。

因此,从上表中,我们可以得出结论,通过并行计算,建模过程比正常方法快2.200323 (=13.62/6.19)倍。