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)倍。