Mostrando entradas con la etiqueta Regresiones. Mostrar todas las entradas
Mostrando entradas con la etiqueta Regresiones. Mostrar todas las entradas

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.


domingo, 14 de agosto de 2016

Regresion Logistica con DataFrame

El siguiente script utiliza DataFrame para ajustar un modelo de regresión logística.
Para mismo ejemplo con numpy.matrix y detalle de regresión logística, ver nota publicada AQUI.


script:
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import pandas as pd

# DATA
#---------------------------------------------------------------------------------------------
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 TEST
#---------------------------------------------------------------------------------------------
np.random.seed(123)
m_train    = np.random.rand(len(data)) < 0.5
data_train = data.iloc[m_train,]
data_test  = data.iloc[~m_train,]

# MODELO
modelo = LogisticRegression(random_state=1)
modelo.fit(data_train[headers], data_train[clase_name])

# PREDICCION
#---------------------------------------------------------------------------------------------
prediccion = modelo.predict(data_test[headers])

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

domingo, 24 de julio de 2016

Regresion Logistica con sklearn


El siguiente ejemplo utiliza la regresion logistica para predecir la variable survived del dataset titanic. El script utiliza la regresion logistica de la libreria sklearn.


En resumen, la regresión logística sigue estos pasos:

1. Transformar la variable a predecir  (que solo puede tomar dos valores: 0,1) en la probabilidad  de Y=1, (que es igual a P) usando la distribución binomial de bernoulli. (ver referencia Nro.1)

2. Calcular el Odds Ratio de la probabilidad P, que es igual a   P / (1-P) = Odds Ratio

3. Calcula el logaritmo natural del Odds Ratio, es decir: hace el ln(P/(1-P))  ó  ln(Odds Ratio). Esto también puede ser interpretado como la cantidad de éxitos dividido entre la cantidad de fracasos. Se utiliza logaritmo natural para luego poder hacer la inversa, que es el exponencial. El logaritmo del Odds Ratio ahora es la variable independiente a predecir, tambien llamado logit.

4. Estima la combinación lineal, o Regresion Lineal de las variables independientes, de la siguiente forma: ln(Odds Ratio) =  β0 + β1*X1 + β1*X1. Al resultado obtenido también le dicen βx

5.  Se transforma ln(P/(1-P))   en     eβx / (1+ eβx) . Esto también lo representan como:
1 / (1+ e-βx) donde e es la constante matemática igual a  2.718281828

6. Se estiman los coeficientes (es decir los β) de la ecuación anterior, usando el método de máxima verosimilitud (ver referencia Nro. 4)


Transformacion de ln(P/(1-P)) = βx   en   P = 1 / (1+ e-βx) :












El proceso en python seria así:





Al evaluar el modelo, las métricas quedan así:





























script:
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import pandas as pd


# CARGAR DATASET DE DROPBOX
#-----------------------------------------------------------------
data = pd.read_csv('https://www.dropbox.com/s/cugxdc9mhau4nw1/titanic2.csv?dl=1')
data = data.as_matrix()
data = np.matrix(data)


# CREA dataset TRAIN y TEST
#---------------------------------------------------------------------------------------------
np.random.seed(123)
m_train    = np.random.rand(len(data)) < 0.5
data_train = data[m_train,]
data_test  = data[~m_train,]


# CLASE
#---------------------------------------------------------------------------------------------
clase_train = data_train[:,-1]
clase_train = clase_train.A1 #convierte de matriz a vector 
clase_test  = data_test[:,-1]
clase_test  = clase_test.A1 #convierte de matriz a vector 


# MODELO
#---------------------------------------------------------------------------------------------
modelo_lr = LogisticRegression()
modelo_lr.fit(X=data_train[:,:-1],y=clase_train)


# PREDICCION
#---------------------------------------------------------------------------------------------
predicion = modelo_lr.predict(data_test[:,:-1])


# METRICAS
#---------------------------------------------------------------------------------------------
print(metrics.classification_report(y_true=clase_test, y_pred=predicion))
print(pd.crosstab(data_test[:,-1].A1, predicion, rownames=['REAL'], colnames=['PREDICCION']))

Referencias
1. http://stats.stackexchange.com/questions/144121/logistic-regression-bernoulli-vs-binomial-response-variables
2. http://aimotion.blogspot.com.ar/2011/11/machine-learning-with-python-logistic.html
3. http://machinelearningmastery.com/get-your-hands-dirty-with-scikit-learn-now/
4. http://czep.net/stat/mlelr.pdf
5. https://www.youtube.com/watch?v=EocjYP5h0cE