Árbol de decisión - regresión

Antes de empezar a estudiar árboles de decisión es importante conocer algunos conceptos importantes relacionados con el tema:

Aprendizaje Supervisado vs Aprendizaje no supervisado.

La mayoría de problemas de aprendizaje estadístico pueden ser clasificados dos categorías: Aprendizaje Supervisado y Aprendizaje No Supervisado.

Aprendizaje supervisado.

Para cada observación de las variables predictoras \(x_i~;~i=1,..,n\) existe una variable respuesta \(y_i\). Se desea ajustar un modelo de datos que relacione la variable respuesta \(y_i\) con las variables predictoras.

  • Predicción: para futuras observaciones de individuos tratar de pronosticar con exactitud la respuesta.

  • Inferencia: comprender mejor la relación entre la respuesta y las predictoras.

Algunos ejemplos de métodos de solución de problemas asociados con aprendizaje supervisado:

  • Regresión lineal
  • Regresión polinómica.
  • Regresión Ridge.
  • Regresión Lasso.
  • Regresión logística.
  • Árboles de decisión.
  • Máquinas de soporte vectorial.
  • Random Forest.
  • K-Nearest Neighbors (KNN).
  • Naive Bayes. …

Aprendizaje no supervisado.

Para cada observación \(i=1,..., n\), se tiene un vector \(x_i\), sin embargo, no se tiene asociado una variable respuesta \(y_i\) que permita supervisar algún ajuste.

Cuando se utiliza aprendizaje no supervisado se puede tratar de entender las relaciones entre variables o las relaciones entre las observaciones. Una herramienta de aprendizaje estadístico que podemos utilizar en este contexto es el análisis de conglomerados, o clustering. El objetivo del análisis de conglomerados es determinar, a partir del análisis de x1, . , xn , si las observaciones pertenecen a grupos relativamente distintos. Por ejemplo, en un estudio de segmentación de mercado podríamos observar múltiples características (variables) de los clientes potenciales, como el código postal, los ingresos familiares y los hábitos de compra. Podríamos pensar que los clientes pertenecen a grupos diferentes, como los que gastan mucho o los que gastan poco. Si se dispusiera de información sobre los patrones de gasto de cada cliente, sería posible realizar un análisis supervisado. Sin embargo, esta información no está disponible, es decir, no sabemos si cada cliente potencial es un gran gastador o no. En este caso, podemos intentar agrupar a los clientes en función de las variables medidas, con el fin de identificar distintos grupos de clientes potenciales. La identificación de estos grupos puede ser interesante porque es posible que difieran en alguna propiedad de interés, como los hábitos de gasto. Algunos métodos de aprendizaje no supervisado:

  • K-means
  • Clustering jerárquico.
  • Análisis de componentes principales.
  • Análisis discriminante no supervizado. …

Problemas de regresión vs Problemas de clasificación

Las variables pueden ser clasificadas como cuantitativas o cualitativas. Las variables cuantitativas toman valores numéricos: edad, estatura, ingreso, precio de una materia prima, costo de una vivienda. En contraste, las variables cualitativas toman valores en una de \(k\) clases o categorías diferentes: estado civil, marca de producto comprado, tipo de diagnóstico de una enfermedad.

En análisis de datos suele referirse a los problemas con variables respuesta cuantitativas como problemas de regresión, mientras que, a los problemas con variable respuesta cualitativa se consideran problemas de clasificaicón

Introducción a árboles de decisión

Los métodos basados en árboles consiste en segmentar el espacio (conjunto de posibles valores) de variables predictoras en una serie de espacios más simples .Dado que el conjunto de reglas de división usadas para segmentar el espacio de las variables predictoras puede resumirse y representarse en una árbol, este tipo de enfoque se conoce cómo métodos basados en árboles.

Los métodos basados en árboles son simples y útiles para interpretación, sin embargo, suelen no ser competitivos comparándose con otros métodos o enfoques de aprendizaje supervisado.

Árbol de decisión CART (Clasification and regression trees) para regresión.

Los árboles de decisión para regresión se utilizan cuando la variable dependiente o respuesta es cuantitativa, continua. En este caso los valores de los nodos terminales se reducen a la media de las observaciones de esa región.

Un árbol de regresión consiste en hacer preguntas de tipo \(¿x_k \leq s?\) para cada una de las variables predictoras o regresoras, de esta forma el espacio de las variables predictoras es divido en hiper-rectángulos \(R_1, R_2,..., R_j\) y todas las observaciones que queden dentro de un hiper-rectángulo tendrán el mismo valor estimado \(\hat{y}_{R_j}\)

