17. Regresión logística explicada de forma simple

17.1 Un nombre engañoso

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:

  • ¿comprará o no comprará?
  • ¿aprobará o no aprobará?
  • ¿es spam o no es spam?

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.

17.2 Qué hace realmente este modelo

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:

  • si la probabilidad es mayor o igual que 0.5, predice clase 1;
  • si es menor que 0.5, predice clase 0.

17.3 Por qué es tan útil pensar en probabilidades

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:

  • ordenar casos por prioridad;
  • aplicar distintos umbrales según el negocio;
  • tomar decisiones más finas que un simple sí o no.

17.4 La idea geométrica detrás del modelo

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.

17.5 Cuándo suele funcionar bien

La regresión logística suele comportarse bien cuando:

  • la relación entre variables y probabilidad no es excesivamente compleja;
  • las clases pueden separarse de manera razonable con una frontera relativamente simple;
  • queremos un modelo rápido, sólido y fácil de interpretar.

Por eso sigue siendo un modelo de referencia incluso cuando ya conocemos algoritmos más sofisticados.

17.6 Ejemplo muy claro: probabilidad de compra

Vamos a predecir si un cliente comprará en función de dos variables:

  • cantidad de páginas vistas;
  • minutos dentro del sitio.

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: ...

17.7 Qué está pasando en el ejemplo

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.

17.8 Diferencia entre predict y predict_proba

  • 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.

17.9 Explicación detallada del código

  • 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.

17.10 Ventajas de la regresión logística

  • Es rápida de entrenar.
  • Es relativamente fácil de interpretar.
  • Devuelve probabilidades útiles.
  • Suele ser una muy buena línea de base para clasificación binaria.

17.11 Limitaciones

  • Puede quedarse corta si la relación entre variables y clase es muy compleja.
  • No siempre captura bien fronteras muy irregulares.
  • Suele beneficiarse del escalado cuando las variables tienen magnitudes muy distintas.

17.12 Errores frecuentes

  • Creer que sirve para regresión continua: a pesar del nombre, se usa para clasificación.
  • Mirar solo la clase final: conviene revisar también la probabilidad.
  • Interpretar cualquier probabilidad como certeza: una estimación alta no garantiza que el caso sea correcto.
  • No revisar métricas: la salida del modelo debe evaluarse, no solo ejecutarse.

17.13 Qué deberías retener

  • La regresión logística es un modelo de clasificación binaria.
  • Su gran valor práctico es que entrega probabilidades además de clases.
  • Es simple, rápida y muy útil como modelo inicial.
  • Permite entender bien la idea de frontera de decisión.
  • Es una herramienta fundamental dentro del repertorio básico de Scikit-learn.