Regresión Logística: la recta que se dobla en curva
Introducción
La regresión logística tiene un nombre que confunde: parece que tendría que predecir valores continuos como cualquier regresión, pero en realidad se usa para clasificar.
La clave para entenderla es saber que internamente sigue siendo una recta. La diferencia es lo que le pasa a esa recta después: se le aplica una función que la transforma en una curva que vale siempre entre 0 y 1.
Eso es la regresión logística:
Dos pasos simples: primero una recta, después una sigmoide.
Si todavía no conocés el concepto de peso
w, sesgoby función de costo, te recomiendo leer primero: Derivada del Error Cuadrático Medio con Gradiente Descendente
1. El problema: predecir si un estudiante aprueba
Tenemos datos de 10 estudiantes. Solo conocemos una variable: cuántas horas estudiaron. El objetivo es predecir si aprobaron o no.
Horas: 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
Aprueba: 0 0 0 0 1 1 0 1 1 1
La variable de salida es binaria: 0 o 1. No hay valores intermedios.
2. Por qué no alcanza con una recta
La regresión lineal predice cualquier número real:
Si usamos w = 1.5 y b = -3.5, la recta da estos valores:
| Horas | z = 1.5·x − 3.5 | Real |
|---|---|---|
| 0.5 | −2.75 | 0 |
| 1.0 | −2.00 | 0 |
| 1.5 | −1.25 | 0 |
| 2.0 | −0.50 | 0 |
| 2.5 | +0.25 | 1 |
| 3.0 | +1.00 | 1 |
| 3.5 | +1.75 | 0 |
| 4.0 | +2.50 | 1 |
| 4.5 | +3.25 | 1 |
| 5.0 | +4.00 | 1 |
Los valores de z van de −2.75 a +4.00.
No podemos interpretar eso como probabilidad de aprobar.
El problema no es la recta en sí. El problema es que necesitamos que la salida esté entre 0 y 1.
3. La función sigmoide: comprimir z entre 0 y 1
La sigmoide toma cualquier número real y lo transforma en un valor entre 0 y 1:
Propiedades clave:
- Si
zes muy grande (positivo) → σ(z) → 1 - Si
zes muy pequeño (negativo) → σ(z) → 0 - Si
z = 0→ σ(z) = 0.5 exacto
Aplicándola a los valores de z anteriores:
| Horas | z | σ(z) | Predicción | Real | ¿OK? |
|---|---|---|---|---|---|
| 0.5 | −2.75 | 0.06 | 0 | 0 | ✓ |
| 1.0 | −2.00 | 0.12 | 0 | 0 | ✓ |
| 1.5 | −1.25 | 0.22 | 0 | 0 | ✓ |
| 2.0 | −0.50 | 0.38 | 0 | 0 | ✓ |
| 2.5 | +0.25 | 0.56 | 1 | 1 | ✓ |
| 3.0 | +1.00 | 0.73 | 1 | 1 | ✓ |
| 3.5 | +1.75 | 0.85 | 1 | 0 | ✗ |
| 4.0 | +2.50 | 0.92 | 1 | 1 | ✓ |
| 4.5 | +3.25 | 0.96 | 1 | 1 | ✓ |
| 5.0 | +4.00 | 0.98 | 1 | 1 | ✓ |
9 de 10 correctos con w y b elegidos a mano.
4. La frontera de decisión
El momento donde σ(z) = 0.5 es el punto de mayor incertidumbre.
Eso ocurre exactamente cuando z = 0:
Esa es la frontera de decisión:
- Menos de 2.33 horas → σ(z) < 0.5 → predice 0 (desaprueba)
- Más de 2.33 horas → σ(z) > 0.5 → predice 1 (aprueba)
5. El gráfico que lo explica todo
El gráfico de abajo muestra los dos pasos lado a lado:
Izquierda: la recta z = w·x + b. Cruza cero en x ≈ 2.33.
Derecha: la sigmoide σ(z). En x ≈ 2.33 vale exactamente 0.5.
La recta decide el punto de corte. La sigmoide lo convierte en probabilidad.

6. Código paso a paso
Setup y datos
import numpy as np
import matplotlib.pyplot as plt
horas = np.array([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0])
aprueba = np.array([ 0, 0, 0, 0, 1, 1, 0, 1, 1, 1], dtype=float)
Parte lineal
w = 1.5
b = -3.5
x_linea = np.linspace(0, 6, 200)
z_continuo = w * x_linea + b
z_datos = w * horas + b
Función sigmoide
def sigmoid(z):
return 1 / (1 + np.exp(-z))
y_sigmoide = sigmoid(z_continuo)
prob_datos = sigmoid(z_datos)
Predicciones finales
for h, y in zip(horas, aprueba):
zi = w * h + b
prob = sigmoid(zi)
pred = 1 if prob >= 0.5 else 0
ok = "✓" if pred == int(y) else "✗"
print(f" horas={h:.1f} z={zi:+.2f} → σ={prob:.2f} pred={pred} real={int(y)} {ok}")
Resultado:
horas=0.5 z=-2.75 → σ=0.06 pred=0 real=0 ✓
horas=1.0 z=-2.00 → σ=0.12 pred=0 real=0 ✓
horas=1.5 z=-1.25 → σ=0.22 pred=0 real=0 ✓
horas=2.0 z=-0.50 → σ=0.38 pred=0 real=0 ✓
horas=2.5 z=+0.25 → σ=0.56 pred=1 real=1 ✓
horas=3.0 z=+1.00 → σ=0.73 pred=1 real=1 ✓
horas=3.5 z=+1.75 → σ=0.85 pred=1 real=0 ✗
horas=4.0 z=+2.50 → σ=0.92 pred=1 real=1 ✓
horas=4.5 z=+3.25 → σ=0.96 pred=1 real=1 ✓
horas=5.0 z=+4.00 → σ=0.98 pred=1 real=1 ✓
7. Resumen del proceso
x (horas)
↓
z = w·x + b ← parte lineal (puede ser cualquier número)
↓
σ(z) = 1/(1+e⁻ᶻ) ← sigmoide (siempre entre 0 y 1)
↓
si σ(z) ≥ 0.5 → clase 1
si σ(z) < 0.5 → clase 0
Conclusión
La regresión logística y la regresión lineal comparten la misma base: z = w·x + b.
La diferencia es que la logística agrega un paso más: pasar z por la función sigmoide para convertirlo en una probabilidad interpretable.
| Paso | Qué hace | Resultado |
|---|---|---|
z = w·x + b | calcula la combinación lineal | cualquier número real |
σ(z) | aplica la sigmoide | valor entre 0 y 1 |
pred = (σ ≥ 0.5) | decide la clase | 0 o 1 |
La frontera de decisión siempre está donde z = 0, es decir donde σ(z) = 0.5.
En posts anteriores usamos gradiente descendente para encontrar
wybóptimos minimizando el error. En regresión logística se hace lo mismo, pero con una función de pérdida diferente llamada cross-entropy. Entendiendo el error respecto al peso: de la parábola a la derivada
Frase final para el post
La regresión logística no reemplaza la recta. La usa como base y le agrega la sigmoide para convertir una línea en una frontera de decisión.