Inteligencia Analítica de Datos con R

Clasificadores: Desicion Tree y Random Forest
(Árboles de decisión y Bosques aleatorios)

Msc. Roberto Trespalacios

Universidad Tecnológica de Bolivar

7/19/23

Desicion Tree (Árboles de decisión)

Los árboles de decisión son una técnica de aprendizaje automático supervisado muy utilizada en muchos negocios. Como su nombre indica, esta técnica de machine learning toma una serie de decisiones en forma de árbol.

  • Proporciona una forma práctica y sencilla para que las personas comprendan las posibles opciones de toma de decisiones y la gama de posibles resultados basados en una serie de problemas.

  • Los árboles de decisión generalmente comienzan con un solo nodo y luego se descomponen en nodos adicionales para mostrar más posibilidades (como elegir las dos caras de una moneda).

  • Los nodos intermedios (las ramas) representan soluciones. Los nodos finales (las hojas) nos dan la predicción que vamos buscando.

  • La rama más lejana del árbol representa el resultado final.

  • Los tomadores de decisiones eventualmente sopesan cada plan de acción con los riesgos para tomar la decisión final. Además, se puede crear un árbol más largo o corto según sea necesario.

Árboles de Decisión para Clasificación

Datos para clasificación – Iris

Para explicar cómo funcionan los árboles de decisión con problemas de clasificación vamos a usar el conjunto de datos Iris. El problema consiste en clasificar correctamente la variedad de la flor iris a partir del ancho y largo de los pétalos y sépalos. Hay tres variedades de flor iris: setosa, versicolor y virginica.

Este conjunto de datos tiene 150 muestras:

  • 50 iris setosa
  • 50 iris versicolor
  • 50 iris virginica

Teoría de los árboles de decisión para clasificación

Si le damos las 150 flores del conjunto de datos Iris a un árbol de decisión para que lo clasifique, nos quedaría un árbol como el que se muestra a continuación. Vamos a aprender a leerlo:

  • cada color representa a una clase. El marrón para setosa, el verde para versicolor y el lila para virginica.
  • el color es más intenso cuanto más seguros estamos que la clasificación es correcta
  • los nodos blancos, por tanto, evidencia la falta de certeza
  • Hay dos tipos de nodo:
    • Nodos de decisión: tienen una condición al principio y tienen más nodos debajo de ellos
    • Nodos de predicción: no tienen ninguna condición ni nodos debajo de ellos. También se denominan nodos hijo

Imagen del árbol de decisión de los datos iris

Información del árbol de decisión de los datos iris

La información de cada nodo es la siguiente:

  • condición: si es un nodo donde se toma alguna decisión
  • gini: es una medida de impureza. A continuación veremos cómo se calcula
  • samples: número de muestras que satisfacen las condiciones necesarias para llegar a este nodo
  • value: cuántas muestras de cada clase llegan a este nodo
  • class: qué clase se le asigna a las muestras que llegan a este nodo

Interpretación de la información de cada nodo es la siguiente:

Interpretación

La interpretación del árbol de este árbol de decisión sería:

  • Si la longitud del pétalo es menos de 2.45 centímetros, entonces la flor iris pertenece a la variedad setosa.
  • Si por el contrario, la longitud del pétalo es mayor que 2.45 centímetros, habría que mirar al ancho del pétalo.
  • Cuando el ancho del pétalo es menor o igual a 1.75 centímetros, pertenece a la variedad versicolor con un 91% de probabilidad. Si no, parece que sería virginica con un 98% de probabilidad.

Cómo elegir el mejor atributo en cada nodo

Si bien hay varias formas de seleccionar el mejor atributo en cada nodo, dos métodos:

  • Impureza de Gini
  • Ganancia de información

Observación

  • Ambos actúan como criterio de división popular para los modelos de árboles de decisión.
  • Ayudan a evaluar la calidad de cada condición de prueba y qué tan bien podrá clasificar las muestras en una clase.

Coeficiente de Gini (Impureza gini)

  • Es una medida de impureza. Cuando Gini vale 0, significa que ese nodo es totalmente puro. La impureza se refiere a cómo de mezcladas están las clases en cada nodo.
  • El índice Gini, también se interpreta como una métrica para medir la frecuencia con la que un elemento elegido al azar se identificaría incorrectamente.

Para calcular la impureza gini, usamos la siguiente fórmula:

