5. Random Forest

Validación Cruzada

Supongamos que estamos trabajando en un problema de clasificación binaria y disponemos de un conjunto de datos con 1000 registros. Queremos evaluar el rendimiento de un modelo de regresión logística utilizando la validación cruzada k-fold.

Paso a paso del proceso de k-fold cross-validation:

Dividir el conjunto de datos: Primero, dividimos el conjunto de datos en k subconjuntos (folds) de igual tamaño. En este ejemplo, elegimos k=10, lo que significa que dividimos el conjunto de datos en 10 subconjuntos de 100 registros cada uno.

Entrenar y evaluar el modelo: Luego, realizamos lo siguiente para cada uno de los k subconjuntos:

  1. Tomamos un subconjunto como el conjunto de prueba (validación) y los k-1 subconjuntos restantes como el conjunto de entrenamiento. Por ejemplo, en la primera iteración, usamos el primer subconjunto como conjunto de prueba y los subconjuntos del 2 al 10 como conjunto de entrenamiento.

  2. Entrenamos el modelo de regresión logística utilizando el conjunto de entrenamiento.

  3. Evaluamos el rendimiento del modelo en el conjunto de prueba utilizando una métrica adecuada, como la precisión, la exhaustividad o el F1-score. Anotamos el resultado de la métrica para esta iteración.

Promediar los resultados: Después de completar las k iteraciones, calculamos la media de los resultados de la métrica para todas las iteraciones. Esta media nos proporciona una estimación más robusta del rendimiento del modelo, ya que el modelo ha sido evaluado en diferentes subconjuntos del conjunto de datos.

https://scikit-learn.org/stable/modules/cross_validation.html https://www.tmwr.org/resampling.html

CART

Hay tres variables que están más relacionadas con no consumir alcohol.

crossvalidation <-
  vfold_cv(datos_entrenamiento, 
           v = 5,  # número de cajas
           strata = "PYALC")
tree_spec <- 
  decision_tree(
    cost_complexity = tune(), 
    tree_depth = tune(),
    min_n = tune()
  ) |> 
  set_mode("classification") |> 
  set_engine("rpart")

Cost_complexity (tmedida de complejidad alfa o parámetro de poda alfa):

Cost_complexity es un parámetro de regularización. Es una medida de la penalización que se aplica al árbol en función de su complejidad. Un valor más alto de cost_complexity implica una penalización más fuerte en la complejidad del árbol, lo que lleva a un árbol más pequeño y menos profundo. La idea es encontrar un valor óptimo de cost_complexity que equilibre la precisión y la complejidad del árbol, reduciendo tanto el sesgo como la varianza.

Tree_depth (profundidad del árbol):

Tree_depth se refiere a la longitud máxima del camino más largo desde la raíz hasta una hoja en un árbol de decisión. Un árbol más profundo es más complejo y puede capturar relaciones más complicadas en los datos. Sin embargo, un árbol demasiado profundo también puede ser propenso al sobreajuste, ya que puede adaptarse demasiado a las peculiaridades de los datos de entrenamiento.

Min_n (mínimo número de muestras para dividir un nodo):

Min_n es un parámetro que controla el número mínimo de datos requeridas para dividir un nodo en un árbol de decisión. Un valor más alto de min_n implica que el árbol será menos profundo, ya que se requerirán más muestras para realizar una división en cada nodo. Un valor más bajo de min_n permite que el árbol se divida más fácilmente y, por lo tanto, puede resultar en un árbol más complejo y profundo.

tree_grid <- grid_regular(cost_complexity(range = c(-10L, -1L)), 
                          tree_depth (range = c(5L, 10L)), 
                          min_n(range = c(5L, 30L)))
doParallel::registerDoParallel()

set.seed(345)
tree_rs <-
  tune_grid(
    tree_spec,
    PYALC ~ .,
    resamples = crossvalidation,
    grid = tree_grid,
    metrics = metric_set(accuracy, roc_auc, sensitivity, specificity)
  )

doParallel::stopImplicitCluster()
show_best(tree_rs)

autoplot(tree_rs)
simpler_tree <- select_best(tree_rs, min_n, metric = "accuracy")

final_tree <- finalize_model(tree_spec, simpler_tree)
final_fit <- fit(final_tree, PYALC ~ ., datos_entrenamiento)
final_cart <- last_fit(final_tree, PYALC ~ ., datos_divididos,
  metrics = metric_set(accuracy, roc_auc, sensitivity, specificity)
)
collect_metrics(final_cart)
cart_trained <- 
  final_cart  |> extract_fit_parsnip()

cart_tree_fit <- cart_trained$fit

treemisc::tree_diagram(cart_tree_fit, roundint=FALSE)

Random Forest

  • Número de predictores que se usan para cada árbol (mtry)
  • Número de árboles (trees)
  • Profundidad de los árboles (min_n)

Random Forest

rf_spec <- 
  rand_forest()  |> 
  set_mode("classification") |> 
  set_engine("ranger", importance = "permutation")
rf_results <- rf_spec |> 
fit(PYALC ~ ., data = datos_entrenamiento)

library(vip)
importance_plot_rf <- 
  rf_results |> 
  vip() +
  ggtitle("Random Forest")
rf_predicciones <- predict(rf_results, entrenamiento)

resultados_rf <- cbind(rf_predicciones,datos_entrenamiento) |> 
  tibble()

rf_metrics <- custom_metrics(resultados_rf,
               truth = PYALC,
               estimate = .pred_class) |>
  mutate(model="rf")

