RANDOM FOREST EN PYTHON

RANDOM FOREST EN PYTHON

Random Forest es una técnica basada en árboles de decisión, que soluciona el problema que tienen los árboles de decisión de no servir para reproducir escenarios predictivos what-if.

Con el árbol de decisión veíamos qué variables podían predecir una variable objetivo determinada, pero no podíamos saber la importancia de cada variable.

Con Random Forest sí vamos a poder conocer la importancia de cada variable.

Al igual que en los árboles de decisión, la variable objetivo en un Random Forest puede ser categórica o cuantitativa. Y el grupo de variables explicativas también.

Recordar aquí cómo ejecutar Python en el ordenador.

  • Programa para desarrollar Random Forest

Os dejo el código, explicando qué hace cada cosa, y señalando las cosas importantes.

#Primero hay que llamar a unas librerías que el programa necesitará.
from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import os
import matplotlib.pylab as plt
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
import sklearn.metrics
from sklearn import datasets
from sklearn.ensemble import ExtraTreesClassifier

#Después, indicamos en qué directorio vamos a trabajar. Aquí ponéis entre paréntesis vuestro directorio.
os.chdir(«C:\TREES»)

#Cargamos el fichero de datos. Formato en Excel, csv.
AH_data = pd.read_csv(«tree_addhealth.csv»)

#Eliminamos los datos con valores missing porque Python no puede hacer árboles con datos missing
data_clean = AH_data.dropna()

#Para comprobar que se ha leído bien, podemos lista las variables en el fichero y sacar los principales estadísticos
data_clean.dtypes
#Principales estadísticos
data_clean.describe()

#Indicamos las variables predictoras y debajo la variable objetivo. Cada uno con los nombres de las variables que tenéis en el fichero csv.
predictors = data_clean[[‘VARPRED1’, ‘VARPRED2′,’VARPRED3’]]

targets = data_clean.TREG1

#Creamos la muestra de entrenamiento y de test, tanto para predictores como para la variable objetivo, siendo test el 40%
pred_train, pred_test, tar_train, tar_test = train_test_split(predictors, targets, test_size=.4)

#Importamos desde sklearn.ensamble, el algoritmo de Random Forest
from sklearn.ensemble import RandomForestClassifier

#Inicializamos el algoritmo Random Forest e indicamos el número de árboles que vamos a construir
classifier=RandomForestClassifier(n_estimators=25)

#Construimos el modelo sobre los datos de entrenamiento
classifier=classifier.fit(pred_train,tar_train)

#Predecimos para los valores del grupo Test
predictions=classifier.predict(pred_test)

#Pedimos la matriz de confusión de las predicciones del grupo Test. La diagonal de esta matriz se lee: arriba a la izda True Negatives y abajo a la dcha True Positives. 
sklearn.metrics.confusion_matrix(tar_test,predictions)

#Sacamos el índice Accuracy Score, que resume la Matriz de Confusión y la cantidad de aciertos.
sklearn.metrics.accuracy_score(tar_test, predictions)

#Para obtener la importancia de cada variable inicializamos el  ExtraTreesClassifier
model = ExtraTreesClassifier()

#Ajustamos el modelo
model.fit(pred_train,tar_train)

#Pedimos que nos muestre la importancia de cada variable
print(model.feature_importances_)

#Si queremos ver todas las variables en caso de ser muchas, mejor usar el comando «list»
list(model.feature_importances_)

#Para dibujar todos las variables con su importancia
from matplotlib import pyplot
pyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)
pyplot.show()

#Para ver cuánto ha aportado cada nuevo árbol que hemos construido

trees=range(25)
accuracy=np.zeros(25)

for idx in range(len(trees)):
classifier=RandomForestClassifier(n_estimators=idx + 1)
classifier=classifier.fit(pred_train,tar_train)
predictions=classifier.predict(pred_test)
accuracy[idx]=sklearn.metrics.accuracy_score(tar_test, predictions)

plt.cla()
plt.plot(trees, accuracy)

  • Salida en Python y lectura

Se obtiene el listado de las variables con su importancia. En este listado prima el orden en que se escribieron las variables en el programa: VAR1, VAR2,…

También se puede hacer un gráfico de estas variables y su importancia:

Por último, obtenemos el gráfico que nos indica si los árboles que se tuvieron que construir fueron suficientes o no:

Como punto negativo, en Random Forest no se interpretan los árboles que se construyen. Lo que obtenemos es solamente la importancia de las variables explicativas.

Random Forest se utiliza solo para clasificar la importancia de las variables en la predicción de la variables objetivo.

Sabemos cuales son las variables predictivas más importantes, pero no necesariamente sus relaciones entre sí.

 

Comentarios

  1. Tengo buenas noticias … cuando dices «Como punto negativo, en Random Forest no se interpretan los árboles que se construyen. Lo que obtenemos es solamente la importancia de las variables explicativas.» ….
    Lo que podemos hacer es construir un modelo sustituto (surrogate en inglés) que explique lo que hace el bosque aleatorio. No es exactamente lo mismo que el random forest, pero nos da una idea aproximada de lo que está haciendo.

  2. Hola Macarena, muy bien explicado, aunque hay dos cuestiones que comprendo.
    Interpretación de la importancia de las variables
    Gráfico que nos indica si los árboles que se tuvieron que construir fueron suficientes o no, una función que identifique el valor óptimo de arboles.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *