4. Árboles de decisión

Agenda

  • ¿Qué es un árbol de decisión?
  • ¿Cómo se construye un árbol de decisión?
  • ¿Cómo se evalúa un árbol de decisión?
  • ¿Cómo se elige un árbol de decisión?

Árboles de decisión

(mejorar esto) El objetivo es tomar una serie de decisiones, basadas en las respuestas a cada pregunta, para llegar a una conclusión o predicción final. Cada nodo del árbol representa una característica de los datos que se están analizando y cada rama representa una posible respuesta a esa característica.

Los árboles de decisión son útiles porque proporcionan una forma fácil de visualizar y entender cómo se toman las decisiones en un modelo

Arbusto

mi_primer_arbol <- los_datos |> 
  select("PYALC", "GETALC", "GENDER", "GRADE")
tree_spec <- 
  decision_tree() |> 
  set_mode("classification") |> 
  set_engine("rpart")
tree_results <- tree_spec |>
    fit(PYALC ~ ., data = mi_primer_arbol)
cart_tree_fit <- tree_results$fit

treemisc::tree_diagram(cart_tree_fit, roundint = FALSE)

https://mlu-explain.github.io/decision-tree/

Árboles de clasificación y regresión (CART)

tree_spec <- 
  decision_tree() |> 
  set_mode("classification") |> 
  set_engine("rpart")
tree_results <- tree_spec |>
  fit(PYALC ~ ., data = datos_entrenamiento)
predict(tree_results, predecir_estos_valores)

entrenamiento <- datos_entrenamiento %>%
  select(-PYALC)

prediccion_tree <- predict(tree_results, entrenamiento)

resultados_prueba_tree <- cbind(prediccion_tree, datos_entrenamiento) |>
  tibble()
custom_metrics(resultados_prueba_tree,
  truth = PYALC,
  estimate = .pred_class
) |>
  mutate(model = "tree")

tree_metrics <- custom_metrics(resultados_prueba_tree,
  truth = PYALC,
  estimate = .pred_class
) |>
  mutate(model = "tree")

rbind(tree_metrics, lm_metrics) |>
  pivot_wider(names_from = model, values_from = .estimate)

CART con hiperparametros

Los hiperparámetros son valores específicos para los modelos que se pueden ajustar y que permiten controlar el proceso de entrenamiento de un modelo.

tree_spec <- 
  decision_tree(min_n = 5, cost_complexity = 0.001) |> 
  set_mode("classification") |> 
  set_engine("rpart")
tree2_results <- tree_spec |>
    fit(PYALC ~ ., data = datos_entrenamiento)
tree2_predicciones <- predict(tree2_results, entrenamiento)

resultados_prueba_tree2 <- cbind(tree2_predicciones, datos_entrenamiento) |>
  tibble()

tree2_metrics <- custom_metrics(resultados_prueba_tree2,
  truth = PYALC,
  estimate = .pred_class
) |>
  mutate(model = "tree2")

rbind(tree2_metrics, tree_metrics, lm_metrics) |>
  pivot_wider(names_from = model, values_from = .estimate)

¡Pero todo esto pasa en los datos de prueba!

¿Por qué es malo?

datos_prueba2_out <- 
  datos_prueba |> 
    select(PYALC) 
  
lm_predicciones <- cbind(predict(lm_results, datos_prueba), datos_prueba2_out)|> mutate(model="lm")

tree_predicciones <- cbind(predict(tree_results, datos_prueba), datos_prueba2_out)|> mutate(model="tree")

tree2_predicciones <- cbind(predict(tree2_results, datos_prueba), datos_prueba2_out) |>  mutate(model="tree2")

all_models <- 
rbind(lm_predicciones, tree_predicciones, tree2_predicciones) 

all_models
all_models2 <- all_models |> 
  group_split(model) %>%
   setNames(unique(all_models$model)) %>%
  map_dfr(., ~custom_metrics(.x,
               truth = PYALC,
               estimate = .pred_class), .id = "names")

all_models2 |> 
  pivot_wider(names_from = names, values_from = .estimate)

¿Cómo vamos a elegir el mejor modelo si solo evaluamos el modelo en los datos de prueba?