Unidad 3(CARTs): Determinación de Sistemas de Aprendizaje automático

Árboles de decisión: regresión

Code
library(tidyverse)
library(rpart)
library(rpart.plot)
# library(bayesQR)
# library(broom)
# library(corrplot)
library(yardstick)
library(pROC)
#library(ggrepel)
# library(purrr)
# library(plotly)

Algoritmos de Machine Learning

  • Regresión Lineal

  • Regresión Logística

  • Árboles de Decisión

  • k Nearest Neighbor

  • SVM

  • Naive Bayes

  • Clustering jerárquico

  • K-Means

  • PCA

  • Redes Neuronales

  • Aprendizaje profundo

¿Qué es un árbol de decisión?

Bagnato (2022)

Los arboles de decisión son representaciones gráficas de posibles soluciones a una decisión basadas en ciertas condiciones, es uno de los algoritmos deaprendizaje supervisado más utilizados en machine learning y pueden realizar tareas de clasificación o regresión (acrónimo del inglés CART).

La comprensión de su funcionamiento suele ser simple y a la vez muy potente. Utilizamos mentalmente estructuras de árbol de decisión constantemente en nuestra vida diaria sin darnos cuenta:

¿Llueve? –> lleva paraguas.

¿Soleado? –> lleva gafas de sol.

¿Estoy cansado? –> toma café.

Son Decisiones del tipo IF THIS, THEN THAT

Los árboles de decisión tienen un primer nodo llamado raíz (root) y luego se descomponen el resto de atributos de entrada en dos ramas (podrían ser más, pero no nos meteremos en eso ahora) planteando una condición que puede ser cierta o falsa. Se bifurca cada nodo en 2 y vuelven a subdividirse hasta llegar a las hojas que son los nodos finales y que equivalen a respuestas a la solución: Si/No, Comprar/Vender, o lo que sea que estemos clasificando. Otro ejemplo son los populares juegos de adivinanza:

1. ¿Animal ó vegetal? -Animal

2. ¿Tiene cuatro patas? -Si

3. ¿Hace guau? -Si

4. -Es un perro!

Supongamos que tenemos atributos como Género con valores “hombre ó mujer” y edad en rangos: “menor de 18 ó mayor de 18” para tomar una decisión.

Podríamos crear un árbol en el que dividamos primero por género y luego subdividir por edad. Ó podría ser al revés: primero por edad y luego por género. El algoritmo es quien analizando los datos y las salidas -por eso es supervisado!- decidirá la mejor forma de hacer las divisiones (splits) entre nodos. Tendrá en cuenta de qué manera lograr una predicción (clasificación ó regresión) con mayor probabilidad de acierto.

Parece sencillo, no? Pensemos que si tenemos 10 atributos de entrada cada uno con 2 o más valores posibles, las combinaciones para decidir el mejor árbol serían cientos ó miles… Esto ya no es un trabajo para hacer artesanalmente. Y ahí es donde este algoritmo cobra importancia, pues él nos devolverá el árbol óptimo para la toma de decisión más acertada desde un punto de vista probabilístico.

¿Cómo funciona?

Para obtener el árbol óptimo y valorar cada subdivisión entre todos los árboles posibles y conseguir el nodo raiz y los subsiguientes, el algoritmo deberá medir de alguna manera las predicciones logradas y valorarlas para comparar de entre todas y obtener la mejor.

Para medir y valorar, utiliza diversas funciones, siendo las más conocidas y usadas los “Indice gini” y “Ganancia de información” que utiliza la denominada “entropía”. La división de nodos continuará hasta que lleguemos a la profundidad máxima posible del árbol ó se limiten los nodos a una cantidad mínima de muestras en cada hoja. A continuación describiremos muy brevemente cada una de las estrategias nombradas:

Indice Gini

Se utiliza para atributos con valores continuos (precio de una casa). Esta función de coste mide el “grado de impureza” de los nodos, es decir, cuán desordenados o mezclados quedan los nodos una vez divididos. Deberemos minimizar ese GINI index.

Ganancia de información:

Se utiliza para atributos categóricos (como en hombre/mujer). Este criterio intenta estimar la información que aporta cada atributo basado en la “teoría de la información”. Para medir la aleatoriedad de incertidumbre de un valor aleatorio de una variable “X” se define la Entropia. Al obtener la medida de entropía de cada atributo, podemos calcular la ganancia de información del árbol. Deberemos maximizar esa ganancia.

Hiperparámetros:

  • Minimum number of splits: Mínimo número de observaciones existentes para dividir un nodo. Valor por defecto 20.

  • Complexity parameter (cp): Valor típico: 0.01. Indica que si el modelo no mejora el modelo en, al menos un 1 %, no realiza más divisiones. Reduce la complejidad computacional y previene el sobreajuste.

  • Maximum depth: Valor por defecto 30. Mide la profundidad máxima entre el nodo raiz (profundidad 0) y el nodo más extremo (hojas).

