Random Forest – Bagging y árboles de decisión

En este post aprenderás a utilizar uno de los algoritmos de ensemble (o ensamblados en español) más conocidos y utilizados en el mundo del Machine Learning, el Random Forest. Aprenderás cómo funciona y cómo lo podrás utilizar en Python.

En otros posts ya hemos hablado de algoritmos que modelan por distancias como el KNN. O si lo que necesitas es un enfoque lineal para un problema de regresión, también hemos hablado del modelo lineal por excelencia.

Introducción a los ensemble

Cuando intentamos entrenar un modelo para un determinado conjunto de datos, solemos probar diferentes algoritmos para ver cuál se adapta mejor a nuestro problema. Cuando ya hayas probado diferentes algoritmos sin mejorar los resultados, puede llegar el momento de utilizar algín método de ensemble, que combina diferentes algoritmos débiles para aumentar el poder predictivo. Hay diferentes métodos de ensamblados, en este post nos centraremos en el método de Bagging y concretamente en el Random Forest.

Ensamblados y los algoritmos débiles

Cuando trabajamos en un problema de aprendizaje supervisado, ya sea para clasificación o regresión, lo que se suele hacer es entrenar algún algoritmo e intentar que su desempeño ante esta tarea sea el mejor. En ocasiones, los algoritmos cumplen su función, pero en otras obtenemos resultados bastante pobres.

Un algoritmo débil, es aquel modelo que tiene una precisión bastante poco acertada a la hora de predecir la variable dependiente, en palabras sencillas, predice muy mal. La idea de los ensamblados, es coger una combinación de varios algoritmos débiles, que como hemos dicho previamente, combinará la salida de estos modelos, para obtener uno mucho más robusto. Hay muchas formas de combinar modelos para aumentar el poder predictivo de los algoritmos débiles, como podrían ser Bagging, Boosting o Stacking.

Bagging

La idea del algoritmo de Bagging, cuyo nombre viene en inglés de «bootstrap aggregating», consiste en entrenar modelos de forma independiente y después combinar sus resultados. Para clasificación se obtendría el voto por mayoría de cada algoritmo (la moda), y para regresión la media de las predicciones.

Bootstrapping

El algoritmo de Bagging se basa en el concepto de Bootstrapping, el cual consiste en obtener subconjuntos de datos con remplazamiento y entrenar cada algoritmo débil con uno de estos subconjuntos.

Ejemplo de estructura del algoritmo de Bagging

Random Forest y Bagging

El algoritmo Random Forest, es un ejemplo de ensamblados de Bagging. Consiste en entrenar una serie de árboles de decisión, para que luego voten el resultado por mayoría en clasificación u obtengan la media si es un problema de regresión.

Es un algoritmo muy utilizado en diferentes proyectos de Machine Learning, ya que suele obtener muy buenos resultados.

Random Forest en Python

Ahora veremos cómo podemos utilizarlo en Python.

Cargamos las librerías

El primer paso consistirá en cargar aquellos módulos que utilizaremos a lo largo del proceso. Importaremos librerías para poder descargar el conjunto de datos, para cargar estos datos y para poder entrenar algoritmos de Machine Learning.

import urllib.request
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier

Descargamos el conjunto de datos

Para la demostración del Random Forest, he escogido unos datos que se pueden obtener de la página de UCI ML. Para quien no la conozca, está página proporciona diversos conjuntos de datos, por lo que la recomiendo si te estás iniciando en el mundillo, para practicar con diversos datasets.

Puedes entrar directamente en este enlace y descargar el conjunto de datos. Pero ya que estamos programando, he decidido obtener los datos con código, así que no te tienes que estar molestando en entrar en la web, descargarlo y luego moverlo a donde necesitas. Simplemente copia el código a continuación y se descargará en la carpeta desde donde estés ejecutando.

file_name = 'dataR2.csv'

def download_file(file_name):
    print('Descargando el dataset')
    url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00451/dataR2.csv'
    urllib.request.urlretrieve(url, file_name)

download_file(file_name)

Carga de los datos

En primer lugar, cargaremos los datos y los dividiremos en conjuntos para entrenar y testear.

data = pd.read_csv(file_name)
y = data["Classification"]
X = data.drop(["Classification"], axis=1)
(X_train, X_test,
 y_train, y_test) = train_test_split(X,
                                     y,
                                     stratify=y,
                                     test_size=0.33,
                                     random_state=11)

No vamos a entrar en detalles de análisis exploratorio ya que no es el objetivo de este post. Simplemente, debemos saber, que el dataset se compone de 10 columnas. 9 corresponden a variables independientes, que usaremos para predecir el target y 1 (Classification) es la variable a predecir. Todas las variables son numéricas, ya sea enteras o reales y no tiene valores nulos.

Comparación con un árbol de decisión

Entrenaremos un árbol de decisión, que es el elemento básico en el que se basa el Random Forest, como hemos dicho antes.

tree = DecisionTreeClassifier(random_state=11)
tree.fit(X_train, y_train)
print(f"Tree Accuracy: {tree.score(X_test, y_test)}")

En nuestro caso el algoritmo obtiene un accuracy de 64%.

Comparando árboles de decisión con Random Forest

Entrenaremos el algoritmo Random Forest, que como hemos dicho combina una serie de árboles de decisión con el método de bagging para posteriormente votar entre todos el resultado correcto.

model = RandomForestClassifier(random_state=11, n_estimators=200,
                               class_weight="balanced", max_features="log2")
model.fit(X_train, y_train)
print(f"RF Accuracy: {model.score(X_test, y_test)}")

Con este algoritmo obtenemos un accuracy de 69%.

Conclusiones

Hemos entrenado estos algoritmos con los hiperparámetros que hemos creído convenientes, pero esto no significa que sean los mejores, si quieres investigar cómo puedes mejorar estos resultados, te dejo el enlace de cómo hacer una búsqueda de hiperparámetros.

Espero que les haya gustado este artículo. Para evaluar los modelos hemos utilizado la métrica de accuracy, pero si quisieras probar con otra, te dejo por aquí al enlace de métricas de clasificación.

Espero que haya quedado claro el funcionamiento del algoritmo Random Forest y que empieces a utilizarlo en tus proyectos. Si tienes cualquier duda, déjala en los comentarios y te la resolveremos.

¡Esperamos verte de nuevo por aquí!