2 - Tu presupuesto de datos

Introducciendo Tidymodels

“¡¡Que emoción!!”

Datos de viajes en taxi de Chicago

  • La ciudad de Chicago publica datos a nivel de viaje
  • Sacamos una muestra de 10,000 viajes que ocurrieron al principio del 2022

Datos de viajes en taxi de Chicago

  • N = 10,000
  • Un resultado nominale, propina, con los niveles "si" y "no"
  • Varias variables nominales, por ejemplo la identificación del Taxi, y el tipo de pago
  • Varias variables numéricas, por ejemplo la distancia del viaje, y los subtotales del cargo por el viaje

¿Se pueden usar estas variables?

  • ¿Será ético, o hasta legal, utilizar esta variable?

  • ¿La variable estará disponible al momento de predecir?

  • ¿La variable contribuye a la explicación de los resultados?

Datos de viajes en taxi de Chicago

Baja los datos, y cargarlos en tu sesión de R

download.file("https://github.com/edgararuiz/tidymodels-workshops/blob/main/archive/2024-03-conectaR-spanish/taxi.rds",
              "taxi.rds")

taxi <- readRDS(taxi.rds)
taxi
#> # A tibble: 10,000 × 7
#>    propina distancia compania                     local dia   mes    hora
#>    <fct>       <dbl> <fct>                        <fct> <fct> <fct> <int>
#>  1 si          17.2  Chicago Independents         no    Jue   Feb      16
#>  2 si           0.88 City Service                 si    Jue   Mar       8
#>  3 si          18.1  otra                         no    Lun   Feb      18
#>  4 si          20.7  Chicago Independents         no    Lun   Abr       8
#>  5 si          12.2  Chicago Independents         no    Dom   Mar      21
#>  6 si           0.94 Sun Taxi                     si    Sab   Abr      23
#>  7 si          17.5  Flash Cab                    no    Vie   Mar      12
#>  8 si          17.7  otra                         no    Dom   Ene       6
#>  9 si           1.85 Taxicab Insurance Agency Llc no    Vie   Abr      12
#> 10 si           1.47 City Service                 no    Mar   Mar      14
#> # ℹ 9,990 more rows

Separando y “gastando” datos

Para el aprendizaje automatico, separamos los datos, unos para entranamiento, y los otros para la “prueba final”:

  • Los datos de entrenamiento se utilizan para estimar los parametros del modelo

  • Los datos de prueba se ponen aparte para medir la calidad del modelo

🚫 No utilize los datos de prueba durante el entrenamiento 🚫

Separando y “gastando” datos

Si gastamos más datos 🤑
mejoramos las estimaciones del modelo

Separando y “gastando” datos

  • Gastando mucho datos en el entrenamiento previene que tengamos una buena manera de medir la calidad del modelo
  • Gastando mucho datos en prueba previente que tegamos una buena estimación de los parametros

Tu turno

¿Cuando deberiamos separar nuestros datos?

03:00

Sus datos de prueba son valiosos 💎

La separación inicial

set.seed(123)
taxi_separar <- initial_split(taxi)
taxi_separar
#> <Training/Testing/Total>
#> <7500/2500/10000>

¿Para que es set.seed()?

Para el propósito de separar datos, R puede generar números “seudo-aleatorios”, que aunque parezcan comportarse como números aleatorios, en realidad se generan de una manera específica basada en una “semilla” (seed)

Si utilizamos la misma semilla nos permite reproducir los mismos resultados.

El número en sí que elijes realmente no importa. Lo que si importa, es que no experimentes con diferentes números de la semilla con el proposito de mejorar la calidad del modelo.

Accediendo los datos

taxi_entrenar <- training(taxi_separar)
taxi_test <- testing(taxi_separar)

El set the entrenamiento

taxi_entrenar
#> # A tibble: 7,500 × 7
#>    propina distancia compania                  local dia   mes    hora
#>    <fct>       <dbl> <fct>                     <fct> <fct> <fct> <int>
#>  1 si           0.7  Taxi Affiliation Services si    Mar   Mar      18
#>  2 si           0.99 Sun Taxi                  si    Mar   Ene       8
#>  3 si           1.78 otra                      no    Sab   Mar      22
#>  4 si           0    Taxi Affiliation Services si    Mie   Abr      15
#>  5 si           0    Taxi Affiliation Services no    Dom   Ene      21
#>  6 si           2.3  otra                      no    Sab   Abr      21
#>  7 si           6.35 Sun Taxi                  no    Mie   Mar      16
#>  8 si           2.79 otra                      no    Dom   Feb      14
#>  9 si          16.6  otra                      no    Dom   Abr      18
#> 10 si           0.02 Chicago Independents      si    Dom   Abr      15
#> # ℹ 7,490 more rows

El set de prueba

🙈

En el set de prueba, hay 2500 entradas, con 7 columnas

Tu turno

Separa tus datos, el 20% tiene que ser para prueba

Trata diferentes valores para set.seed() para ver como cambian los resultados

05:00

Separando y “gastando” datos

set.seed(123)
taxi_separar <- initial_split(taxi, prop = 0.8)
taxi_entrenar <- training(taxi_separar)
taxi_test <- testing(taxi_separar)

nrow(taxi_entrenar)
#> [1] 8000
nrow(taxi_test)
#> [1] 2000

¿Y que pasó con los datos para validar?

flowchart TD
  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  
  vl[Validación]
  style vl fill:#E5E7FD,stroke:#666,color:#000    
  ad --> tr
  ad --> ts
  ad --> vl

Datos de validación

set.seed(123)
initial_validation_split(taxi, prop = c(0.6, 0.2))
#> <Training/Validation/Testing/Total>
#> <6000/2000/2000/10000>

Análisis exploratorio para Aprendizaje Automático 🧐

Tu turno

Explora los datos en taxi_entrenar por tí mismo

  • ¿Cual es la distribución de los resultados de propina?
  • ¿Cual es la distribución de las variables numéricas, por ejemplo distancia?
  • ¿Como cambian los resultados de propina a través de las variables categóricas?
08:00

taxi_entrenar %>% 
  ggplot(aes(x = propina)) +
  geom_bar()

taxi_entrenar %>% 
  ggplot(aes(x = propina, fill = local)) +
  geom_bar() +
  scale_fill_viridis_d(end = .5)

taxi_entrenar %>% 
  ggplot(aes(x = hora, fill = propina)) +
  geom_bar()

taxi_entrenar %>% 
  ggplot(aes(x = hora, fill = propina)) +
  geom_bar(position = "fill")

taxi_entrenar %>% 
  ggplot(aes(x = distancia)) +
  geom_histogram(bins = 100) +
  facet_grid(vars(propina))

Separa inteligentemente

Estratificar la muestra separará los datos dentro los valores de respuesta

Estratificar

Use strata = propina

set.seed(123)
taxi_separar <- initial_split(taxi, prop = 0.8, strata = propina)
taxi_separar
#> <Training/Testing/Total>
#> <8000/2000/10000>

Estratificar

Estratificar la muestra usualmente ayuda, y con pocas consecuencias

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 --> rs
  lg[Regresión\nlogística]
  style lg fill:#fff,stroke:#eee,color:#ddd
  rs --> lg
  dt[Arbol de\nDecisión]
  style dt fill:#fff,stroke:#eee,color:#ddd
  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