tidymodels
Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
tidymodels
es una colección de paquetes para el proceso de modelización (NO implementa modelos) con los principios de tidyverse
Otros paquetes “similares”: mlr3
, caret
, H2O
tidymodels
se llama vetiver
en python
NO usamos todos los datos para estimar
initial_split()
: particionar los datos en prueba y entrenamiento.
primer argumento: datos (se pasa por tubería %>%
)
segundo argumento: proporción de datos dedicados a entrenamiento
tidymodels
crea objetos (listas) con toda la información y ofrece funciones para acceder a ellatraining()
y testing()
acceden a cada submuestraAunque ya hemos limpiado los datos de forma general, podemos considerar transformaciones específicas para algunas estimaciones
Algunos modelos necesitan que las variables sean transformadas de una forma concreta (ej., estandarizar)
Incluso para un mismo modelo, podemos considerar diferentes especificaciones diferentes: sin usar NA
o imputándolos, usando distintas variables (ej., con o sin interacciones)
Para un modelo concreto, podemos realizar cambios (como en tidyverse
): step_select()
, step_filter()
, step_mutate()
, …
step_log()
¿Cómo tratar los valores ausentes en este modelo?
elimina las observaciones con valores ausentes: step_naomit()
imputar los valores ausentes de los predictores: step_impute_mean()
, step_impute_linear()
, step_impute_knn()
, etc..
step_center()
, varianza uno, step_scale()
, o ambas step_normalize()
step_poly()
, y discretizar, step_cut()
Para variables cualitativas, podemos agrupar categorías poco frecuentes: step_other()
En general, tidymodels
exige crear explícitamente variables binarias (dummy) para las categorías de las variables cualitativas: step_dummy()
one_hot = TRUE
NOTA: algunas fuentes (ej., chatGPT) sugieren eliminar variables con poca variabilidad, step_zv()
y step_nzv()
, o con alta correlación, step_corr()
. Esto NO es estrictamente necesario para ningún modelo
Las interacciones también funcionan de forma diferente en tidymodels
Para variables cuantitativas, x1 y x2, step_interact(~ x2:x1)
añade solo una nueva variable: la inteacción x2:x1
step_interact(~ (x2 + x3):x1)
creamos múltiples interaccionesPara variables binarias, step_interact(~ d1:d2)
añade la interacción
Para variables cualitativas, hemos debido crear antes las dummies. Para evitar escribir manualmente cada combinación podemos usar start_with()
:
step_interact(~ starts_with("F1"):x1)
para una variable categórica F1 y una continua x1
step_interact(~ starts_with("F1_"):starts_with("F2_"))
para dos variables categóricas F1 y F2
TODOS los pasos se pueden aplicar a una variable o varias con all_outcomes()
, all_predictors()
, all_numeric()
, all_nominal()
, all_nominal_predictors()
, all_numeric_predictors()
, all_of(c("var1", "var2")
, contains()
, etc.
prep()
ararse y aplicar las transformaciones con juice()
o bake()
(veremos otra alternativa más general)tidymodels
define un modelo de un tipo con una interfaz unificada para distintas bibliotecas Una función que define el tipo de modelo, con argumentos específicos de ese modelo (la lista de funciones/modelos aquí)
Se fija el tipo de problema (mode): regresión o clasificación
Se establece la biblioteca (engine) con la que se implementará
fit()
workflow()
update_recipe()
, update_model()
, etc.kable()
)censo <- read_csv("data/census.csv") %>% select(-1) %>%
mutate(across(where(is.character),~as.factor(.x)))
set.seed(8697)
censoPart <- censo %>% initial_split(prop = .8)
receta_log1 <- training(censoPart) %>%
recipe(income ~ age + education_1 + capital_gain)
modelo_log1 <- logistic_reg(mode= "classification", engine = "glm",
penalty = 0)
flujo_log1 <- workflow() %>%
add_recipe(receta_log1) %>%
add_model(modelo_log1)
flujo_log1_est <- flujo_log1 %>%
fit(data = censoPart %>% training())
La función predict()
(de parsnip
) tiene dos argumentos principales: un flujo de trabajo estimado y un conjunto de datos (nuevo como los datos de prueba u otros valores)
El flujo estimado almacena la receta para transformar los datos
También contiene los resultados de la estimación (“parámetros” del modelo) que se aplican a los datos transformados para predecir
Devuelve un conjunto de datos (tibble) con predicciones:
type = "numeric"
, por defecto), intervalos de confianza (type = "conf_int"
), etc.type = "class"
, por defecto), las probabilidades de cada categoría (type = "prob"
)last_fit()
ajusta el flujo en los datos de entrenamiento y obtiene predicciones en los de prueba, para calcular las métricas (ver listado):vfold_cv()
para crear particionesEl flujo de trabajo puede ser el mismo que ya hemos visto
La estimación del modelo se realiza usando fit_resamples()
En una se ajusta el modelo dado un valor del hiperparámetro
En la otra se mide el error asociado a cada valor para elegir el hiperparámetro con mejor métrica
\(\Downarrow\)
Usamos una partición de initial_split() y la misma receta anterior (aunque no era necesario antes, el pre-procesado ya estandarizaba los regresores)
En la definición del modelo debemos identificar los hiperparámetros a ajustar
grid_regular()
buscamos en un intervalo un número de valores (otras opciones aquí)tune_grid()
de forma a similar a fit_resamples(), usando una sub-partición de la muestra de entrenamiento por validación cruzadalast_fit()