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


No hay comentarios:

Publicar un comentario