Tidymodels

¿Porqué tidymodels?

Tidymodels es en realidad un conjunto de paquetes de R que, al igual que Tidyverse, busca unificar la sintaxis y modo de uso al alrededor del modelado estadístico de datos. A diferencia de Tidyverse, Tidymodels no implementa nuevas maneras de, por ejemplo, aplicar el modelo lineal, si no que genera una interfaz única a partir de la cual utilizar las funciones que ya existen. De la misma manera, la salida que genera es consistente a lo largo de distintos modelos e implementaciones, y mejor aún en formato tidy.

Los principales paquete de Tidymodels

rsample Para dividir y hacer remuestreo de los datos
recipes Preprocesamiento de los datos de manera ordenada y reproducible
parsnip Interfaz unificada para modelar datos
workflows Organiza el preprocesamiento, el modelado y postprocesa
yardstick Mide la efectividad de los modelos
broom Resume la salida de modelos en formato tidy

pero hay muchos otros con objetivos específicos que completan el universo de tidymodels.

El proceso de modelado de datos

  • Cómo aprovechar los datos: es importante hacer un “presupuesto” para planificar cómo vamos a usar los datos. Necesitamos dividir los datos en (al menos) entrenamiento y testeo. Usaremos rsample para esta tarea.

  • Qué modelo utilizar: la mayoría de las veces no sabremos cual es el mejor modelo a aplicar, dependerá en parte de nuestro objetivo: queremos hacer describir, hacer inferencias o predecir a partir de los datos?

  • La verificación: es importante hacer una verificación tanto cualitativa (visual) como cuantitativa con los el subset de testeo, pero nunca con los datos de entrenamiento!

El proceso de modelado

Datos de cultivos

cultivos <- read_csv("https://raw.githubusercontent.com/paocorrales/intro-tidymodels-agro/main/datos/cultivos.csv")
head(cultivos)  %>%
  gt::gt()
floracion_dias altura_cm densidad_sem rendimiento aceite_porcentaje campania tipo_ensayo epoca distancia_entre_surcos tipo_siembra testigo visible cultivar
35 151 39870 2566 36.70 2006-2007 Convencional Normal 70 Convencional NO SI PROTON ER 301
48 165 69650 2006 39.85 2007-2008 Convencional Normal 52 Directa NO SI AGROBEL 963
48 160 53115 1787 44.88 2007-2008 Convencional Normal 52 Directa NO SI PARAISO 55
48 185 71319 2138 40.67 2007-2008 Convencional Normal 52 Directa NO SI PARAISO 22
48 185 55153 2383 37.94 2007-2008 Convencional Normal 52 Directa NO SI KWSOL TROPEL
49 155 53571 3167 45.70 2010-2011 Convencional Normal 52 Directa NO SI DEKASOL 3910 CL

La variable a predecir: aceite_porcentaje

cultivos %>% 
  ggplot(aes(aceite_porcentaje)) +
  geom_histogram(color = "white") +
  geom_rug(alpha = 0.1)

El paso a paso

El presupuesto de datos

set.seed(91)
cultivos_split <- initial_split(cultivos, 
                           prop = 3/4)

cultivos_train <- training(cultivos_split)
cultivos_test <- testing(cultivos_split)

La receta: preparación de los datos

receta_aceite <- 
  recipe(aceite_porcentaje ~ ., data = cultivos_train) %>% 
  step_dummy(all_factor_predictors()) %>% 
  step_zv(all_predictors()) %>% 
  step_interact(~ starts_with("densidad_sem"):starts_with("tipo_siembra")) %>% 
  step_normalize(all_numeric_predictors())

El modelo

modelo_lineal <- 
  linear_reg() %>% 
  set_engine("lm")

El workflow

wflow_lm <- 
  workflow() %>% 
  add_model(modelo_lineal) %>% 
  add_recipe(receta_aceite)

“Entrenamos el modelo”

modelo_fit <- fit(wflow_lm, data = cultivos_train)

El modelo hace predicciones

mean_predict <- predict(modelo_fit, new_data = cultivos_test) 

aceite_predic <- 
  cultivos_test %>% 
  bind_cols(mean_predict) 

ggplot(aceite_predic, aes(aceite_porcentaje, .pred)) +
  geom_abline(slope = 1, intercept = 0, color = "darkorange") +
      geom_point(alpha = 0.1) +
  geom_smooth(method = "lm") +
  labs(x = "Observado", y = "Predicho") +
  coord_equal(xlim = c(29,60), ylim = c(29, 60))
rmse(aceite_predic, aceite_porcentaje, .pred)$.estimate #Error cuadrático medio
[1] 3.07577