如何在缺失值填补中使用missRanger的并行计算?

v6ylcynt  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(180)

我用missRanger来估算缺失值,因为我有1000个变量,所以花费的时间太长了。我试图使用并行计算,但它并没有使过程更快。下面是代码

library(doParallel)
cores=detectCores()
cl <- makeCluster(cores[1]-1) 
registerDoParallel(cl)
library(missRanger)
train[1:lengthvar] <- missRanger(train[1:lengthvar], pmm.k = 3, num.trees = 100)
stopCluster(cl)

字符串
我不知道要在代码中添加什么来使它工作。

kqhtkvqz

kqhtkvqz1#

missRanger基于R -ranger中的并行随机森林实现。因此,代码已经在所有内核上运行,像doParallel这样的东西只会让代码变得笨拙。
尝试通过missRanger...参数将相关参数传递给ranger来加快计算速度,例如:

  • num.trees = 20
  • max.depth = 8

而是
免责声明:我是missRanger的作者。

xpszyzbs

xpszyzbs2#

这是多核概念的一个基本示例。这将突出基本概念,而不是着眼于时间问题。通过我的测试运行(对于更大数量的列),非并行版本更快。

library(doParallel)
library(missRanger)
library(data.table) #Needed for rbindlist at the end
cores=detectCores()
cl <- makeCluster(cores[1]) 
registerDoParallel(cl)
clusterEvalQ(cl, {library(missRanger)}) #Passing the package missRanger to all the cores
#Create some random columns
A=as.numeric(c(1,2,"",4,5,6,7,8,9,10,11,12,13,"",15,16,17,18,19,20))
B=as.numeric(c(120.5,128.1,126.5,122.5,127.1,129.7,124.2,123.7,"",122.3,120.9,122.4,125.7,"",128.2,129.1,121.2,128.4,127.6,125.1))
m = as.data.frame(matrix(0, ncol = 10, nrow = 20))
m[,1:5]=A
m[,6:10]=B
list_num=as.data.frame(seq(1,10,by=1)) #A sequence of column numbers for the different cores to run the function for

#Note that the optimal process would have been to take columns 1:3
#and run it on one core, 4:6 to run it on the 2nd core and so on.

#Function to run on the parallel cores

zzz=function(list_num){
  m_new=m[,list_num] #Note the function takes the column number as an argument
  m_new=missRanger(m_new[1:length(m_new)], pmm.k = 3, num.trees = 100)
}

clusterExport(cl=cl, list("m"),envir=environment()) #Export your list
zz=parLapply(cl=cl,fun=zzz,X=list_num) #Pass the function and the list of numbers here
zzzz=data.frame(rbindlist(zz)) #rbind the 
stopCluster(cl)

字符串

6l7fqoea

6l7fqoea3#

mice 3.15.0和更高版本具有提供并行处理的新futuremice()函数。它可用于通过“rf”方法通过ranger::ranger()插补缺失数据。

相关问题