lunes, 15 de agosto de 2016

Ensamble: Random Forest + Regresion Logistica

El siguiente script hace un ensamble de dos algoritmos: Random Forest y Regresion Logistica. Esto para predecir la variable survived del data set titanic.

El Scrip sigue estos pasos:
1. Carga csv desde dropbox
2. Divide el data set en train (70%) y test (30%)
3. Convierte los set de train y test en matriz numpy, solo por performance.
4. Crea una lista_algoritmos a utilizar, para luego crear los modelos y predecir a través de un loop.
5. Hace el promedio de las dos predicciones, y luego clasifica como verdadero los valores mayor a 0.5, de lo contrario, clasifica como falso.
6. Imprime las metricas de eficiencia de la prediccion del modelo ensamblado.




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


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


# TRAIN y TEST
#------------------------------------------------------------------------------------------
np.random.seed(444)
m_train     = np.random.rand(len(data)) < 0.70
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_rf = RandomForestClassifier(
 random_state      = 1,   # semilla inicial de aleatoriedad del algoritmo
 n_estimators      = 100, # cantidad de arboles a crear
 min_samples_split = 5,   # cantidad minima de observaciones para dividir un nodo
 min_samples_leaf  = 2,   # observaciones minimas que puede tener una hoja del arbol
 n_jobs            = 1    # tareas en paralelo. para todos los cores disponibles usar -1
 )
modelo_lr   = LogisticRegression(random_state=1)
algoritmos  = [modelo_rf, modelo_lr]
all_predict = []
for alg in algoritmos:
    alg.fit(data_train, clase_train)
    predictions = alg.predict_proba(data_test.astype(float))[:,1]
    all_predict.append(predictions)


# ENSAMBLE DE PREDICCION
#------------------------------------------------------------------------------------------
predic_ens = (all_predict[0] + all_predict[1])/2
predic_ens[predic_ens >  .5] = 1
predic_ens[predic_ens <= .5] = 0
predic_ens = predic_ens.astype(int)


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


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

No hay comentarios:

Publicar un comentario