¿Qué mejora estamos premiando?
Un clasificador documental pasa del 92,3% al 96,5% de aciertos. Parece fácil aprobarlo, pero la nueva versión no reconoce ningún documento de la categoría menos frecuente. No hay contradicción: las mejoras de la mayoría compensan numéricamente la pérdida de una clase. Estudiamos qué pregunta responde cada métrica con datos construidos, no de clientes ni productos EL-AI.
Es clasificación de etiqueta única: cada documento tiene una clase real A, B o C y una predicción. Ambas versiones usan el mismo test: 900 A, 90 B y 10 C. El soporte cuenta casos reales, no predicciones. Aislamos la agregación comparando decisiones ya tomadas, sin estudiar umbrales ni calidad de probabilidades.
La matriz muestra lo que oculta el porcentaje
Las filas son clases reales y las columnas predicciones; la diagonal cuenta aciertos. La primera fila de A significa 850 A reconocidos, 45 confundidos con B y 5 con C. B reconoce 895 A, pero manda los diez C a A. Los aciertos suben de 850+65+8=923 a 895+70+0=965. La exactitud divide entre mil: pondera documentos por igual, sin prometer protección de cada clase.
| Versión / real | A | B | C |
|---|---|---|---|
| A / A | 850 | 45 | 5 |
| A / B | 20 | 65 | 5 |
| A / C | 0 | 2 | 8 |
| B / A | 895 | 5 | 0 |
| B / B | 20 | 70 | 0 |
| B / C | 10 | 0 | 0 |
Una clase cada vez: precisión, exhaustividad y F1
Para clase c, TP son aciertos de la diagonal; FP, otras filas de su columna; FN, otras columnas de su fila. La precisión TP/(TP+FP) pregunta cuántas propuestas son correctas. La exhaustividad TP/(TP+FN) pregunta cuántos casos reales encontramos. Proponer pocos puede mantener precisión mientras se omiten muchos casos verdaderos.
F1 es media armónica de precisión y exhaustividad; usamos 2TP/(2TP+FP+FN). Para C en A, TP=8, FP=10 y FN=2: F1=16/28≈0,571429, precisión 8/18 y exhaustividad 8/10=0,8. En B, TP=0, FP=0, FN=10: F1 y exhaustividad cero. La precisión es indefinida porque no se propone C; F1 sí está definido, con denominador diez. Las convenciones de división por cero no deben ocultar pérdida de cobertura.
Tres agregaciones, tres preguntas
Macro-F1 calcula primero F1 para cada una de K clases y después la media aritmética, con peso 1/K. A da aproximadamente (0,960452;0,643564;0,571429), media 0,725148; B da (0,980822;0,848485;0), media 0,609769. No es la media armónica de precisión y exhaustividad ya promediadas: F1 no es lineal. B mejora dos clases pero pierde la tercera; macro lo muestra.
La media ponderada usa soportes 0,90, 0,09 y 0,01: aproximadamente 0,928042 para A y 0,959103 para B. Responde otra pregunta, dando solo 1% de peso a C. Micro suma TP, FP y FN antes del cociente. Con etiqueta única y todas las clases, cada error añade un FP y un FN: micro-F1=2T/[2T+2(N−T)]=T/N, exactitud. La equivalencia no se generaliza sin más a multietiqueta o subconjuntos de clases.
| Métrica | A | B |
|---|---|---|
| accuracy / micro | 0.923 | 0.965 |
| macro-F1 | 0.725148 | 0.609769 |
| weighted-F1 | 0.928042 | 0.959103 |
| recall C | 0.8 | 0 |

Ni macro decide por nosotros
Igual peso por clase no implica igual coste del error. Macro puede exagerar una categoría marginal o seguir infraponderando un evento crítico. Diez casos C dan una estimación menos estable que novecientos A. El gráfico cuenta exactamente este dataset, no demuestra superioridad futura. Faltan pruebas independientes, soportes, incertidumbre y criterios por clase fijados antes de seleccionar.
El código suma filas y columnas y reconstruye cada cociente; el archivo conserva ambas matrices y aserciones de la paradoja. No ejecutamos scikit-learn: consultamos definiciones y convenciones e implementamos los conteos en Python. Procesar K×K requiere trabajo proporcional a K²; N etiquetas construyen la matriz en una pasada. Ningún tiempo se presenta como benchmark del servicio.
¿Qué cambia si un error cuesta más?
Asignamos coste sintético de 100 unidades a cada error sobre C real y una a otros errores; aciertos, cero. No son costes empresariales medidos. A falla 50 A, 25 B y 2 C: 50+25+2·100=275. B falla 5 A, 20 B y 10 C: 5+20+10·100=1025. Sobre mil documentos son 0,275 y 1,025 unidades por documento, comprobadas por el código. La versión más exacta resulta peor según esta función de coste.
El coste medio suma cada conteo por su coste y divide entre N. Macro-F1 no lo estima: ambos prefieren A aquí por razones distintas. Si todo error costara uno, el coste sería 1−exactitud y preferiría B. Hace falta un objetivo operativo, no una métrica supuestamente superior siempre. Duplicar documentos tampoco cambia los cocientes: la puntuación sola no revela cuánta evidencia independiente existe.
¿Mejor para quién y en qué casos?
B mejora exactitud y F1 ponderado, empeora macro y no reconoce C en este test: todo es cierto a la vez. Evaluar un modelo especializado exige población, clases, costes y cobertura requerida, leyendo matriz, soportes e indicadores juntos. El total puede mejorar mientras el servicio pierde una capacidad que necesitamos conservar.
Fuentes y cálculos
scikit-learn 1.9.1 — F1, averaging and undefined cases.
scikit-learn — multiclass aggregation definitions.
m=[[895,5,0],[20,70,0],[10,0,0]]
f=[];N=sum(map(sum,m))
for c in range(3):
tp=m[c][c];fp=sum(row[c] for row in m)-tp;fn=sum(m[c])-tp
f.append(2*tp/(2*tp+fp+fn))
print('accuracy',sum(m[c][c] for c in range(3))/N)
print('per-class F1',f,'macro',sum(f)/3)
assert f[2]==0
Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 24 de octubre de 2026.

