Поиск более аккуратного рабочего процесса для создания прогнозов и других данных. - PullRequest
0 голосов
/ 31 декабря 2018

Мне интересно, как я могу сделать этот код "аккуратной модели" "чище".

Обычно я подгоняю модель и предоставляю прогнозы в одной функции-обертке, но иногда я хочу передать другие частиданные из подбора или прогнозирования (сама модель, метаданные или подогнанные значения и т. д.).Это список, который возвращается.Какой самый простой способ передать этот результат обратно в виде дополнительных столбцов, по одному на элемент в списке (здесь это yhat_fit и yhat), с конвейером

library(tidymodels)
y_s <- vfold_cv(mtcars, 5)

fit_model <- function(x) {

  model <- lm(mpg ~ hp, data = analysis(x))

  yhat <- predict(model, assessment(x))

  list(yhat_fit = model$fitted.values, yhat = yhat)
}

# this is a problem:
out <- y_s %>% mutate(model = map(y_s$splits, fit_model))
# # A tibble: 5 x 3
# splits         id    model     
# * <list>         <chr> <list>    
#   1 <split [25/7]> Fold1 <list [2]>
#   2 <split [25/7]> Fold2 <list [2]>
#   3 <split [26/6]> Fold3 <list [2]>
#   4 <split [26/6]> Fold4 <list [2]>
#   5 <split [26/6]> Fold5 <list [2]>

Это решение, но яя не уверен, что существует функция, которая уже делает это более чистым способом?

y_s2 <- bind_cols(y_s, as_tibble(transpose(out$model)))
# A tibble: 5 x 4
# splits         id    yhat_fit   yhat     
# <list>         <chr> <list>     <list>   
#   1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
#   2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
#   3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
#   4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
#   5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>

1 Ответ

0 голосов
/ 31 декабря 2018

Похоже, что это один из способов: преобразовать вывод (список элементов) в столбец списка, а затем удалить его.

fit_model2 <- function(x) {

  model <- lm(mpg ~ hp, data = analysis(x))

  yhat <- predict(model, assessment(x))

  tibble(yhat_fit = list(model$fitted.values), yhat = list(yhat))
}


out <- y_s %>% mutate(model = map(y_s$splits, fit_model2)) %>% unnest(model)

# A tibble: 5 x 4
#  splits         id    yhat_fit   yhat     
#  <list>         <chr> <list>     <list>   
#1 <split [25/7]> Fold1 <dbl [25]> <dbl [7]>
#2 <split [25/7]> Fold2 <dbl [25]> <dbl [7]>
#3 <split [26/6]> Fold3 <dbl [26]> <dbl [6]>
#4 <split [26/6]> Fold4 <dbl [26]> <dbl [6]>
#5 <split [26/6]> Fold5 <dbl [26]> <dbl [6]>
...