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.
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:
Esto significa que la calidad del modelo depende del contexto, no solo de un número.
La métrica más simple es la exactitud o accuracy. Indica qué proporción de predicciones fue correcta.
Su idea es directa:
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.
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:
En el próximo tema las estudiaremos con más detalle. Aquí las vamos a introducir para que veas por qué son necesarias.
Supongamos que una empresa registra dos datos de cada cliente:
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: ...
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.
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”.
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?”.
No existe una única respuesta universal, pero estas reglas sirven como orientación inicial:
La clave no es elegir la métrica “más famosa”, sino la más alineada con el problema real.
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.