J'essaye de former plusieurs modèles caret
à partir d'un format de colonne de liste dans R (voir: this blog post) en utilisant purrr::invoke_map()
.Surveiller la progression/Imprimer sur la console à partir de purrr :: invoke_map()
Lorsque j'appelle invoke_map()
, j'aimerais pouvoir suivre la progression d'une manière ou d'une autre. Spécifiquement, je voudrais imprimer le numéro de ligne, ou la colonne id
en tant que invoke_map()
itère à travers les combinaisons modèle/données. Y at-il un moyen de le faire, éventuellement en modifiant la fonction d'entraînement (linearRegModel()
ci-dessous)?
library(tidyverse)
library(mlbench)
library(caret)
data("BostonHousing") # from mlbench
starter_df <-
list(BostonHousing) %>%
rep(3) %>%
enframe(name = 'id', value = 'rawdata') %>%
transmute(
id
, train.X = map(rawdata, ~ .x %>% select(-medv))
, train.Y = map(rawdata, ~ .x$medv)
)
# re-write any caret training method as a function.
# using linear regression here for simplicity
linearRegModel <- function(X, Y) {
ctrl <- trainControl(
method = "repeatedcv",
number = 2
)
train(
x = X,
y = Y,
method = 'lm',
trControl = ctrl,
preProc = c('center', 'scale')
)
}
# convert models to tibble
model_list <-
list(linearRegModel = linearRegModel,
linearRegModel2 = linearRegModel) %>%
enframe(name = 'modelName',value = 'model')
# combine model tibble with the data tibble
train_df <-
starter_df[rep(1:nrow(starter_df),nrow(model_list)),] %>%
bind_cols(
model_list[rep(1:nrow(model_list),nrow(starter_df)),] %>% arrange(modelName)
) %>%
mutate(id=1:nrow(.))
train_df
# A tibble: 6 x 5
id train.X train.Y modelName model
<int> <list> <list> <chr> <list>
1 1 <data.frame [506 x 13]> <dbl [506]> linearRegModel <fun>
2 2 <data.frame [506 x 13]> <dbl [506]> linearRegModel <fun>
3 3 <data.frame [506 x 13]> <dbl [506]> linearRegModel <fun>
4 4 <data.frame [506 x 13]> <dbl [506]> linearRegModel2 <fun>
5 5 <data.frame [506 x 13]> <dbl [506]> linearRegModel2 <fun>
6 6 <data.frame [506 x 13]> <dbl [506]> linearRegModel2 <fun>
# train models by calling invoke_map()
# (takes a few seconds)
data_with_model_fits <-
train_df %>%
mutate(params = map2(train.X, train.Y, ~ list(X = .x, Y = .y)),
modelFits = invoke_map(model,params)
)
Merci! Cela résout le problème et en utilisant le jeton je peux imprimer les modèles individuels comme ils sont exécutés. –