3 - Las partes de un modelo

Introducciendo Tidymodels

Tu turno

¿Como ajustar un modelo linear en R?

¿De cuantas maneras sabes como ajustar este tipo de modelo?

03:00
  • lm para regresión linear

  • glm para regresión linear generalizada

  • glmnet para regresión regularizada

  • keras para regresión dentro de Tensorflow

  • stan para regresión bayensiana

  • spark para datos “grandes”

Para especificar un modelo

  • Elije un modelo
  • Especifica el “motor”
  • Establece el modo

Para especificar un modelo

logistic_reg()
#> Logistic Regression Model Specification (classification)
#> 
#> Computational engine: glm

Para especificar un modelo

  • Elije un modelo
  • Especifica el “motor”
  • Establece el modo

Para especificar un modelo

logistic_reg() %>%
  set_engine("glmnet")
#> Logistic Regression Model Specification (classification)
#> 
#> Computational engine: glmnet

Para especificar un modelo

logistic_reg() %>%
  set_engine("stan")
#> Logistic Regression Model Specification (classification)
#> 
#> Computational engine: stan

Para especificar un modelo

  • Elije un modelo
  • Especifica el “motor”
  • Establece el modo

Para especificar un modelo

decision_tree()
#> Decision Tree Model Specification (unknown mode)
#> 
#> Computational engine: rpart

Para especificar un modelo

decision_tree() %>% 
  set_mode("classification")
#> Decision Tree Model Specification (classification)
#> 
#> Computational engine: rpart



El listado de modelos se encuentra aquí: https://www.tidymodels.org/find/parsnip/

To specify a model

  • Elije un modelo
  • Especifica el “motor”
  • Establece el modo

Tu turno

Corre el “chunk” arbol_espec en tu archivo .qmd.

Cambia el código para que utilize una regresión linear

El listado de modelos se encuentra aquí: https://www.tidymodels.org/find/parsnip/



Reto: Edita el código para usar otro tipo de modelo. Por ejemplo, trata de usar el árbol disponible dentro del paquete partykit, o trata un modelo de tipo diferente

05:00

Los modelos que usaremos hoy

  • Regresión logística
  • Arboles de decisión

Regresión logística

Regresión logística

Regresión logística

  • El logit del la probabilidad del resultado

\(log(\frac{p}{1 - p}) = \beta_0 + \beta_1\cdot \text{A}\)

  • Calcular la línea de sigmoideo que separan las dos clases

Arboles de decisión

Arboles de decisión

  • El resultado es decidido usando una serie de decisiones basados en las variables predictivas

  • Primero, el arbol crece hasta que se llega a una decision

  • Después, el arbol es recortado para que no sea tan complejo

Arboles de decisión

Todos los modelos están equivocados, pero algunos pueden ser utíl

Regresión logística

Arboles de decisión

El flujo de trabajo de un modelo

Los flujos de trabajo combinan el “preprocesamiento” y el modelo

flowchart LR
  dt[Datos]
  pr[Predictores]
  subgraph fl[Flujo del modelo]
    pca[PCA]
    ls[Menos cuadrados]
    pca-->ls
  end
  dt-->fl
  pr-->fl
  ft[Modelo ajustado]
  fl-->ft
  style fl fill:#fff,stroke:#666,color:#000

¿Que no está bien en este flujo?

flowchart LR
  dt[Datos]
  pr[Predictores]
  pca[PCA]
  subgraph fl[Flujo del modelo]
    ls[Menos cuadrados]
  end
  pca-->fl
  dt-->pca
  pr-->pca
  ft[Modelo ajustado]
  fl-->ft
  style fl fill:#fff,stroke:#666,color:#000

¿Por que utilizar workflow()?

  • workflow maneja nuevos niveles factoriales mejor que las herramientas regulares de R
  • Puedes utilizar “preprocesadores” que no son formulas
  • Ayudan a organizar un proyecto que utiliza varios modelos
  • Aún más importante, un flujo de workflow encaja todo el processo de modelamiento, desde la creación (fit()) del modelo, hasta el uso del modelo (predict())

El flujo de trabajo de un modelo

arbol_espec <-
  decision_tree(cost_complexity = 0.002) %>% 
  set_mode("classification")

arbol_espec %>% 
  fit(propina ~ ., data = taxi_entrenar) 
#> parsnip model object
#> 
#> n= 8000 
#> 
#> node), split, n, loss, yval, (yprob)
#>       * denotes terminal node
#> 
#>  1) root 8000 616 si (0.92300000 0.07700000)  
#>    2) distancia>=14.12 2041  68 si (0.96668300 0.03331700) *
#>    3) distancia< 14.12 5959 548 si (0.90803826 0.09196174)  
#>      6) distancia< 5.275 5419 450 si (0.91695885 0.08304115) *
#>      7) distancia>=5.275 540  98 si (0.81851852 0.18148148)  
#>       14) compania=Chicago Independents,City Service,otra,Sun Taxi,Taxi Affiliation Services,Taxicab Insurance Agency Llc 478  68 si (0.85774059 0.14225941) *
#>       15) compania=Flash Cab 62  30 si (0.51612903 0.48387097)  
#>         30) dia=Jue 12   2 si (0.83333333 0.16666667) *
#>         31) dia=Lun,Mar,Mie,Vie,Sab,Dom 50  22 no (0.44000000 0.56000000)  
#>           62) distancia>=11.77 14   4 si (0.71428571 0.28571429) *
#>           63) distancia< 11.77 36  12 no (0.33333333 0.66666667) *

El flujo de trabajo de un modelo

arbol_espec <-
  decision_tree(cost_complexity = 0.002) %>% 
  set_mode("classification")

workflow() %>%
  add_formula(propina ~ .) %>%
  add_model(arbol_espec) %>%
  fit(data = taxi_entrenar) 
#> ══ Workflow [trained] ════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: decision_tree()
#> 
#> ── Preprocessor ──────────────────────────────────────────────────────
#> propina ~ .
#> 
#> ── Model ─────────────────────────────────────────────────────────────
#> n= 8000 
#> 
#> node), split, n, loss, yval, (yprob)
#>       * denotes terminal node
#> 
#>  1) root 8000 616 si (0.92300000 0.07700000)  
#>    2) distancia>=14.12 2041  68 si (0.96668300 0.03331700) *
#>    3) distancia< 14.12 5959 548 si (0.90803826 0.09196174)  
#>      6) distancia< 5.275 5419 450 si (0.91695885 0.08304115) *
#>      7) distancia>=5.275 540  98 si (0.81851852 0.18148148)  
#>       14) compania=Chicago Independents,City Service,otra,Sun Taxi,Taxi Affiliation Services,Taxicab Insurance Agency Llc 478  68 si (0.85774059 0.14225941) *
#>       15) compania=Flash Cab 62  30 si (0.51612903 0.48387097)  
#>         30) dia=Jue 12   2 si (0.83333333 0.16666667) *
#>         31) dia=Lun,Mar,Mie,Vie,Sab,Dom 50  22 no (0.44000000 0.56000000)  
#>           62) distancia>=11.77 14   4 si (0.71428571 0.28571429) *
#>           63) distancia< 11.77 36  12 no (0.33333333 0.66666667) *

El flujo de trabajo de un modelo

arbol_espec <-
  decision_tree(cost_complexity = 0.002) %>% 
  set_mode("classification")

workflow(propina ~ ., arbol_espec) %>% 
  fit(data = taxi_entrenar) 
#> ══ Workflow [trained] ════════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: decision_tree()
#> 
#> ── Preprocessor ──────────────────────────────────────────────────────
#> propina ~ .
#> 
#> ── Model ─────────────────────────────────────────────────────────────
#> n= 8000 
#> 
#> node), split, n, loss, yval, (yprob)
#>       * denotes terminal node
#> 
#>  1) root 8000 616 si (0.92300000 0.07700000)  
#>    2) distancia>=14.12 2041  68 si (0.96668300 0.03331700) *
#>    3) distancia< 14.12 5959 548 si (0.90803826 0.09196174)  
#>      6) distancia< 5.275 5419 450 si (0.91695885 0.08304115) *
#>      7) distancia>=5.275 540  98 si (0.81851852 0.18148148)  
#>       14) compania=Chicago Independents,City Service,otra,Sun Taxi,Taxi Affiliation Services,Taxicab Insurance Agency Llc 478  68 si (0.85774059 0.14225941) *
#>       15) compania=Flash Cab 62  30 si (0.51612903 0.48387097)  
#>         30) dia=Jue 12   2 si (0.83333333 0.16666667) *
#>         31) dia=Lun,Mar,Mie,Vie,Sab,Dom 50  22 no (0.44000000 0.56000000)  
#>           62) distancia>=11.77 14   4 si (0.71428571 0.28571429) *
#>           63) distancia< 11.77 36  12 no (0.33333333 0.66666667) *

