tidymodels - error en fit_resamples usando step_ns ()
Estoy tratando de escribir una función que se ajuste a los remuestreos de una receta que usa step_ns (). Por alguna razón, recibo los mensajes de error:
Fold01: recipe: Error: Not all variables in the recipe are present in the supplied training set
y así sucesivamente para todos los pliegues. Y entonces
Mensaje de advertencia: All models failed in [fit_resamples()]. See the .notes column.
Este es mi codigo:
compare_basis_exp_to_base_mod <- function (data, outcome, metric, ...) {
outcome <- rlang::enquo(outcome)
metric <- rlang::enquo(metric)
pred_list <- colnames(data)
outcome_str <- substring(deparse(substitute(outcome)), 2)
outcome_str_id <- which(colnames(data) %in% outcome_str)
predictor <- pred_list[-outcome_str_id]
data <- data %>%
rename(prediction = !!outcome)
res <- tibble(splits = list(), id = character(), .metrics = list(),
.notes = list(), .predictions = list(), pred = character())
rec_without_splines <- recipe(prediction ~ ., data = data) %>%
prep()
rec_with_splines <- recipe(prediction ~ ., data = data) %>%
step_ns(all_predictors(), ...) %>%
prep()
folds_without_splines <- vfold_cv(juice(rec_without_splines), strata = prediction)
folds_with_splines <- vfold_cv(juice(rec_with_splines), strata = prediction)
mod <- linear_reg() %>%
set_engine("lm")
mod_without_splines <- fit_resamples(mod,
rec_without_splines,
folds_without_splines,
metrics = metric_set(!!metric),
control = control_resamples(save_pred = TRUE)) %>%
mutate(pred = "no_splines")
mod_with_splines <- fit_resamples(mod,
rec_with_splines,
folds_with_splines,
metrics = metric_set(!!metric),
control = control_resamples(save_pred = TRUE)) %>%
mutate(pred = "with_splines")
res <- mod_without_splines %>%
bind_rows(mod_with_splines)
return (res)
}
Básicamente, el argumento datatoma una tabla de dos columnas y outcomees el nombre de la columna de resultados. Aparte del uso de esta función (solo estoy jugando con tidymodels aquí porque soy nuevo en esto), solo quiero entender qué está causando este error y cómo solucionarlo. El error viene a la hora de evaluar mod_with_splines.
Aquí se encontró un problema similar . Pero no sé si se relaciona con mi problema. No puedo dejar de preparar la receta antes de pasársela fit_resamples. (O eso creo)
Cualquier ayuda sería apreciada. Gracias.
Respuestas
Su problema proviene de intentar aplicar una receta en un conjunto de datos que ya se ha ejecutado con esa misma receta.
Si asumimos que las variables predictoras fueron X1y X2, entonces rec_with_splinesse esperan esas variables. Pero ya que folds_with_splinescontiene los resultados en jugo de rec_with_splinesentonces folds_with_splinesen realidad contiene X1_ns_1, X1_ns_2, X2_ns_1, y X2_ns_2. No X1y X2.
Sugeriría usar flujos de trabajo para combinar el paso de preprocesamiento y modelado. Y para pasar los datos sin procesar a vfold_cv().
library(tidymodels)
compare_basis_exp_to_base_mod <- function (data, outcome, metric, ...) {
outcome <- rlang::enquo(outcome)
metric <- rlang::enquo(metric)
pred_list <- colnames(data)
outcome_str <- substring(deparse(substitute(outcome)), 2)
outcome_str_id <- which(colnames(data) %in% outcome_str)
predictor <- pred_list[-outcome_str_id]
data <- data %>%
rename(prediction = !!outcome)
rec_without_splines <- recipe(prediction ~ ., data = data) %>%
prep()
rec_with_splines <- recipe(prediction ~ ., data = data) %>%
step_ns(all_predictors(), ...)
mod <- linear_reg() %>%
set_engine("lm")
wf_without_splines <- workflow() %>%
add_recipe(rec_without_splines) %>%
add_model(mod)
wf_with_splines <- workflow() %>%
add_recipe(rec_with_splines) %>%
add_model(mod)
data_folds <- vfold_cv(data, strata = prediction)
mod_without_splines <- fit_resamples(wf_without_splines,
data_folds,
metrics = metric_set(!!metric),
control = control_resamples(save_pred = TRUE)) %>%
mutate(pred = "no_splines")
mod_with_splines <- fit_resamples(wf_with_splines,
data_folds,
metrics = metric_set(!!metric),
control = control_resamples(save_pred = TRUE)) %>%
mutate(pred = "with_splines")
res <- mod_without_splines %>%
bind_rows(mod_with_splines)
return (res)
}
res <- compare_basis_exp_to_base_mod(mtcars, mpg, rmse)