La partición del espacio se hace de manera repetitiva para encontrar las variables y los valores de corte \(s\) de tal manera que se minimice la función \(RSS\)

\[RSS = \sum_{j=1}^J \sum_{i \in R_j} (y_i-\hat{y}_{R_j})^2 \]

$ _{Rj}$ es la respuesta media para las observaciones de entrenamiento dentro del rectángulo \(j\).

Desafortunadamente es inviable, desde el punto de vista computacional, considerar todas las particiones posibles del espacio de características de los \(j\) rectáncgulos. Por esta razón se realizan particiones binarias y usando un algoritmo top-down o descendente. El enfoque top-down es recursivo porque parte de todas las observaciones del árbol y divide de manera sucesiva el espacio predictor, cada división se indica mediante una dos nuevas ramas más abajo en el árbol. En cada paso hacia abajo se realiza la mejor división posible.

Para realizar la división binaria se selecciona inicialmente el predictor \(x_j\) y el punto de corte \(s\), de manera que se divide el espacio predictor en las regiones \(\{x | x_j < s \}\) y \(\{x | x_j \geq s\}\). de forma que conduzca a la mayor reducción de \(RSS\). Es decir, se condideran todos los predictores \(x_j\) y todos los valores posibles de puntos de corte \(s\) para cada uno de los predictores y a continuación se escoge el predictor y el punto de corte que tenga el RSS más bajo. Más puntualmente , para cada \(j\) y \(s\) se definen un par de semiplanos:

\[\begin{align} R_1 (j,s) = \{X|Xj < s \}~~y~~ R_2 (j,s) = \{X|Xj \geq s \} \end{align}\]

Y se busca el valor de \(j\) y \(s\) que minimice la función:

\[\begin{align} \sum_{i:~ x_i~ \in~ R_1(j,s)} (y_i - \hat{y}_{R_1})^2 + \sum_{i:~ x_i~ \in~ R_2(j,s)} (y_i - \hat{y}_{R_1})^2 \end{align}\]

\(\hat{y}_{R_1}\) es la respuesta media para las observaciones de entrenamiento en \(R_1(j,s)\).

\(\hat{y}_{R_2}\) es la respuesta media para las observaciones de entrenamiento en \(R_2(j,s)\).

Se repite el proceso, buscando el mejor predictor y el mejor punto de corte en busca de dividir binariamente los datos que minimizan \(RSS\). Esta vez realizando la división usando la región previamente identificada.

El proceso continúa hasta que se alcanza un criterio de parada; por ejemplo, podemos continuar hasta que ninguna región contenga más de cinco observaciones.

Una vez creadas las regiones \(R_1, . . . ,R_J\), predecimos la respuesta para una observación de prueba determinada utilizando la media de las observaciones de entrenamiento en la región a la que pertenece esa observación de prueba.

Poda del árbol (prunning).

El proceso descrito anteriormente puede producir buenas predicciones en el conjunto de entrenamiento, pero es probable que sobreajuste los datos, lo que llevaría a un mal rendimiento en el conjunto de prueba. Esto se debe a que el árbol resultante puede ser demasiado complejo. Un árbol más pequeño con menos divisiones (es decir, menos regiones \(R_1, . . . ,R_J\)) podría conducir a una menor varianza y una mejor interpretación a costa de un poco de sesgo. Una posible alternativa al proceso descrito anteriormente es construir el árbol sólo mientras la disminución del \(RSS\) debida a cada división supere algún umbral (alto). Esta estrategia dará lugar a árboles más pequeños, pero es demasiado miope, ya que una división aparentemente sin valor al principio del árbol podría ir seguida de una división muy buena, es decir, una división que conduzca a una gran reducción del \(RSS\) más adelante.

Por lo tanto, una mejor estrategia es hacer crecer un árbol muy grande \(T_0\), y luego podarlo para obtener un subárbol. ¿Cómo determinamos la mejor forma de podar el árbol? Intuitivamente, nuestro objetivo es seleccionar un subárbol que conduzca a la tasa de error de prueba más baja. Dado un subárbol, podemos estimar su error de prueba utilizando la validación cruzada o el enfoque del conjunto de validación. Sin embargo, estimar el error de validación cruzada para cada subárbol posible sería demasiado engorroso, ya que hay un número extremadamente grande de subárboles posibles. En su lugar, necesitamos una forma de seleccionar un pequeño conjunto de subárboles para su consideración.

