Как я могу запустить несколько регрессионных моделей одновременно (на разных данных) с помощью clusterMap? - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно запустить два разных регрессионных анализа для четырех разных наборов данных (каждого), всего восемь моделей. При использовании обычной parLapply -функции нижеприведенные результаты показывают время, затраченное на работу на ядро, модель и набор данных:

                                  Core 1          Core 2          Core 3         Core 4 
                                  Dataset 1       Dataset 2       Dataset 3      Dataset 4           
Regression model 1                31 min          48 min          2 h 26 min     3 h 16 min

                                  Core 1          Core 2          Core 3         Core 4
                                  Dataset 5       Dataset 6       Dataset 7      Dataset 8
Regression model 2                8 min           14 min          24 min         55 min

Как видите, подавляющее большинство времени ЦП используется регрессионная модель 1 с набором данных 4. Если бы мы могли только передавать дополнительную работу другим ядрам во время вычисления этой модели, мы могли бы сократить общее время до 3 часов 16 минут.

Обычно это требует распараллеливания задач с использованием функции mcapply, но я думаю, что нашел способ обойти это. Модель регрессии 1 и модель регрессии 2 очень похожи, как показано ниже (для аргумента данных установлено значение x для использования с parLapply):

regression_model_1<-function(x){glm(
        totstatus_bin~.
        -Examen
        -PERC_CREDIT
        -CREDITS
        -NYA_REGION_GROV_FYRSTADSOMRÅDET
        -lär_mell
        -gymnasie_mergrov_samhälle_ekonomi
        -urvalsgrupp_betyg,
    data=x,family=binomial)%>%
        stepAIC(trace = FALSE)}


regression_model_2<-function(x){glm(
        Examen~.
        -totstatus_bin
        -PERC_CREDIT
        -CREDITS
        -NYA_REGION_GROV_FYRSTADSOMRÅDET
        -lär_mell
        -gymnasie_mergrov_samhälle_ekonomi
        -urvalsgrupp_betyg,
    data=x,family=binomial)%>%
        stepAIC(trace = FALSE)}

Единственное различие между моделями - это размещение totstatus_bin и Экзамен-аргументы. Теоретически я должен иметь возможность передавать эти аргументы через clusterMap, использовать динамическую c балансировку нагрузки и заставить мой процессор работать со всеми моделями одновременно.

Я указываю следующую комбинированную модель регрессии:

reg_avhopp_examen<-function(x,dependent,skipped_independent){glm(
    dependent~.
    -skipped_independent
    -PERC_CREDIT
    -CREDITS
    -NYA_REGION_GROV_FYRSTADSOMRÅDET
    -gymnasie_mergrov_samhälle_ekonomi
    -lär_mell
    -ADMISSIONROUND_ID_HT2019
    -urvalsgrupp_betyg,
data=x,family=binomial)%>%
    stepAIC(trace = FALSE)}

Мы определяем наш список наборов данных:

data_examen_avhopp<-list(
"EnkelAnalysMaSv"=EnkelAnalysMaSv,
"EnkelAnalysMa"=EnkelAnalysMa,
"EnkelAnalysSv"=EnkelAnalysSv,
"EnkelAnalys"=EnkelAnalys,
"EnkelAnalysExamenCom"=EnkelAnalysExamenCom,
"EnkelAnalysExamenComMa"=EnkelAnalysExamenComMa,
"EnkelAnalysExamenComSv"=EnkelAnalysExamenComSv,
"EnkelAnalysExamenComMaSv"=EnkelAnalysExamenComMaSv)

И, наконец, мы пытаемся определить наш вызов clusterMap и экспортировать соответствующую информацию рабочим. Я немного не уверен, как именно передать вектор переменных в регрессионную модель, но я пытаюсь сделать следующее:

cl<-makeCluster(4)
clusterEvalQ(cl, library("dplyr"))
clusterEvalQ(cl, library("MASS"))
clusterExport(cl,"reg_avhopp_examen")
models_avhopp_examen<-clusterMap(cl,reg_avhopp_examen,data_examen_avhopp,dependent=list(
        data_examen_avhopp$EnkelAnalysMaSv$totstatus_bin,
        data_examen_avhopp$EnkelAnalysMa$totstatus_bin,
        data_examen_avhopp$EnkelAnalysSv$totstatus_bin,
        data_examen_avhopp$EnkelAnalys$totstatus_bin,
        data_examen_avhopp$EnkelAnalysExamenCom$Examen,
        data_examen_avhopp$EnkelAnalysExamenComMa$Examen,
        data_examen_avhopp$EnkelAnalysExamenComSv$Examen,
        data_examen_avhopp$EnkelAnalysExamenComMaSv$Examen),
skipped_independent=list(
        data_examen_avhopp$EnkelAnalysMaSv$Examen,
        data_examen_avhopp$EnkelAnalysMa$Examen,
        data_examen_avhopp$EnkelAnalysSv$Examen,
        data_examen_avhopp$EnkelAnalys$Examen,
        data_examen_avhopp$EnkelAnalysExamenCom$totstatus_bin,
        data_examen_avhopp$EnkelAnalysExamenComMa$totstatus_bin,
        data_examen_avhopp$EnkelAnalysExamenComSv$totstatus_bin,
        data_examen_avhopp$EnkelAnalysExamenComMaSv$totstatus_bin),.scheduling=c("dynamic"))
stopCluster(cl)

Идея состоит в том, что для первых четырех моделей skipped_independent звучит так: «Examen "и зависимым является" totstatus_bin ", для последних четырех моделей должно применяться противоположное.

Процессорное время для этой модели, однако, мизерное, общее время намного больше, чем у метода с parLapply:

                                  Core 1          Core 2          Core 3         Core 4 

Regression model_combined         2 h 15 min      2 h 29 min      3 h 56 min     6 h 23 min

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

> summary(models_avhopp_examen$EnkelAnalys)

Call:
glm(formula = dependent ~ totstatus_bin, family = binomial, data = x)

Deviance Residuals: 
       Min          1Q      Median          3Q         Max  
-2.409e-06  -2.409e-06   2.409e-06   2.409e-06   2.409e-06  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept)     -26.57    7880.86  -0.003    0.997
totstatus_bin    53.13   10390.34   0.005    0.996

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 6.5559e+03  on 4807  degrees of freedom
Residual deviance: 2.7894e-08  on 4806  degrees of freedom
AIC: 4

Number of Fisher Scoring iterations: 25

Возможна ли моя цель (запускать регрессионные модели с разными аргументами на разных ядрах, используя clusterMap), и если да, то как мне go передать правильные аргументы регрессионного анализа в clusterMap ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...