ia machine learning python estadística

Regresión Logística: la recta que se dobla en curva

Aprende cómo funciona la regresión logística desde cero: por qué se usa la función sigmoide, qué es la frontera de decisión y cómo pasar de una recta a una predicción binaria en Python.

Por Compujuy · ·
- vistas
Regresión logística función sigmoide Machine Learning Python

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:

y^=σ(wx+b)=11+e(wx+b)\hat{y} = \sigma(w \cdot x + b) = \frac{1}{1 + e^{-(wx+b)}}

Dos pasos simples: primero una recta, después una sigmoide.

Si todavía no conocés el concepto de peso w, sesgo b y 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:

z=wx+bz = w \cdot x + b

Si usamos w = 1.5 y b = -3.5, la recta da estos valores:

Horasz = 1.5·x − 3.5Real
0.5−2.750
1.0−2.000
1.5−1.250
2.0−0.500
2.5+0.251
3.0+1.001
3.5+1.750
4.0+2.501
4.5+3.251
5.0+4.001

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:

σ(z)=11+ez\sigma(z) = \frac{1}{1 + e^{-z}}

Propiedades clave:

Aplicándola a los valores de z anteriores:

Horaszσ(z)PredicciónReal¿OK?
0.5−2.750.0600
1.0−2.000.1200
1.5−1.250.2200
2.0−0.500.3800
2.5+0.250.5611
3.0+1.000.7311
3.5+1.750.8510
4.0+2.500.9211
4.5+3.250.9611
5.0+4.000.9811

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:

z=0wx+b=0x=bw=3.51.52.33 horasz = 0 \Rightarrow wx + b = 0 \Rightarrow x = \frac{-b}{w} = \frac{3.5}{1.5} \approx 2.33 \text{ horas}

Esa es la frontera de decisión:


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.

Recta lineal y sigmoide


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.

PasoQué haceResultado
z = w·x + bcalcula la combinación linealcualquier número real
σ(z)aplica la sigmoidevalor entre 0 y 1
pred = (σ ≥ 0.5)decide la clase0 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 w y b ó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.


Más sobre ia Probar Yagware gratis