En forma resumida, el algoritmo sigue este proceso (copiado de nota publicada AQUI):
- Selecciona individuos al azar (usando muestreo con reemplazo) para crear diferentes set de datos.
- Crea un árbol de decisión con cada set de datos, obteniendo diferentes arboles, ya que cada set contiene diferentes individuos y diferentes variables.
- Al crear los arboles se eligen variables al azar en cada nodo del arbol, dejando crecer el arbol en profundidad (sin podar).
- 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))
Podria brindar la data historica
ResponderEliminarpara hacer pruebas