Cómo medir la precisión de una clasificación con IA usando una matriz de confusión
La IA puede etiquetar tickets de soporte rápidamente, pero conviene medir sus etiquetas frente a un pequeño conjunto de referencia etiquetado manualmente antes de confiar en ellas. Esta guía usa un ejemplo sintético, compara las predicciones de la IA con las etiquetas conocidas y calcula la precisión y una matriz de confusión con Python.
Contenido revisado 2026.09.21Incluye archivos de ejemplo
Ver el índice
La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English
Para quién esPara personas que usan un asistente de chat con IA para clasificar textos cortos, como tickets de soporte, y quieren medir la precisión de las etiquetas.
Preparación
Python 3.12
Conocimientos básicos sobre archivos CSV y etiquetas de clasificación
01Por qué medir la clasificación con IA en lugar de confiar en unos pocos ejemplos
Un asistente de chat con IA puede asignar categorías a tickets de soporte, correos, comentarios o notas breves, pero unos pocos ejemplos convincentes no muestran la precisión global del clasificador. La pregunta útil no es si algunas predicciones parecen razonables, sino con qué frecuencia coincide la IA con un conjunto de referencia previamente etiquetado por una persona.
Un pequeño conjunto de prueba etiquetado manualmente proporciona una respuesta de referencia fija. Puedes comparar cada predicción de la IA con esa referencia, calcular la precisión y revisar una matriz de confusión para ver qué clases se mezclan. La precisión ofrece una cifra global, mientras que la matriz de confusión muestra el patrón de los errores.
02Crea un pequeño conjunto sintético etiquetado
Los siguientes ocho tickets de soporte son ejemplos sintéticos creados únicamente para este tutorial. Usa tres etiquetas: billing para problemas de pago o facturación, login para problemas de acceso y bug para comportamientos del software que parecen defectuosos. La columna hand_label contiene la etiqueta de referencia asignada antes de pedir la clasificación a la IA.
id
ticket
hand_label
T1
I was charged twice for the same order.
billing
T2
My password reset link says it has expired.
login
T3
The app closes whenever I open the reports page.
bug
T4
Where can I download last month's invoice?
billing
T5
I cannot sign in after changing my email address.
login
T6
The export button does nothing when I click it.
bug
T7
My card was declined but the bank says it is fine.
billing
T8
The dashboard shows a blank screen after login.
bug
Como el conjunto es pequeño, todas las etiquetas esperadas se pueden revisar manualmente. Esto lo hace adecuado para comprobar primero el propio flujo de evaluación antes de aplicar el mismo método a una muestra etiquetada más grande.
03Pide a la IA que devuelva una sola etiqueta controlada por ticket
Los prompts de clasificación son más fáciles de evaluar cuando las etiquetas permitidas y el formato de salida están fijados. No pidas explicaciones de texto libre salvo que las necesites por separado, porque el contenido adicional dificulta la comparación.
Define las únicas etiquetas permitidas: billing, login y bug.
Incluye una definición breve de cada etiqueta.
Exige exactamente una etiqueta por ticket.
Indica que el ID del ticket debe conservarse sin cambios.
Pide que no invente nuevas categorías cuando un ticket sea ambiguo.
04Compara la salida de la IA con las etiquetas de referencia
Supongamos que la IA produce las siguientes predicciones sintéticas. Seis son correctas. T7 se predice como login aunque su etiqueta de referencia es billing, y T8 se predice como login aunque su etiqueta de referencia es bug.
id
hand_label
ai_label
correct
T1
billing
billing
yes
T2
login
login
yes
T3
bug
bug
yes
T4
billing
billing
yes
T5
login
login
yes
T6
bug
bug
yes
T7
billing
login
no
T8
bug
login
no
Por tanto, la precisión global es de 6 predicciones correctas de 8 tickets. Calculado a mano, 6 ÷ 8 = 0.75, así que la precisión es del 75%.
05Lee la matriz de confusión en lugar de mirar solo la precisión
Una matriz de confusión cuenta las combinaciones entre etiquetas de referencia y etiquetas predichas. En este ejemplo, las filas representan hand_label y las columnas las etiquetas predichas por la IA. Las celdas diagonales son predicciones correctas y las celdas fuera de la diagonal son errores.
hand \ predicted
billing
login
bug
billing
2
1
0
login
0
2
0
bug
0
1
2
La matriz explica inmediatamente los dos errores. Un ticket billing fue clasificado como login y un ticket bug también fue clasificado como login. En este pequeño ejemplo, la IA no predijo incorrectamente billing o bug para ningún ticket cuya referencia fuera login. Esto no demuestra que login sea en general la clase más fácil; solo describe estos ocho casos sintéticos.
06Calcula la precisión y la matriz con Python
Guarda los datos comparados en ticket_labels.csv con las columnas id, hand_label y ai_label. El siguiente script valida las etiquetas, cuenta las predicciones correctas, construye la matriz de confusión y escribe un informe en outputs/classification_report.txt. Usa únicamente la biblioteca estándar de Python 3.12, no modifica el archivo de entrada y se detiene si el archivo de salida ya existe.
python
import csv
from collections import Counter
from pathlib import Path
INPUT_FILE = Path("ticket_labels.csv")
OUTPUT_DIR = Path("outputs")
OUTPUT_FILE = OUTPUT_DIR / "classification_report.txt"
LABELS = ["billing", "login", "bug"]
def main():
if not INPUT_FILE.is_file():
raise SystemExit(f"Input file not found: {INPUT_FILE}")
if OUTPUT_FILE.exists():
raise SystemExit(f"Output already exists: {OUTPUT_FILE}")
rows = []
with INPUT_FILE.open("r", encoding="utf-8", newline="") as file:
reader = csv.DictReader(file)
required = {"id", "hand_label", "ai_label"}
if reader.fieldnames is None or not required.issubset(reader.fieldnames):
raise SystemExit("ticket_labels.csv is missing required columns.")
for row_number, row in enumerate(reader, start=2):
hand = row["hand_label"].strip()
predicted = row["ai_label"].strip()
if hand not in LABELS:
raise SystemExit(f"Invalid hand_label on row {row_number}: {hand}")
if predicted not in LABELS:
raise SystemExit(f"Invalid ai_label on row {row_number}: {predicted}")
rows.append((row["id"].strip(), hand, predicted))
if not rows:
raise SystemExit("No labeled rows found.")
correct = sum(1 for _, hand, predicted in rows if hand == predicted)
accuracy = correct / len(rows)
counts = Counter((hand, predicted) for _, hand, predicted in rows)
report = []
report.append(f"tickets={len(rows)}")
report.append(f"correct={correct}")
report.append(f"accuracy={accuracy:.3f}")
report.append("")
report.append("confusion_matrix")
report.append("hand\\predicted\t" + "\t".join(LABELS))
for hand in LABELS:
values = [str(counts[(hand, predicted)]) for predicted in LABELS]
report.append(hand + "\t" + "\t".join(values))
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
OUTPUT_FILE.write_text("\n".join(report) + "\n", encoding="utf-8")
print(f"Wrote: {OUTPUT_FILE}")
if __name__ == "__main__":
main()
07Revisa los errores y los límites antes de usar el clasificador
Los dos tickets incorrectos merecen más atención que la cifra del 75% por sí sola. T7 menciona card, por lo que un prompt débil podría asociarlo con otro tipo de problema, aunque en este esquema de referencia pertenece a billing. T8 contiene la expresión after login, pero el problema real informado es que el dashboard muestra una pantalla en blanco, por lo que la referencia lo clasifica como bug. Estos casos muestran por qué las definiciones de categorías deben describir el problema subyacente y no depender de palabras aisladas.
Revisa manualmente cada desacuerdo antes de cambiar el prompt o las definiciones de etiquetas.
Mantén las mismas definiciones de etiquetas al comparar distintos prompts o ejecuciones de IA.
No mezcles ejemplos del conjunto de prueba dentro de los ejemplos de entrenamiento del prompt si quieres conservar una evaluación independiente.
No uses únicamente la precisión global cuando las clases estén desequilibradas o algunos errores sean más importantes que otros.
Amplía la muestra etiquetada manualmente antes de sacar conclusiones sobre el rendimiento en producción.
Una matriz de confusión es evidencia descriptiva del conjunto probado, no una prueba del rendimiento futuro. Un ejemplo pequeño y equilibrado es útil para aprender el flujo de evaluación, pero una evaluación real necesita suficientes tickets etiquetados manualmente para representar el lenguaje real, los casos ambiguos y las frecuencias de clase.
Registro de ejecución y verificación
2026-09-21 · hand-checked example · Python 3.12
Los ocho tickets de soporte y sus etiquetas son ejemplos sintéticos.
El ejemplo contiene 8 tickets y 6 predicciones correctas de la IA.
La precisión se comprobó a mano: 6 ÷ 8 = 0.75, es decir, 75%.
La fila billing de la matriz de confusión se comprobó a mano: 2 predicciones billing, 1 login y 0 bug.
La fila login se comprobó a mano: 0 predicciones billing, 2 login y 0 bug.
La fila bug se comprobó a mano: 0 predicciones billing, 1 login y 2 bug.
La suma de la matriz de confusión es 8, igual que el número de tickets del ejemplo.
La lógica Python mostrada usa únicamente csv, collections y pathlib de la biblioteca estándar y evita sobrescribir un archivo de salida existente.
Límites de la verificación
El código Python de este artículo no fue ejecutado por el autor; su comportamiento se revisó manualmente.
Este conjunto sintético de ocho tickets es demasiado pequeño para estimar de forma fiable la precisión real en producción.
La precisión puede ocultar problemas específicos de determinadas clases, especialmente cuando las frecuencias de clase están desequilibradas.
El resultado medido depende de la calidad y consistencia del conjunto de referencia etiquetado manualmente.
Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.
Convierte “automatiza esto” en una descripción de tarea ejecutable. Adjunta una muestra sintética sin datos sensibles y un resultado esperado comprobado manualmente para completar una solicitud de script que totalice registros de trabajo por equipo.
Comprueba una función de agregación con cuatro filas que puedes calcular manualmente y 12 unit tests. Verifica no solo valores normales, sino también entrada vacía, cero, decimales y entrada no válida.
Divide un resumen plausible en hechos, cálculos e interpretaciones. Recalcula proporciones y promedios a partir de datos mensuales sintéticos y reescribe las frases con fuentes faltantes o causas exageradas para convertirlas en afirmaciones comprobables.
Trata una expresión regular generada por IA como un borrador, no como una regla terminada. Crea una pequeña tabla de pruebas sintéticas, compara las coincidencias esperadas con las reales, corrige el patrón y guarda un informe de revisión antes de usarlo con datos reales.