Tu turno

Corre el “chunk” arbol_flujo en tu archivo .qmd.

Edita el codigo para crear un flujo con un modelo que tú elijas



Reto: ¿Que otros “preprocesadores”, aparte de formulas, podemos usar en workflow?

05:00

Predecir usando tu modelo

¿Como usar su nuevo modelo arbol_flujo?

arbol_espec <-
  decision_tree(cost_complexity = 0.002) %>% 
  set_mode("classification")

arbol_flujo <-
  workflow(propina ~ ., arbol_espec) %>% 
  fit(data = taxi_entrenar) 

Tu turno

Corre:

predict(arbol_flujo, new_data = taxi_prueba)

¿Que resultado te dio?

03:00

Tu turno

Corre:

augment(arbol_flujo, new_data = taxi_prueba)

¿Que resultado te dio?

03:00

La garantía de predicciones en Tidymodels!

  • Las predicciones siempre estarán dentro de una tabla tipo tibble
  • Los nombres de las columnas van a ser predecibles y sin sorpresas
  • El número de filas en los nuevos datos (new_data) y los resultados siempre var a ser el mismo

Entiendedo tú modelo

¿Como podemos entender nuestro nuevo modelo arbol_flujo?

Entiendedo tú modelo

¿Como podemos entender nuestro nuevo modelo arbol_flujo?

library(rpart.plot)
arbol_flujo %>%
  extract_fit_engine() %>%
  rpart.plot(roundint = FALSE)

Puedes extraer varios componentes de tu flujo usando las funciones que empiezan con extract_*()

⚠️ ¡Nunca trate de predecir usando los componentes extraídos!

Entiendedo tú modelo

¿Como podemos entender nuestro nuevo modelo arbol_flujo?

Puedes usar tu flujo ajustado para obtener explicaciones del modelo o de las predicciones:

  • El paquete vip puede dar la importancia de cada variable
  • Para obtener explicaciones del modelo, puede usar el paquete DALEXtra

Para aprender más: https://www.tmwr.org/explain.html

Tu turno


Extrae el “motor” del modelo de tu flujo y examínalo

05:00

Expectativas del taller - Donde estamos

flowchart LR
  ad[Todos\nlos datos]
  style ad fill:#fff,stroke:#666,color:#000
  tr[Entrenamiento]
  style tr fill:#FBE9BF,stroke:#666,color:#000
  ts[Prueba]
  style ts fill:#E5E7FD,stroke:#666,color:#000
  ad --> tr
  ad --> ts
  rs[Remuestreo]
  style rs fill:#fff,stroke:#eee,color:#ddd
  tr --> dt
  lg[Regresión\nlogística]
  style lg fill:#fff,stroke:#eee,color:#ddd
  rs --> lg
  dt[Arbol de\nDecisión]
  style dt fill:#FDF4E3,stroke:#666,color:#000
  rs --> dt
  rf[Bosque\nAleatorio]
  style rf fill:#fff,stroke:#eee,color:#ddd
  rs --> rf
  sm[Seleccionar\nmodelo]
  style sm fill:#fff,stroke:#eee,color:#ddd
  lg --> sm
  dt --> sm
  rf --> sm
  fm[Entrenar modelo\nselecionado]
  style fm fill:#fff,stroke:#eee,color:#ddd
  sm --> fm
  tr --> fm
  vm[Verificar la\ncalidad]
  style vm fill:#fff,stroke:#eee,color:#ddd
  fm --> vm
  ts --> vm