Как использовать параллельные вычисления для missRanger при вменении пропущенных значений? - PullRequest
0 голосов
/ 06 мая 2019

Я вменяю пропущенные значения на 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)

Я не уверен, что добавить к этому коду, чтобы он работал.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

missRanger основан на параллельной реализации случайного леса в R - ranger. Таким образом, код уже работает на всех ядрах, и такие вещи, как doParallel, просто делают код неуклюжим.

Попробуйте ускорить вычисления, передав соответствующие аргументы в ranger через ... аргумент missRanger, например,

  • num.trees = 20 или

  • max.depth = 8

вместо.

Отказ от ответственности: я автор missRanger.

0 голосов
/ 07 мая 2019

Это базовый пример концепции нескольких ядер. Это будет выдвигать на первый план основную концепцию вместо того, чтобы смотреть на проблему времени. По моим тестам (для большего числа столбцов), непараллельная версия работает быстрее.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...