La regresión logística (logistic regression) es una técnica de Machine Learning para encontrar las relaciones entre dos variables y predecir el valor de uno de ellos en función del otro. Normalmente, esta predicción tiene solo dos resultados posibles, como predecir el sexo de una persona (mujer u hombre), el resultado de un experimento (éxito o fracaso), etcétera.
Además, esta predicción se obtiene en términos de probabilidad; esto es, la probabilidad de que se dé un resultado determinado en un evento dicotómico. Luego, esta probabilidad se puede modificar para generar la predicción de una clase.
Este algoritmo de Machine Learning suele ser el primero que se estudia por simplicidad y fundamentalismo. Además, es muy fácil de implementar.
Todos los modelos de Machine Learning tienen una gran cantidad de parámetros, vital para su aplicación ante los distintos casos de uso y conjuntos de datos. La elección de estos parámetros dependerá del conjunto de datos y del problema específico que estemos intentando resolver. Es aconsejable probar diferentes valores y hacer validaciones de cara a poder obtener siempre el mejor modelo posible.
Podemos construir un modelo de regresión logística fácilmente en Python utilizando la librería scikit-learn
y la función LogisticRegression
. Algunos de sus parámetros más importantes y los primeros en los que debemos centrarnos son:
penalty
: Este parámetro se usa para prevenir el sobreajuste (overfitting) del modelo, que es cuando el modelo aprende tanto de los datos de entrenamiento que no es capaz de generalizar y solo predice bien esos datos y no unos nuevos. Este parámetro se puede configurar para que no exista penalización y para graduarla desde niveles muy leves hasta muy altos.C
: Este parámetro determina la complejidad del modelo. Es el inverso del parámetro anterior. Es un número decimal que determina cómo de simple queremos que sea el modelo. Cuanto mayor sea el número, más complejo será el modelo y más se adaptará a la muestra de entrenamiento (aumentando la probabilidad del sobreajuste).solver
: Algoritmo de regresión que se utilizará para entrenar al modelo. Dependiendo del tamaño del conjunto de datos, de las clases a predecir, del nivel de sobreajuste que estemos dispuestos a asumir o del nivel de precisión, elegiremos una implementación u otra.max_iter
: Número máximo de iteraciones.Otro parámetro muy importante es el random_state
, que controla la semilla de generación aleatoria que requieren algunos de los solvers del modelo. Este parámetro es crucial para asegurar la replicabilidad.
Cada modelo tiene unos requisitos en cuanto al contenido y forma del input para asegurar que los resultados del modelo sean los mejores posibles. En el caso de la regresión logística son los siguientes:
En el conjunto de datos del Titanic tenemos más de una característica, y con la regresión logística predecimos si sobrevivirán o no. Si el valor que predice el modelo fuera 0.85, eso significaría que la persona tiene un 85% de probabilidades de sobrevivir y un 15% de no hacerlo. Así, debemos establecer un límite (threshold) para poder realizar la clasificación (respondemos a la siguiente pregunta: ¿a partir de qué valor de probabilidad podemos asumir que la persona sobrevive o no?). Supongamos que ese valor es el 50%, es decir, que cuando la probabilidad es mayor o igual a 0.5, el valor es 1 (sobrevive), y cuando la probabilidad es menor a 0.5, el valor es 0 (no sobrevive).
Además, tenemos que saber también que el proceso de entrenar y usar el modelo viene después del análisis exploratorio (EDA), así que necesitaremos partir de él.
import pandas as pd
train_data = pd.read_csv("https://raw.githubusercontent.com/4GeeksAcademy/machine-learning-content/master/assets/clean_titanic_train.csv")
test_data = pd.read_csv("https://raw.githubusercontent.com/4GeeksAcademy/machine-learning-content/master/assets/clean_titanic_test.csv")
train_data.head()
El conjunto train
lo utilizaremos para entrenar el modelo, mientras que con el test
lo evaluaremos para medir su grado de efectividad. Dividiremos también las predictoras de las características.
X_train = train_data.drop(["Survived"], axis = 1)
y_train = train_data["Survived"]
X_test = test_data.drop(["Survived"], axis = 1)
y_test = test_data["Survived"]
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
El tiempo de entrenamiento de un modelo dependerá, en primer lugar, del tamaño del conjunto de datos (instancias y características), y también de la tipología de modelo y su configuración.
Una vez se ha entrenado el modelo, se puede utilizar para predecir con el conjunto de datos de prueba.
y_pred = model.predict(X_test)
y_pred
Con los datos en crudo es muy complicado saber si el modelo está acertando o no. Para ello, debemos compararlo con la realidad. Existe una gran cantidad de métricas para medir la efectividad de un modelo a la hora de predecir, entre ellas la precisión (accuracy), que es la fracción de predicciones que el modelo realizó correctamente.
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
El valor anterior se interpretaría como que el modelo ha predicho, de 262 pasajeros, el resultado de supervivencia de 222 de ellos (si sobrevivían o no) correctamente.
Además de la puntuación (score) del modelo observada, es común que en los problemas de clasificación se construya una matriz de confusión (confusion matrix), que es una tabla que se organiza de tal manera que cada fila de la matriz representa las instancias de una clase predicha, mientras que cada columna representa las instancias de una clase real:
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix
titanic_cm = confusion_matrix(y_test, y_pred)
# Dibujaremos esta matriz para hacerla más visual
cm_df = pd.DataFrame(titanic_cm)
plt.figure(figsize = (3, 3))
sns.heatmap(cm_df, annot=True, fmt="d", cbar=False)
plt.tight_layout()
plt.show()
La interpretación de una matriz de confusión es la siguiente:
142
y son los casos en los que el modelo predijo positivo (no supervivencia) y la clase real también es positiva.80
y son los casos en los que el modelo predijo negativo (supervivencia) y la clase real también es negativa.23
y son los casos en los que el modelo predijo positivo y la clase real es negativa.17
y son los casos en los que el modelo predijo negativo y la clase real es positiva.Estas cuatro medidas se utilizan a menudo para calcular métricas más complejas.
Como hemos visto, el modelo base (con todos los parámetros predefinidos) de la regresión logística obtiene poco más de un 84% de precisión. Sin embargo, el hecho de modificar los parámetros del modelo podría suponer una mejora (o empeoramiento) significativos de los resultados. Existen varias estrategias como los modelos regularizados.