2016-01-18 2 views
1

Я пытаюсь обучить нейронную сеть для прогнозирования оттока с нейронной сетью R. Вот код:R neuralnet пакет слишком медленный для миллионов записей

data <- read.csv('C:/PredictChurn.csv') 
maxs <- apply(data, 2, max) 
mins <- apply(data, 2, min) 
scaled_temp <- as.data.frame(scale(data, center = mins, scale = maxs - mins)) 
scaled <- data 
scaled[, -c(1)] <- scaled_temp[, -c(1)] 
index <- sample(1:nrow(data),round(0.75*nrow(data))) 
train_ <- scaled[index,] 
test_ <- scaled[-index,] 
library(neuralnet) 
n <- names(train_[, -c(1)]) 
f <- as.formula(paste("CHURNED_F ~", paste(n[!n %in% "CHURNED_F"], collapse = " + "))) 
nn <- neuralnet(f,data=train_,hidden=c(5),linear.output=F) 

Он работает, как должно, однако при обучении с полным набором данных (в диапазоне миллионов строк) он просто занимает слишком много времени. Поэтому я знаю, что R по умолчанию однопоточный, поэтому я попытался исследовать, как распараллелить работу во всех ядрах. Возможно ли сделать эту функцию параллельно? Я пробовал различные пакеты без успеха.

Кто-нибудь мог это сделать? Это не должен быть пакет neuralnet, любое решение, которое позволяет мне тренировать нейронную сеть, будет работать.

Спасибо

+0

мой ответ ниже полезным для Вас? –

+0

Попробуйте использовать библиотеку BLAS в качестве бэкэнд, например, Intel MKL. – Patric

ответ

1

Я имел хороший опыт работы с пакетом Rmpi, и он может быть применим в вашем случае тоже.

library(Rmpi) 

Вкратце, его использование выглядит следующим образом:

nproc = 4 # could be automatically determined 
# Specify one master and nproc-1 slaves 
Rmpi:: mpi.spawn.Rslaves(nslaves=nproc-1) 
# Execute function "func_to_be_parallelized" on multiple CPUs; pass two variables to function 
my_fast_results = Rmpi::mpi.parLapply(var1_passed_to_func, 
             func_to_be_parallelized, 
             var2_passed_to_func) 
# Close slaves 
Rmpi::mpi.close.Rslaves(dellog=T) 
+0

Спасибо за подсказку. Но я получаю сообщение об ошибке при использовании библиотеки Rmpi, говорящей, что msmpi.dll отсутствует. Также, как бы вы написали команду, это нормально: my_fast_results = Rmpi ​​:: mpi.parLapply (neuralnet (f, data = train_, hidden = c (5), linear.output = F)) – Fermin

+0

@Aulait Ошибка, которую вы получение относительно отсутствующей библиотеки динамических ссылок (.dll) указывает на некоторые недостающие или устаревшие зависимости. Я установил/обновил Rmpi ​​с флагом зависимостей, установленным в true: 'install.packages (" Rmpi ​​", dependencies = TRUE)'. –

+0

@Aulait Правильный синтаксис команды _mpi.parLapply() _, вероятно, будет следующим: 'mpi.parLapply (f, neuralnet, train_, c (5), FALSE)'. Да, первый аргумент, переданный функции _neuralnet() _, является первым аргументом _mpi.parLapply() _. –

Смежные вопросы