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
Y 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 O
dds Ratio de la probabilidad
P, que es igual a
P / (1-P) = O
dds 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