\[Gini = 1- \sum_{k \in S} p_k^2\]

Donde

  • \(S\) representa el conjunto de datos en el que se calcula la entropía
  • \(k\) representa las clases en conjunto, \(S\)
  • \(p_k\) representa la proporción de puntos (probabilidad) de datos que pertenecen a la clase \(k\) al número total de puntos de datos en el conjunto \(S\); podemos calcularla dividiendo el número de muestras de cada clase en cada nodo por el número de muestras totales por nodo.

Ejemplo 1

Por ejemplo, para el caso del nodo donde la clasificación es versicolor, el cálculo sería el siguiente:

\[Gini_{versicolor} = 1- \sum_{k \in S} p_k^2 = 1- \left( \frac{0}{54} \right)^2 + \left( \frac{49}{54} \right)^2 + \left( \frac{5}{54} \right)^2 = 0.168 \]

Entropía y ganancia de información

Entropía

Es difícil explicar la ganancia de información sin discutir primero la entropía. La entropía es un concepto que se deriva de la teoría de la información, que mide la impureza de los valores de la muestra. Se define con la siguiente fórmula, donde:

\[Entropia(S) = \sum_{k \in S} p_k log_2(p_k)\]

Donde

  • \(S\) representa el conjunto de datos en el que se calcula la entropía
  • \(k\) representa las clases en conjunto, \(S\)
  • \(p_k\) representa la proporción de puntos de datos que pertenecen a la clase \(k\) al número total de puntos de datos en el conjunto, \(S\)

Observaciones

  • Los valores de entropía pueden estar entre 0 y 1.
  • Si todas las muestras en el conjunto de datos, S, pertenecen a una clase, entonces la entropía será igual a cero.
  • Si la mitad de las muestras se clasifican como una clase y la otra mitad están en otra clase, la entropía estará en su punto más alto en 1.
  • Para seleccionar la mejor característica para dividir y encontrar el árbol de decisión óptimo, se debe usar el atributo con la menor cantidad de entropía.

La ganancia de información

La ganancia de información generalmente se representa con la siguiente fórmula

\[Entropía(S,\alpha)= Entropía (S) - \sum_{k \in Niveles(\alpha)} \frac{|S_k|}{|S|} Entropía (S_k)\]

  • \(\alpha\): representa un atributo específico o una etiqueta de clase.
  • \(Entropía (S)\): es la entropía del conjunto de datos, \(S\)
  • \(\frac{|S_k|}{|S|}\): representa la proporción de los valores en \(S_k\) al número de valores en el conjunto de datos, \(S\)
  • \(Entropía(S_k)\): es la entropía del conjunto de datos, \(S_k\)

Observaciones

  • La ganancia de información representa la diferencia de entropía antes y después de una división en un atributo dado.
  • El atributo con la ganancia de información más alta producirá la mejor división, ya que está haciendo el mejor trabajo al clasificar los datos de entrenamiento de acuerdo con su clasificación de destino.

Ventajas y desventajas de los árboles de decisión

Ventajas

  • Fácil de interpretar: la lógica booleana y las representaciones visuales de los árboles de decisión los hacen más fáciles de entender y consumir. La naturaleza jerárquica de un árbol de decisión también facilita ver qué atributos son los más importantes, lo que no siempre queda claro con otros algoritmos, como las redes neuronales.

  • Requiere poca o ninguna preparación de datos: los árboles de decisión tienen una serie de características que los hacen más flexibles que otros clasificadores. Puede manejar varios tipos de datos, es decir. valores discretos o continuos, y los valores continuos se pueden convertir en valores categóricos mediante el uso de umbrales. Además, también puede manejar valores con valores faltantes, lo que puede ser problemático para otros clasificadores, como Naïve Bayes.

  • Más flexible: los árboles de decisión se pueden aprovechar para tareas de clasificación y regresión, lo que los hace más flexibles que otros algoritmos. También es insensible a las relaciones subyacentes entre los atributos; esto significa que si dos variables están altamente correlacionadas, el algoritmo solo elegirá una de las características para dividir.

Ventajas y desventajas de los árboles de decisión