Poda con costo de complejidad

La poda por costo de complejidad es una forma de selección del mejor subárbol sin considerar todos los subárboles posibles.

En lugar de considerar todos los subárboles posibles, consideramos una secuencia de árboles indexados por un parámetro de ajuste no negativo \(\alpha\). Para cada valor de \(\alpha\) corresponde un subárbol \(T \subset T_0\) tal que:

\[\begin{align} \sum_{m=1}^{|T|} \sum_{x_i~ \in~ R_m} (y_i - \hat{y}_{R_m})^2 + \alpha|T| \end{align}\]

Sea lo más pequeño posible.

\(|T|\) indica el número de nordos terminales del árbol \(T\).

\(R_m\) corresponde al rectángulo, que es subconjunto del espacio predictor, correspondiente al \(m-ésimo\). nodo temrinal.

\(\hat{y}_{R_m}\) es la respuesta predicha asociada a \(R_m\)

\(\alpha\) controla el equilibrio entre la complejidad del subárbol y su ajuste a los datos de entrenamiento. Cuando \(\alpha=0\) el subárbol \(T\) será igual al árbol \(T_0\), a medida que \(\alpha\) aumenta se debe pagar un precio portener un árbol con muchos nodos terminales.

Resulta que a medida que aumentamos \(\alpha\) desde cero, las ramas se podan del árbol de forma anidada y predecible, por lo que obtener toda la secuencia de subárboles en función de \(\alpha\) es fácil. Podemos seleccionar un valor de \(\alpha\) utilizando un conjunto de validación o mediante validación cruzada. A continuación, volvemos al conjunto de datos completo y obtenemos el subárbol correspondiente a \(\alpha\). Este proceso se resume en el el siguiente algoritmo.

  1. Utilice la división binaria recursiva para hacer crecer un árbol grande en los datos de entrenamiento, deteniéndose sólo cuando cada nodo terminal tenga menos de un número mínimo de observaciones.

  2. Aplicar la poda de costos de complejidad al árbol grande para obtener una secuencia de mejores subárboles, en función de \(\alpha\).

  3. Use validación cruzada, es decir, divida las observaciones de entrenamiento en \(K\) pliegues. Para cada \(k = 1, . . . ,K\):

  1. Repita los pasos \(1\) y \(2\) en todos los pliegues de los datos de entrenamiento excepto en el \(k-ésimo\).

  2. Evalúe el error cuadrático medio de predicción en los datos del pliegue \(k\) que queda fuera, en función de \(\alpha\).

Promedie los resultados para cada valor de \(\alpha\), y elija \(\alpha\) para minimizar el error medio.

  1. Devolver el subárbol del paso \(\alpha\) que corresponde al valor de \(\alpha\)elegido.

Árbol de regresión en RStudio

Realizaremos un árbol de decisión usando la base de datos de beisbolistas de la MLB que se encuentra en la librería ISLR2 la base de datos se llama hitters y la vamos a guardar en un dataframe llamado datos

library(ISLR2)
datos <- Hitters

Si deseamos observar los datos

