domingo, 14 de agosto de 2016

Random Forest

El siguiente script utiliza el algoritmo Random Forest para predecir la variable survived del data set titanic. Para detalle del algoritmo Random Forest, ver paper de su creador, Leo Breiman, publicado AQUI, y también AQUI.

En forma resumida, el algoritmo sigue este proceso (copiado de nota publicada AQUI):
  1. Selecciona individuos al azar (usando muestreo con reemplazo) para crear diferentes set de datos.
  2. Crea un árbol de decisión con cada set de datos, obteniendo diferentes arboles, ya que cada set contiene diferentes individuos y diferentes variables.
  3. Al crear los arboles se eligen variables al azar en cada nodo del arbol, dejando crecer el arbol en profundidad (sin podar).
  4. Predice los nuevos datos usando el "voto mayoritario", donde clasificará como "positivo" si la mayoría de los arboles predicen la observación como positiva.


Este script tiene las siguientes salidas:


Matriz de Confusión:








Métricas:









donde:
precision = (predicciones acertadas de laclase_x) / (total casos predichos para clase_x)
recall        = (predicciones acertadas de la clase_x) / (total de casos existentes en clase_x)
f1-score    = (2 * precision * recall) / (precision + recall)
support   = total casos en cada fila


Importancia de Variables:

















script:
import numpy as np
from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics
import pandas as pd
from datetime import datetime
start_time = datetime.now()


# CARGAR DATASET DE DROPBOX
#---------------------------------------------------------------------------------------------
data = pd.read_csv('https://www.dropbox.com/s/cugxdc9mhau4nw1/titanic2.csv?dl=1')
clase_name = 'survived' # nombre de variable a predecir
headers    = data.columns.values.tolist()
headers.remove(clase_name)


# TRAIN y TEST
#---------------------------------------------------------------------------------------------
m_train     = np.random.rand(len(data)) < 0.7
data_train  = data.loc[m_train,headers].as_matrix()
data_test   = data.loc[~m_train,headers].as_matrix()
clase_train = data.loc[m_train,clase_name].as_matrix()
clase_test  = data.loc[~m_train,clase_name].as_matrix()


# CONVIERTE EN NUMPY.MATRIX. Para mejor performance
# -----------------------------------------------------------------------------------------------
data_train = np.matrix(data_train)
data_test  = np.matrix(data_test) 


# MODELO
#---------------------------------------------------------------------------------------------
modelo = RandomForestClassifier(
 random_state      = 1,   # semilla inicial de aleatoriedad del algoritmo
 n_estimators      = 666, # cantidad de arboles a crear
 min_samples_split = 2,   # cantidad minima de observaciones para dividir un nodo
 min_samples_leaf  = 1,   # observaciones minimas que puede tener una hoja del arbol
 n_jobs            = 1    # tareas en paralelo. para todos los cores disponibles usar -1
 )
modelo.fit(X = data_train, y = clase_train)


# PREDICCION
#---------------------------------------------------------------------------------------------
prediccion = modelo.predict(data_test)


# METRICAS
#---------------------------------------------------------------------------------------------
print(metrics.classification_report(y_true=clase_test, y_pred=prediccion))
print(pd.crosstab(clase_test, prediccion, rownames=['REAL'], colnames=['PREDICCION']))


# IMPORTANCIA VARIABLES
#---------------------------------------------------------------------------------------------
var_imp = pd.DataFrame({
 'feature':headers, 
 'v_importance':modelo.feature_importances_.tolist()
 })
print var_imp.sort_values(by = 'v_importance', ascending=False)


# END
#---------------------------------------------------------------------------------------------
end_time = datetime.now()
print('duracion: ' + format(end_time - start_time))






1 comentario: