7. Aprendizaje supervisado: Clasificación binaria

7.1 Qué significa clasificar

En un problema de clasificación, el objetivo no es predecir un número continuo sino decidir a qué categoría pertenece un caso. Cuando solo existen dos posibles respuestas, hablamos de clasificación binaria.

Ejemplos habituales:

  • Un correo es spam o no spam.
  • Un cliente compra o no compra.
  • Un estudiante aprueba o no aprueba.
  • Una transaccion es fraude o normal.

El modelo aprende a partir de ejemplos ya etiquetados. Es decir, ve muchos casos donde ya sabemos la respuesta correcta y trata de encontrar patrones que le permitan decidir correctamente para nuevos casos.

7.2 Cómo se representan las clases

En Scikit-learn, las dos clases suelen representarse con números. Lo más común es usar:

  • 0 para la clase negativa o ausencia del evento.
  • 1 para la clase positiva o presencia del evento.

Por ejemplo, si queremos predecir si un visitante comprará un curso online:

  • 0: no compro
  • 1: compro

Esta codificacion es simple, pero no significa que una clase sea "mejor" que la otra. Solo es una forma practica de almacenar etiquetas para que el modelo pueda trabajar.

7.3 Variables de entrada y variable objetivo

Como en todo aprendizaje supervisado, necesitamos separar:

  • Caracteristicas: la informacion que usamos para describir cada caso.
  • Etiqueta: la respuesta que queremos predecir.

En este tema usaremos un ejemplo muy claro: predecir si un visitante comprará un curso según dos datos sencillos:

  • paginas_vistas: cuántas páginas del sitio recorrió.
  • minutos_sitio: cuánto tiempo permaneció navegando.

La variable objetivo será compro, con valor 0 o 1.

7.4 Ejemplo completo: predecir si un visitante compra

Vamos a usar LogisticRegression, uno de los modelos más usados para clasificación binaria. Su nombre contiene la palabra "regresión", pero en realidad se utiliza para clasificar y para estimar probabilidades.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Dataset pequeno y facil de interpretar
visitas = pd.DataFrame({
    "paginas_vistas": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    "minutos_sitio":  [1, 1, 2, 2, 3, 4, 5, 5, 6, 7],
    "compro":         [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
})

X = visitas[["paginas_vistas", "minutos_sitio"]]
y = visitas["compro"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

modelo = LogisticRegression()
modelo.fit(X_train, y_train)

y_pred = modelo.predict(X_test)
print("Predicciones:", y_pred)
print("Valores reales:", y_test.values)
print("Exactitud:", accuracy_score(y_test, y_pred))

nuevo_visitante = pd.DataFrame({
    "paginas_vistas": [7],
    "minutos_sitio": [4]
})

prediccion = modelo.predict(nuevo_visitante)[0]
probabilidad = modelo.predict_proba(nuevo_visitante)[0, 1]

print("Prediccion para el nuevo visitante:", prediccion)
print(f"Probabilidad de compra: {probabilidad:.3f}")

Salida resumida esperada:

Predicciones: [1 0 1]
Valores reales: [1 0 1]
Exactitud: 1.0
Prediccion para el nuevo visitante: 1
Probabilidad de compra: 0.7...

7.5 Explicación detallada del programa

  • import pandas as pd: usamos Pandas para construir el dataset en forma de tabla.
  • train_test_split(...): separa los datos en entrenamiento y prueba para poder evaluar al modelo con casos no vistos.
  • stratify=y: mantiene una proporción similar de casos 0 y 1 en ambos conjuntos. Esto es útil cuando queremos que entrenamiento y prueba queden balanceados.
  • modelo = LogisticRegression(): crea el clasificador binario.
  • modelo.fit(X_train, y_train): entrena el modelo con los ejemplos conocidos.
  • modelo.predict(X_test): devuelve directamente la clase predicha, es decir, 0 o 1.
  • accuracy_score(y_test, y_pred): mide qué proporción de predicciones fueron correctas.
  • modelo.predict_proba(...): devuelve probabilidades para cada clase. En particular, [0, 1] toma la probabilidad asociada a la clase positiva.

7.6 La idea más importante: clase y probabilidad

En clasificación binaria conviene distinguir dos salidas del modelo:

  • La clase predicha: la decision final, por ejemplo 0 o 1.
  • La probabilidad: el grado de confianza estimado por el modelo.

Supongamos que el modelo devuelve:

Probabilidad de compra = 0.82

Eso significa que, según lo aprendido, el nuevo caso se parece bastante a los visitantes que terminaron comprando. Luego el algoritmo aplica un umbral, que normalmente es 0.5:

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

Más adelante veremos que ese umbral puede cambiarse según el problema. En medicina, fraude o seguridad esto es muy importante, porque el costo de equivocarse no es igual en todas las situaciones.

7.7 Cómo pensar si el modelo está funcionando bien

En este tema usamos exactitud porque es fácil de entender: indica el porcentaje de aciertos. Si el modelo acierta 8 de 10 casos, su exactitud es 0.8.

Sin embargo, no siempre alcanza con mirar esa métrica. Por ejemplo, si el 95% de los clientes no compra, un modelo que siempre diga "no compra" tendrá alta exactitud, pero será inútil para detectar a quienes sí compran.

Por eso en los próximos temas veremos métricas más finas como:

  • matriz de confusión;
  • precisión;
  • recall;
  • F1-score.

7.8 Errores comunes al comenzar

  • Confundir probabilidad con certeza: una probabilidad de 0.65 no garantiza que el caso pertenezca a la clase 1; solo indica que es más probable según el modelo.
  • Evaluar con los mismos datos usados para entrenar: eso suele dar resultados demasiado optimistas.
  • Usar muy pocos ejemplos: un modelo puede parecer correcto con un dataset pequeno pero fallar con datos reales.
  • Elegir mal las variables: si las características no contienen información útil, el modelo no podrá aprender bien.

7.9 Qué deberías retener de este tema

  • La clasificación binaria resuelve problemas donde solo hay dos respuestas posibles.
  • Las clases suelen codificarse como 0 y 1.
  • Un modelo puede devolver tanto una clase como una probabilidad.
  • Scikit-learn permite entrenar este tipo de modelos con muy poco codigo.
  • Evaluar con datos separados del entrenamiento es obligatorio para no engañarnos con el resultado.