summary(datos)
     AtBat            Hits         HmRun            Runs       
 Min.   : 16.0   Min.   :  1   Min.   : 0.00   Min.   :  0.00  
 1st Qu.:255.2   1st Qu.: 64   1st Qu.: 4.00   1st Qu.: 30.25  
 Median :379.5   Median : 96   Median : 8.00   Median : 48.00  
 Mean   :380.9   Mean   :101   Mean   :10.77   Mean   : 50.91  
 3rd Qu.:512.0   3rd Qu.:137   3rd Qu.:16.00   3rd Qu.: 69.00  
 Max.   :687.0   Max.   :238   Max.   :40.00   Max.   :130.00  
                                                               
      RBI             Walks            Years            CAtBat       
 Min.   :  0.00   Min.   :  0.00   Min.   : 1.000   Min.   :   19.0  
 1st Qu.: 28.00   1st Qu.: 22.00   1st Qu.: 4.000   1st Qu.:  816.8  
 Median : 44.00   Median : 35.00   Median : 6.000   Median : 1928.0  
 Mean   : 48.03   Mean   : 38.74   Mean   : 7.444   Mean   : 2648.7  
 3rd Qu.: 64.75   3rd Qu.: 53.00   3rd Qu.:11.000   3rd Qu.: 3924.2  
 Max.   :121.00   Max.   :105.00   Max.   :24.000   Max.   :14053.0  
                                                                     
     CHits            CHmRun           CRuns             CRBI        
 Min.   :   4.0   Min.   :  0.00   Min.   :   1.0   Min.   :   0.00  
 1st Qu.: 209.0   1st Qu.: 14.00   1st Qu.: 100.2   1st Qu.:  88.75  
 Median : 508.0   Median : 37.50   Median : 247.0   Median : 220.50  
 Mean   : 717.6   Mean   : 69.49   Mean   : 358.8   Mean   : 330.12  
 3rd Qu.:1059.2   3rd Qu.: 90.00   3rd Qu.: 526.2   3rd Qu.: 426.25  
 Max.   :4256.0   Max.   :548.00   Max.   :2165.0   Max.   :1659.00  
                                                                     
     CWalks        League  Division    PutOuts          Assists     
 Min.   :   0.00   A:175   E:157    Min.   :   0.0   Min.   :  0.0  
 1st Qu.:  67.25   N:147   W:165    1st Qu.: 109.2   1st Qu.:  7.0  
 Median : 170.50                    Median : 212.0   Median : 39.5  
 Mean   : 260.24                    Mean   : 288.9   Mean   :106.9  
 3rd Qu.: 339.25                    3rd Qu.: 325.0   3rd Qu.:166.0  
 Max.   :1566.00                    Max.   :1378.0   Max.   :492.0  
                                                                    
     Errors          Salary       NewLeague
 Min.   : 0.00   Min.   :  67.5   A:176    
 1st Qu.: 3.00   1st Qu.: 190.0   N:146    
 Median : 6.00   Median : 425.0            
 Mean   : 8.04   Mean   : 535.9            
 3rd Qu.:11.00   3rd Qu.: 750.0            
 Max.   :32.00   Max.   :2460.0            
                 NA's   :59                

Establecemos como factores las variables cualitativas.

datos$League <- as.factor(datos$League)
datos$Division <- as.factor(datos$Division)
datos$NewLeague <- as.factor(datos$NewLeague)

Limpiamos la base de datos eliminando las observaciones que tienen NA

datos <- na.omit(datos)

Cargamos librerías necesarias

library(tidyverse)
library(rpart)
library(rpart.plot)
library(caret)

Creamos la base de datos de entrenamiento

set.seed(1000)
datos_entrenamiento <- sample_frac(datos, .7)

Creamos la base de datos de prueba

datos_prueba <- setdiff(datos, datos_entrenamiento)

Entrenamos al modelo

arbol_1 <- rpart(formula=Salary~., data=datos_entrenamiento, method="anova")
arbol_1
n= 184 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 184 39168070.0  522.1024  
   2) CHits< 450 84  4791392.0  217.6369  
     4) CRuns< 153 66  4183723.0  181.6288  
       8) Walks>=12.5 59   292120.2  150.6723 *
       9) Walks< 12.5 7  3358512.0  442.5476 *
     5) CRuns>=153 18   208321.5  349.6667 *
   3) CHits>=450 100 20049080.0  777.8534  
     6) RBI< 97.5 92 12528520.0  709.9726  
      12) Walks< 66.5 73  5117806.0  618.6755  
        24) Hits< 104.5 31  1644155.0  483.4409  
          48) CHmRun< 157 23   441127.0  413.1884 *
          49) CHmRun>=157 8   763159.7  685.4166 *
        25) Hits>=104.5 42  2488255.0  718.4915  
          50) Runs>=89.5 7   272506.0  478.1633 *
          51) Runs< 89.5 35  1730585.0  766.5571 *
      13) Walks>=66.5 19  4464451.0 1060.7460 *
     7) RBI>=97.5 8  2221588.0 1558.4830 *

Todo lo anterior resulta mucho más claro si lo visualizamos, así que creamos una gráfica usando nuestro modelo con la función ´´´rpart.plot()´´´ de ´´´rpart.plot´´´

rpart.plot(arbol_1)

Por defecto ´´´rpart´´ aplica un proceso para calcular la penalización de acuerdo al número de árboles.

plotcp(arbol_1)

Árbol completo

arbol_completo <- rpart(formula=Salary~., data=datos_entrenamiento, method="anova",  control = list(cp = 0, xval = 10))
rpart.plot(arbol_completo)

plotcp(arbol_completo)