Regresión logística en Python: predice sí o no
Hay preguntas que solo se contestan con sí o no: ¿este correo es spam?, ¿el cliente va a comprar?, ¿voy a pasar el examen? Para eso existe la regresión logística, la prima de la regresión lineal que vimos en el artículo pasado, y hoy aprendemos a usarla en Python.
Aunque lleve “regresión” en el nombre, en realidad es un clasificador. El correo es spam o no lo es, el cliente compra o no compra, el alumno aprueba o reprueba. No hay punto medio, y para eso la línea recta de la regresión lineal no sirve, porque se pasa de 0 y de 1 sin ningún problema.

Cómo funciona
El truco es agarrar el mismo cálculo de siempre (w·x + b) y pasarlo por la función sigmoide, que es una curva en forma de S que aplasta cualquier número para dejarlo entre 0 y 1. Ese resultado se lee como una probabilidad: si da 0.8, el modelo cree que hay un 80% de que la respuesta sea sí. Por defecto, si pasa de 0.5 dice que sí y si no, dice que no.
Ejemplo: ¿el visitante va a comprar?
Imagina que tienes una tienda en línea y anotaste cuántos minutos estuvo cada visitante y cuántos productos vio. Después de la visita sabes si compró o no. Con eso entrenamos el modelo:
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# [minutos en la tienda, productos vistos] -> 1 = compró, 0 = no compró
X = np.array([[1,1],[2,1],[2,3],[3,2],[4,2],[5,4],
[6,3],[7,5],[8,6],[9,5],[10,7],[12,8]])
y = np.array([0,0,0,0,0,0,1,0,1,1,1,1])
modelo = LogisticRegression()
modelo.fit(X, y)
print("Accuracy:", accuracy_score(y, modelo.predict(X)))
nuevo = [[8, 5]]
print("Predicción:", modelo.predict(nuevo)[0])
print("Probabilidades:", modelo.predict_proba(nuevo).round(2))
El accuracy sale en 0.83, o sea que acierta 10 de 12 casos. Ojo con ese número, lo medimos con los mismos datos que usamos para entrenar, así que es optimista. Con datos reales conviene separar una parte para probar, como vimos en el artículo anterior. Para un visitante que estuvo 8 minutos y vio 5 productos, el modelo predice que sí compra, con 80% de probabilidad. Esa probabilidad es lo más útil, porque con ella decides si le muestras un descuento o lo dejas en paz.
Ejemplo: ¿apruebo el examen?
Todos hemos calculado esto la noche antes de un examen: “si estudio tres horas, creo que paso”. Con Python:
horas = np.array([[0.5],[1],[1.5],[2],[3],[3.5],[4],[5],[6]])
aprobo = np.array([0,0,0,0,1,0,1,1,1])
m = LogisticRegression().fit(horas, aprobo)
for h in [1, 2.5, 4]:
print(h, "horas ->", round(m.predict_proba([[h]])[0][1], 2))
Con 1 hora la probabilidad de aprobar es 8%, con 2.5 horas sube a 31% y con 4 horas llega a 70%. Fíjate que no salta de golpe de 0 a 1, sube poco a poco, y esa curva suave es justo la sigmoide trabajando.
Conclusión
La regresión logística es de los algoritmos más usados en la práctica porque es rápida, se entiende fácil y además te da probabilidades, no solo un sí o un no. Su límite es que separa los casos con una frontera recta, así que si tus datos están muy revueltos necesitarás algo más potente, y de eso hablaremos en los siguientes artículos.
Ejemplos para practicar: marcar un correo como spam según las palabras que contiene, decidir si una transacción con tarjeta es fraude, o predecir si un cliente va a cancelar su suscripción. En todos la pregunta es la misma, una respuesta de sí o no, y la probabilidad te dice qué tan segura es.
En el siguiente artículo vamos con los árboles de decisión, que llegan a una respuesta haciendo una pregunta tras otra.