Resumen CARTs (Classification and Regression Trees)

https://www.ibm.com/es-es/topics/decision-trees

  • No se describen mediante ecuaciones.

  • No tienen como objetivo estimar parámetros lineales ni discutir su significancia estadística.

  • Se realiza un proceso de división recursiva de los datos, según los hiperparámetros definidos para minimizar los errores usando criterios como el índice Gini y la Ganancia de información.

  • Utilizan diferentes criterios de estimación dependiendo de la naturaleza de la variable dependiente. Se dividen en:

    • :Árboles de Clasificación: Cuando la variable dependiente es categórica (dicotómica o politómica).

    • Árboles de Regresión: Cuando la variable dependiente es métrica (contínua). No utilizan el procedimiento paso a paso.

  • Pueden tener hiperparámetros

  • Función de poda. Una vez realizado el modelo, es posible reducir las ramificaciones del árbol usando funciones de poda para reducir su complejidad.

Ejemplo: Árbol de regresión

En esta ocasión, nuestra variable objetivo, cpi es numérica. Vamos a modelar usando el algoritmo de árbol de regresión para estimar el valor de percepción de corrupción de un país, en función de las variables predictoras:

  • age: Indica la edad media de los multimillonarios del país. Numérica
  • emergent_country: Si es o no país emergente. Categórica
  • hours: Horas semanales laborales en promedio de la problación
Code
load("data/corruption.RData")
Code
summary(corruption)
      country        cpi             age            hours      
 Argentina: 1   Min.   :2.000   Min.   :39.00   Min.   :26.80  
 Australia: 1   1st Qu.:3.500   1st Qu.:58.75   1st Qu.:31.27  
 Austria  : 1   Median :5.300   Median :63.00   Median :32.95  
 Belgium  : 1   Mean   :5.563   Mean   :61.73   Mean   :32.79  
 Brazil   : 1   3rd Qu.:7.825   3rd Qu.:67.00   3rd Qu.:34.50  
 Canada   : 1   Max.   :9.300   Max.   :79.00   Max.   :38.10  
 (Other)  :46                                                  
 emergent_country
 no :21          
 yes:31          
                 
                 
                 
                 
                 
Code
# rpart utiliza validación cruzada con criterios random
set.seed(1) # necesario para reproductividad

CART_corruption <- rpart(formula = cpi ~ age + hours + emergent_country,
                        data = corruption,
                        method = "anova") # para regresión
Code
rpart.plot(x = CART_corruption,
           type = 1, 
           box.palette = "RdGn")

Code
printcp(CART_corruption)

Regression tree:
rpart(formula = cpi ~ age + hours + emergent_country, data = corruption, 
    method = "anova")

Variables actually used in tree construction:
[1] age              emergent_country hours           

Root node error: 282.04/52 = 5.4239

n= 52 

        CP nsplit rel error  xerror    xstd
1 0.585476      0   1.00000 1.02460 0.10998
2 0.039005      1   0.41452 0.43866 0.11416
3 0.034106      3   0.33651 0.47785 0.11196
4 0.010000      4   0.30241 0.42658 0.10351
Code
CART_corruption$cptable
          CP nsplit rel error    xerror      xstd
1 0.58547618      0 1.0000000 1.0246013 0.1099762
2 0.03900499      1 0.4145238 0.4386571 0.1141599
3 0.03410604      3 0.3365138 0.4778489 0.1119601
4 0.01000000      4 0.3024078 0.4265764 0.1035132
Code
CART_corruption$cptable[which.min(
CART_corruption$cptable[,"xerror"]),"CP"]
[1] 0.01
Code
corruption["fitted"] <- predict(object = CART_corruption,
newdata = corruption)
Code
corruption["residuals"] <- corruption$cpi - corruption$fitted
Code
corruption %>%
summarise(rss = sum((fitted - mean(fitted)) ** 2),
u = sum((residuals) ** 2)) %>%
summarise(r_squared = rss / (rss + u))
# A tibble: 1 × 1
  r_squared
      <dbl>
1     0.698
Code
MSE <- sum(corruption["residuals"]**2)/(nrow(corruption))
RMSE <- sqrt(MSE)
RMSE
[1] 1.280709

Ejercicios:

  1. Representa la matriz de correlación para las cuatro variables del modelo. Realiza la transformación dummy para la variable categórica.

  2. Ajusta el modelo usando regresión lineal sin interacciones. ¿Qué modelo tiene mejores métricas?

  3. Modifica los hiperparámetros del modelo de árbol de regresión reduciendo cp a 0 y el número de divisiones a 2. ¿Qué valores de \(R^2\) y RMSE obtienes?

References

Bagnato, Juan Ignacio. 2022. Aprende Machine Learning En Español: Teoría + Práctica Python. Leanpub. http://leanpub.com/aprendeml.