A pesar de llamarse regresión logística, este algoritmo se usa principalmente para clasificación, no para regresión.
Su tarea típica es responder preguntas del tipo:
Es uno de los modelos más importantes para comenzar porque combina dos virtudes: es relativamente simple y además produce probabilidades fáciles de interpretar.
La regresión logística estima la probabilidad de que un caso pertenezca a la clase positiva.
Por ejemplo, si el modelo devuelve 0.82, podemos interpretarlo como:
“según lo aprendido, hay una probabilidad de 82% de que este caso sea positivo”.
Luego, para convertir esa probabilidad en una clase, se suele usar un umbral. En muchos casos, el umbral por defecto es 0.5:
Decir solo “sí” o “no” a veces es poco informativo. No es lo mismo una predicción positiva con probabilidad 0.51 que otra con probabilidad 0.97.
La regresión logística no solo clasifica, sino que también nos permite medir qué tan convencido parece estar el modelo.
Eso es muy valioso cuando necesitamos:
La regresión logística intenta separar las clases mediante una frontera de decisión. En problemas con pocas variables, esa frontera suele ser una línea o un plano.
No memoriza ejemplos como KNN ni construye reglas en forma de árbol. En cambio, aprende una combinación de variables que empuja la probabilidad hacia 0 o hacia 1.
La regresión logística suele comportarse bien cuando:
Por eso sigue siendo un modelo de referencia incluso cuando ya conocemos algoritmos más sofisticados.
Vamos a predecir si un cliente comprará en función de dos variables:
Entrenaremos una regresión logística y veremos tanto la clase predicha como la probabilidad estimada.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
clientes = pd.DataFrame({
"paginas_vistas": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 8],
"minutos_sitio": [1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 3, 4],
"compra": [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1]
})
X = clientes[["paginas_vistas", "minutos_sitio"]]
y = clientes["compra"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
modelo = LogisticRegression()
modelo.fit(X_train, y_train)
y_pred = modelo.predict(X_test)
print("Valores reales:", y_test.values)
print("Predicciones:", y_pred)
print("Exactitud:", accuracy_score(y_test, y_pred))
nuevo_cliente = pd.DataFrame({
"paginas_vistas": [7],
"minutos_sitio": [4]
})
prediccion = modelo.predict(nuevo_cliente)[0]
probabilidad = modelo.predict_proba(nuevo_cliente)[0, 1]
print("Predicción para el nuevo cliente:", prediccion)
print(f"Probabilidad de compra: {probabilidad:.3f}")
Salida resumida esperada:
Valores reales: [...]
Predicciones: [...]
Exactitud: ...
Predicción para el nuevo cliente: ...
Probabilidad de compra: ...
El modelo aprende, a partir de los datos de entrenamiento, qué combinación de páginas vistas y minutos en el sitio suele corresponder a clientes que compran.
Cuando aparece un caso nuevo, no busca vecinos ni aplica reglas de árbol. Calcula una probabilidad y después la convierte en una clase.
predict(...): devuelve la clase final, por ejemplo 0 o 1.predict_proba(...): devuelve probabilidades para cada clase.En problemas reales, muchas veces la probabilidad es tan importante como la clase. Permite ajustar decisiones según el contexto.
LogisticRegression(): crea el modelo de clasificación binaria.fit(...): ajusta el modelo usando ejemplos conocidos.predict(X_test): genera clases predichas para el conjunto de prueba.accuracy_score(...): mide cuántas predicciones fueron correctas.predict_proba(...): entrega la confianza estimada para cada clase.