rbind(rf_metrics, tree2_metrics, tree_metrics, lm_metrics) |> 
  pivot_wider(names_from = model, values_from = .estimate)
rf_predicciones <- cbind(predict(rf_results, datos_prueba), datos_prueba2_out) |>  mutate(model="rf")

all_models <- 
rbind(lm_predicciones, rf_predicciones,tree_predicciones, tree2_predicciones) 


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)

Sesgo y varianza

Estos dos conceptos son cruciales para entender el equilibrio entre la complejidad del modelo y su capacidad para generalizar a nuevos datos.

Sesgo (Bias): a. Definición: El sesgo es la diferencia entre la predicción promedio de nuestro modelo y el valor verdadero que intentamos predecir.El sesgo, en términos estadísticos, se refiere a la diferencia sistemática entre la esperanza (o promedio) de las estimaciones que produce un estimador y el valor real del parámetro que se desea estimar. Un modelo con alta varianza es muy sensible a pequeñas variaciones en los datos de entrenamiento, lo que puede resultar en un sobreajuste. Es decir, el modelo se ajusta muy bien a los datos de entrenamiento, pero tiene un rendimiento deficiente en datos no vistos o de prueba.

  1. Ejemplo: Un modelo de regresión lineal simple podría tener un alto sesgo si los datos reales tienen una relación no lineal.
  2. Implicaciones: Un modelo con alto sesgo es demasiado simple y no captura la estructura subyacente de los datos. Esto conduce a un bajo rendimiento en el conjunto de entrenamiento y prueba.

Varianza (Variance): a. Definición: La varianza es la cantidad de variabilidad en las predicciones del modelo para un punto de datos dado. b. Ejemplo: Un modelo de árbol de decisión muy profundo podría tener alta varianza, ya que es muy sensible a pequeñas variaciones en los datos de entrenamiento. c. Implicaciones: Un modelo con alta varianza tiende a sobreajustarse a los datos de entrenamiento, lo que resulta en un buen rendimiento en el conjunto de entrenamiento pero un bajo rendimiento en el conjunto de prueba.

El objetivo en Machine Learning es equilibrar el sesgo y la varianza para minimizar el error de predicción general en el modelo a. Objetivo: Encontrar un equilibrio entre sesgo y varianza que minimice el error total de predicción. b. Estrategias: Seleccionar un modelo con la complejidad adecuada, usar técnicas de regularización, y validar el modelo con conjuntos de datos de entrenamiento y prueba separados.

Formas de disminur el sesgo

Aumentar la complejidad del modelo: Un modelo más complejo puede capturar mejor la estructura subyacente de los datos. Por ejemplo, en lugar de utilizar una regresión lineal simple, podrías probar una regresión polinomial o un modelo de árbol de decisión.

Añadir más variables: A veces, el sesgo puede ser el resultado de no tener en cuenta variables importantes que influyen en la variable objetivo. Añadir más variables relevantes puede ayudar a reducir el sesgo del modelo.

Utilizar técnicas de “ingeniería de predictores”: Transformar o combinar las variables existentes para crear nuevas características puede ayudar a capturar mejor la relación entre las variables de entrada y salida. Por ejemplo, si estás trabajando en un problema de predicción de precios de viviendas, podrías crear una nueva característica que represente la relación entre el tamaño de la casa y el número de habitaciones.

Aumentar el tamaño del conjunto de datos: Si tu conjunto de datos es pequeño o no es representativo de la población general, es posible que el modelo tenga un sesgo alto. Aumentar el tamaño del conjunto de datos y asegurarte de que es representativo puede ayudar a reducir el sesgo.

Utilizar ensembles de modelos: Combinar varios modelos en un ensemble puede ayudar a reducir el sesgo, ya que cada modelo puede capturar diferentes aspectos de la relación entre las variables de entrada y salida. Por ejemplo, puedes utilizar métodos de ensemble como Bagging, Boosting o Stacking.

Técnicas para reducir la varianza

Reducir la complejidad del modelo: Un modelo más simple tiende a tener una menor varianza y es menos propenso al sobreajuste. Por ejemplo, podrías limitar la profundidad de un árbol de decisión.

Utilizar regularización: La regularización es una técnica que añade una penalización a los coeficientes del modelo para evitar que se ajusten demasiado a los datos de entrenamiento.Por ejemplo, regularización L1 (Lasso) y L2 (Ridge).

Aumentar el tamaño del conjunto de datos: Si dispones de más datos, el modelo será menos sensible a pequeñas variaciones en los datos de entrenamiento y tendrá una menor varianza.

Eliminar características ruidosas: Si tu modelo incluye características que no están relacionadas con la variable objetivo o que contienen mucho ruido, estas pueden aumentar la varianza del modelo. Realizar un análisis de importancia de características y eliminar las características poco importantes puede ayudar a reducir la varianza.

Validación cruzada (cross-validation): Utilizar la validación cruzada, como k-fold cross-validation, te permite evaluar el rendimiento del modelo en diferentes subconjuntos del conjunto de datos de entrenamiento. Esto puede ayudarte a identificar si el modelo está sobreajustando los datos y ajustar la complejidad del modelo en consecuencia.

Utilizar diferentes modelos: Combinar varios modelos en un ensemble puede ayudar a reducir la varianza, ya que la variabilidad de cada modelo individual se promedia. Por ejemplo, puedes utilizar métodos de ensemble como Bagging (Bootstrap Aggregating) o Random Forest, que promedian las predicciones de múltiples árboles de decisión entrenados en subconjuntos aleatorios de los datos.