Desventajas

  • Propenso a sobreajustarse: los árboles de decisión complejos tienden a sobreajustarse y no se generalizan bien a nuevos datos. Este escenario se puede evitar mediante los procesos de prepoda o postpoda. La poda previa detiene el crecimiento del árbol cuando no hay datos suficientes, mientras que la poda posterior elimina los subárboles con datos inadecuados después de la construcción del árbol.

  • Estimadores de alta varianza: Pequeñas variaciones dentro de los datos pueden producir un árbol de decisión muy diferente. El embolsado, o el promedio de estimaciones, puede ser un método para reducir la varianza de los árboles de decisión. Sin embargo, este enfoque es limitado ya que puede conducir a predictores altamente correlacionados.

  • Más costoso: dado que los árboles de decisión adoptan un enfoque de búsqueda codicioso durante la construcción, pueden ser más costosos de entrenar en comparación con otros algoritmos.

Random Forest

Random Forest es un conjunto de árboles de decisión. Construye y combina múltiples árboles de decisión para obtener predicciones más precisas.

Observaciones

  • Es un algoritmo de clasificación no lineal.
  • Cada modelo de árbol de decisión se utiliza cuando se emplea por sí solo.
  • Se realiza una estimación de errores de casos que no se utiliza al construir el árbol.
  • Esto se denomina estimación de error externo (out of bag error) y se menciona como un porcentaje.

¿Por qué se llama Random Forest (Bosques aleatorios)?

Se llaman aleatorios porque eligen predictores aleatoriamente en un momento de entrenamiento y la palabra “bosque” porque toman la salida de múltiples árboles para tomar una decisión.

  • El bosque aleatorio supera a los árboles de decisión, ya que una gran cantidad de árboles (modelos) no correlacionados que funcionan como un grupo, siempre superará a los modelos constituyentes individuales.

Teoría sobre Random forest

Random forest toma muestras aleatorias de las observaciones, variables iniciales aleatorias (columnas) e intenta construir un modelo. El algoritmo de bosque aleatorio es el siguiente:

Algoritmo

  1. Dibuje una muestra aleatoria de arranque de tamaño \(n\) (elija aleatoriamente n muestras de los datos de entrenamiento).
  2. Haga crecer un árbol de decisión a partir de una muestra de arranque. En cada nodo del árbol, seleccione al azar d características.
  3. Divida el nodo usando características (variables) que proporcionen la mejor división según la función objetivo. Por ejemplo, maximizando la ganancia de información.
  4. Repita los pasos 1 a 2, \(k\) veces (\(k\) es la cantidad de árboles que desea crear usando un subconjunto de muestras). Agregue la predicción por cada árbol para un nuevo punto de datos para asignar la etiqueta de clase por mayoría de votos, es decir, elija el grupo seleccionado por la mayor cantidad de árboles y asigne un nuevo punto de datos a ese grupo.

Ejemplo ilustrativo de Random forest

Considere una caja de frutas que consta de tres frutas: manzanas, naranjas y cerezas en datos de entrenamiento, es decir, n = 3. Estamos prediciendo la fruta que tiene el máximo número en una caja de frutas. Un modelo de bosque aleatorio usando los datos de entrenamiento con un número de árboles, \(k = 3\).

El modelo se juzga utilizando varias características de los datos, es decir, diámetro, color, forma y grupos. Entre naranja, color cereza y naranja, el naranja se selecciona para ser el máximo en la caja de frutas por Random forest.

Ejercicio

A continuación presentaremos un ejemplo para árboles de decisión y random forest.

  • Generaremos dos árbole de decisión usando la variable nivel_satisfacción como variable respuesta y cambiando las vas variables explicativas y compararemos los resultados.
  • Crearemos un random forest y analizaremos los resultados.

los datos

Usaremos un conjunto de datos que contiene información sobre los empleados que trabajaron en una empresa. Estos datos provienen de Kaggle,

https://www.kaggle.com/datasets/mfaisalqureshi/hr-analytics-and-job-prediction

Análisis de datos de recursos humanos de una empresa

Este conjunto de datos contiene información sobre los empleados que trabajaron en una empresa.

Variables

Este conjunto de datos contiene columnas:

  • Nivel satisfactorio
  • Ultima evaluación
  • Número de proyectos
  • Promedio de horas mensuales
  • Tiempo dedicado a la empresa
  • Accidente de trabajo
  • Salida de la empresa
  • Promoción Últimos 5 Años
  • Departamento de ventas
  • Salario

Exploración de los datos

Librerías usadas

