2017-05-05 3 views
0

Je construis des dizaines de modèles prédictifs dans le but d'identifier un modèle champion. Je travaille avec des gigaoctets de données, le suivi du temps d'exécution est donc important. Je souhaite construire tous mes modèles dans un format de type liste, donc je n'ai pas besoin de gérer tous les noms de modèles différents dans l'environnement global. Cependant, il semble que la seule façon d'obtenir des timings par modèle est d'avoir des objets nommés séparés.Gestion de plusieurs modèles et temps d'exécution dans R

Voici une méthode de base que les approches que je suis à la recherche:

library(tidyverse) 

# Basic Approach 

Time_1 <- system.time(
    Model_1 <- lm(am ~ disp, mtcars) 
) 

Time_2 <- system.time(
    Model_2 <- lm(am ~ disp + cyl, mtcars) 
) 

# etc. for dozens more 

Time_List <- 
    mget(ls(pattern = "Time")) %>% 
    bind_rows() 

Cependant, comme vous pouvez le voir, je dois nommer manuellement chaque modèle et un temps record. Ce que je cherche est quelque chose de similaire à la table produite avec le code suivant, où "xxx" est un enregistrement réel de l'exécution.

# Tribble Output 
tribble(
    ~Model_Name, ~Model_Function, ~Run_Time, 
    "Model_1", lm(am ~ disp, mtcars), "xxx", 
    "Model_2", lm(am ~ disp + cyl, mtcars), "xxx" 
) 

# A tibble: 2 × 3 
    Model_Name Model_Function Run_Time 
     <chr>   <list> <chr> 
1 Model_1  <S3: lm>  xxx 
2 Model_2  <S3: lm>  xxx 

J'apprécierais n'importe quelle entrée fournie, indépendamment des paquets utilisés.

Répondre

1

Si vous affectez system.time, vous pouvez enregistrer à la fois l'heure et ce qui est calculé. Si vous attribuez les résultats à une colonne de liste, vous pouvez décompresser:

library(tidyverse) 

data_frame(formula = c(mpg ~ wt, mpg ~ wt + hp)) %>% 
    mutate(model_time = map(formula, ~{ 
       time <- system.time(model <- lm(.x, mtcars)); 
       lst(model, time) 
      }), 
      model = map(model_time, 'model'), 
      time = map(model_time, 'time')) %>% 
    select(-model_time) 
#> # A tibble: 2 × 3 
#>   formula model   time 
#>   <list> <list>   <list> 
#> 1 <S3: formula> <S3: lm> <S3: proc_time> 
#> 2 <S3: formula> <S3: lm> <S3: proc_time> 

Parce que les colonnes sont toutes les listes encore ne ressemble pas beaucoup, mais toutes les données sont là maintenant et peut être extrait plus loin.

Une alternative équivalente:

data_frame(formula = c(mpg ~ wt, mpg ~ wt + hp)) %>% 
    mutate(model_time = map(formula, ~{ 
       time <- system.time(model <- lm(.x, mtcars)); 
       data_frame(model = list(model), 
          time = list(time)) 
      })) %>% 
    unnest(model_time) 
+0

Great! Je ne suis plus au travail, mais je vais enquêter une fois que je reviens. –