12. Cómo medir si un modelo es bueno

12.1 Entrenar no alcanza: también hay que evaluar

En Machine Learning no basta con construir un modelo y lograr que produzca predicciones. La pregunta importante es otra: ¿qué tan buenas son esas predicciones?

Si no evaluamos el modelo con un criterio claro, podemos llegar a conclusiones equivocadas. Un programa puede devolver respuestas sin errores técnicos y, aun así, ser un mal modelo desde el punto de vista práctico.

Por eso, después de entrenar, siempre debemos medir su rendimiento sobre datos que no haya visto durante el aprendizaje.

12.2 Qué significa que un modelo sea “bueno”

Un modelo bueno no es simplemente el que acierta mucho en términos generales. Un modelo bueno es el que responde bien al objetivo del problema.

Por ejemplo:

  • en un filtro de spam, queremos detectar correos no deseados sin bloquear mensajes importantes;
  • en un sistema médico, detectar correctamente casos positivos puede ser más importante que tener una exactitud global alta;
  • en una tienda online, quizá interese identificar con precisión a los clientes con alta probabilidad de compra.

Esto significa que la calidad del modelo depende del contexto, no solo de un número.

12.3 La métrica más conocida: exactitud

La métrica más simple es la exactitud o accuracy. Indica qué proporción de predicciones fue correcta.

Su idea es directa:

  • si un modelo evaluó 100 casos;
  • y acertó 85;
  • su exactitud es 0.85, es decir, 85%.

En Scikit-learn se calcula con accuracy_score.

Es una métrica muy útil para empezar porque se entiende rápido. El problema es que no siempre cuenta toda la historia.

12.4 Por qué la exactitud puede engañar

Imaginemos un problema donde solo 5 de cada 100 clientes realmente compran. Un modelo muy malo podría predecir siempre “no compra” y acertar 95 veces sobre 100.

Ese modelo tendría 95% de exactitud, pero sería inútil para detectar compradores reales.

Esta es una idea central del tema: una métrica aislada puede dar una sensación falsa de éxito.

Por eso, cuando el problema lo requiere, conviene mirar además otras métricas como:

  • precisión;
  • recall;
  • F1.

En el próximo tema las estudiaremos con más detalle. Aquí las vamos a introducir para que veas por qué son necesarias.

12.5 Ejemplo muy claro: predecir si un cliente comprará

Supongamos que una empresa registra dos datos de cada cliente:

  • la cantidad de visitas al sitio;
  • el tiempo total de permanencia.

Queremos entrenar un modelo que prediga si ese cliente hará una compra. Usaremos regresión logística y luego mediremos el resultado con varias métricas.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

clientes = pd.DataFrame({
    "visitas": [1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9],
    "tiempo":  [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7],
    "compra":  [0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1]
})

X = clientes[["visitas", "tiempo"]]
y = clientes["compra"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, 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))
print("Precisión:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("F1:", f1_score(y_test, y_pred))

nuevo_cliente = pd.DataFrame({
    "visitas": [6],
    "tiempo": [5]
})

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: ...
Precisión: ...
Recall: ...
F1: ...
Predicción para el nuevo cliente: 1
Probabilidad de compra: ...

12.6 Qué estamos midiendo en el ejemplo

En el programa anterior aparecen cuatro métricas:

  • accuracy_score: mide cuántas predicciones fueron correctas en total.
  • precision_score: mide cuántos de los casos predichos como positivos realmente lo eran.
  • recall_score: mide cuántos positivos reales logró detectar el modelo.
  • f1_score: combina precisión y recall en una sola medida.

No hace falta memorizar todavía cada fórmula. Lo importante por ahora es entender que un modelo puede verse bien bajo una métrica y regular bajo otra.

12.7 Explicación detallada del código

  • clientes = pd.DataFrame(...): crea un dataset pequeño, explícito y fácil de interpretar.
  • X: contiene las variables de entrada, en este caso visitas y tiempo.
  • y: contiene la variable objetivo, que indica si hubo compra o no.
  • train_test_split(..., stratify=y): separa entrenamiento y prueba manteniendo una proporción similar de clases.
  • LogisticRegression(): crea un modelo de clasificación binaria.
  • modelo.fit(...): hace que el modelo aprenda patrones a partir de los datos de entrenamiento.
  • modelo.predict(X_test): genera predicciones sobre datos no vistos.
  • modelo.predict_proba(...): devuelve probabilidades estimadas para cada clase.

La combinación de predicción por clase y predicción por probabilidad es muy útil. La clase dice “qué decisión tomaría el modelo”; la probabilidad dice “qué tan confiado parece estar”.

12.8 La importancia de medir con datos no vistos

Si calculáramos estas métricas sobre el mismo conjunto usado para entrenar, podríamos sobreestimar el rendimiento real. El modelo ya vio esos datos y pudo adaptarse a ellos.

Por eso evaluamos sobre conjunto de prueba. La pregunta que intentamos responder no es “¿qué tan bien recuerda lo que vio?”, sino “¿qué tan bien generaliza ante casos nuevos?”.

12.9 Qué métrica conviene mirar primero

No existe una única respuesta universal, pero estas reglas sirven como orientación inicial:

  • si las clases están equilibradas y el costo de los errores es parecido, la exactitud puede ser una primera referencia útil;
  • si equivocarse en los positivos importa mucho, conviene prestar atención a recall;
  • si importa que los positivos predichos sean realmente positivos, conviene mirar precisión;
  • si necesitas una visión equilibrada entre ambas, F1 suele ser una buena síntesis.

La clave no es elegir la métrica “más famosa”, sino la más alineada con el problema real.

12.10 Errores frecuentes al evaluar modelos

  • Mirar solo accuracy: puede ocultar fallas importantes, especialmente si las clases están desbalanceadas.
  • Evaluar sobre entrenamiento: da una imagen demasiado optimista del modelo.
  • No entender el costo de los errores: no todos los errores tienen la misma gravedad.
  • Comparar modelos con métricas distintas sin criterio: conviene fijar de antemano qué métrica será la principal.

12.11 Qué deberías retener

  • Entrenar un modelo no es suficiente: hay que medirlo.
  • La exactitud es útil, pero no siempre alcanza para decidir si un modelo es bueno.
  • La elección de la métrica depende del problema y del costo de cada tipo de error.
  • Las métricas deben calcularse sobre datos no vistos durante el entrenamiento.
  • En clasificación, precisión, recall y F1 ayudan a obtener una evaluación más completa.

12.12 Lo que sigue

En este tema viste la idea general de evaluación y por qué una sola métrica puede resultar insuficiente. En el próximo profundizaremos en la matriz de confusión y en el significado exacto de precisión, recall y F1, que son herramientas esenciales para entender el comportamiento real de un clasificador.