#libraries
library(readr)
library(ggplot2)
library(dplyr)
library(modelr)
library(caTools)
library(rpart)
library(yardstick)
library(randomForest)
library(readr)
Data <- read_csv("~/Documents/utb_diplomado/sem_5.3/datos/kaggle_employee.csv")

head(Data)

Veamos las columnas

## nombre variables
names(Data)
summary(Data)

Veamos si hay NA’s

#veamos si hay NAs
sum(is.na(Data))

Exploración de los datos

Veamos la cantidad de empleados con salario alto, medio y bajo

Data %>%
  count(salary)
Data %>%
  count(sales, salary)%>%
  group_by(sales)

Gráfico número de empleados que trabajan o no en la empresa

ggplot(Data, aes(x = factor(left), fill=factor(salary)))+
  geom_bar(stat="count")

Creando los árboles de decisión

Los datos train y test

#Data splitting to 80&20
sample = sample.split(Data$satisfaction_level,SplitRatio = 0.8)
train= subset(Data,sample==TRUE)
test = subset(Data,sample==FALSE)
X_test = subset(test, select= -c(satisfaction_level))
Y_test = subset(test, select= c(satisfaction_level))

Árbol 1

#Build a Decision Tree regression tree using the training dataset.
dt_model = rpart(satisfaction_level ~ last_evaluation +
                    number_project + 
                    average_montly_hours + 
                    time_spend_company, 
                  method = "anova", data = train)
print(dt_model) 

Visualización del árbol

plot(dt_model, uniform = TRUE)
text(dt_model, use.n = TRUE)

Predicción de la respuesta para el test

#Y_pred
Y_pred = predict(dt_model, X_test, method = "anova")
Y_pred

Evaluación del modelo

## Matriz de confusion
Y_pred_cat <- as.factor(ifelse(Y_pred < 0.6, "Insatisfecho" , "Satisfecho"))
Y_test_cat <- as.factor(ifelse(Y_test$satisfaction_level < 0.6, "Insatisfecho" , "Satisfecho"))

library(caret)
table(Y_pred_cat, Y_test_cat)

m.c <- confusionMatrix(data = Y_pred_cat, reference = Y_test_cat)
m.c

Veamos la curva ROC

library(pROC)

Yp <- ifelse(Y_pred < 0.6, 0 , 1)
Yt <- ifelse(Y_test$satisfaction_level < 0.6, 0 , 1)

objroc <- roc(Yt, Yp, auc=T, ci=T)

#curva
plot(objroc)

# area bajo la curva
auc(objroc)

Ejercicio: Árbol 2

Realizar todo el análisis del árbol 2

Random Forest

Crearemos un modelo de bosque aleatorio usando las variables del primer modelo ya que tuvo mejor rendimiento.

#Create a random forest model.
rf_model = randomForest(satisfaction_level ~ last_evaluation +
                          number_project +
                          average_montly_hours + 
                          time_spend_company, 
                        type = "regression",
                        ntree = 1200,
                        split = 15,
                        importance = TRUE,
                        data = train)

rf_model

Veamos la predicción del modelo

## Prediction and Evaluation
Y_pred3 = predict(rf_model, X_test) 

RMSE

Veamos el RMSE Notamos un RMSE más bajo al comparar los dos modelos de árboles de decisión y comprobemos las características importantes.

importance(rf_model)

En conclusión

  • El RMSE (Root Mean Squared Error) del Random Forest es 0.1800717 mientras que el RMSE del primer modelo de árbol de decisión es 0.1955787.
  • Por lo tanto, el modelo de bosque aleatorio funciona mejor que el árbol de decisión.
  • Además, al observar las características de importancia, vemos que el promedio de horas_mensuales y el número_de_proyectos son los factores más importantes para evaluar el nivel_de_satisfacción.

Ejercicio

Descripción del conjunto de datos german_credit

  • Es un dato de crédito de un banco alemán que consta de 21 variables y 1000 registros.
  • La variable dependiente o objetivo es la “credibilidad” que explica si se debe otorgar un préstamo a un cliente en función de sus perfiles.

https://raw.githubusercontent.com/deepanshu88/Datasets/master/UploadedFiles/german_credit.csv

  1. descargue los datos
  2. generar el train y el test
  3. ajustar el modelo Random Forest
  4. crear las predicciones
  5. construya la matriz de confusión