【发布时间】:2020-07-13 06:05:18
【问题描述】:
我需要通过多线程加速 for 循环。我想为此使用库:foreach 和 doParallel。我以前使用过这些包,但仅用于需要一个结果表的过程。我不知道如何使用它们来导出多个表(这里是结果表)。我的问题要复杂得多,需要导出许多结果集。在这里,为简单起见,我使用虹膜数据。
library(randomForest)
library(caret)
results_class <- data.frame()
results_overall <- data.frame()
for(i in 1:50){
trainIndex <- caret::createDataPartition(iris$Species, p = 0.5, list = FALSE)
irisTrain <- iris[ trainIndex,]
irisTest <- iris[-trainIndex,]
model <- randomForest(x = irisTrain[,c(1:4)], y = irisTrain[,5], importance = TRUE,
replace = TRUE, mtry = 4, ntree = 500, na.action=na.omit,
do.trace = 100, type = "classification")
pred_test <- predict(model, irisTest[,c(1:4)])
con.mat_test <- confusionMatrix(pred_test, irisTest[,5], mode ="everything")
results_class <- rbind(results_class, con.mat_test[["byClass"]])
results_overall <- rbind(results_overall, con.mat_test[["overall"]])
}
【问题讨论】:
-
我知道
.multicombine与单个.combine结合使用。 -
首先,确保更新到 foreach 1.5.0(2020 年 3 月 30 日发布),因为它使顺序和并行进程在
local()环境中评估 foreach 表达式。这进一步降低了错误/误解的风险,尤其是“希望”在循环内完成的任务最终在外面 - 他们不能也不会(也不应该) -
其次,请参阅我 2019 年 1 月 11 日的博客文章“通过将 For-Loop 重写为 Lapply 调用来并行化 For-Loop”(jottr.org/2019/01/11/…),了解如何将 for 循环转换为 ay
标签: r foreach parallel-processing doparallel