Skip to content
article

Antes de culpar al modelo, mira tus etiquetas

El 18% de nuestras etiquetas estaban mal y nadie lo sabía

Núria Puig@nuria_data

July 28, 2026 · 2 min read

Lo prometí en el otro post, así que aquí va en castellano (y algo de català, perdón).

Teníamos un clasificador de reseñas de clientes con 5 categorías: producto, envío, precio, atención al cliente y "otro". Llevábamos dos meses probando modelos: TF-IDF con regresión logística, un BERT multilingüe afinado y un LLM con few-shot. Los tres se quedaban en 0.78-0.80 de F1. Siempre lo mismo. Sospechoso, ¿no?

El experimento que lo cambió todo (bueno, casi)

Cogimos 500 ejemplos al azar y los volvieron a etiquetar dos personas del equipo, sin ver la etiqueta original. Resultado:

  • En el 18% de los casos, la etiqueta original no coincidía con ninguna de las dos nuevas.
  • La mayoría de errores eran entre "envío" y "atención al cliente". Resulta que la empresa externa que etiquetó al principio tenía la regla "si menciona al repartidor, es atención al cliente". Nosotros pensábamos que era envío.
  • "Otro" era un cajón de sastre: el 40% de los "otro" tenían una categoría clarísima.

O sea: el techo de 0.80 no era el modelo. Era que el 18% de las respuestas del examen estaban mal.

Cómo encontrar etiquetas sospechosas sin re-etiquetar todo

Re-etiquetar 40.000 ejemplos no era una opción. Lo que hicimos: validación cruzada, guardando las probabilidades que el modelo da a cada ejemplo cuando ese ejemplo está en el fold de test. Los ejemplos donde el modelo está muy seguro de otra clase son candidatos a error de etiqueta. Es la idea de confident learning (la librería cleanlab lo hace muy bien), pero se puede hacer a mano:

import numpy as np
from sklearn.model_selection import cross_val_predict
from sklearn.linear_model import LogisticRegression

# y codificado como enteros 0..k-1
probs = cross_val_predict(
    LogisticRegression(max_iter=2000), X, y, cv=5, method="predict_proba"
)
pred = probs.argmax(axis=1)
sospechosos = np.where((pred != y) & (probs.max(axis=1) > 0.9))[0]
print(len(sospechosos), "ejemplos para revisar a mano")

Nos salieron 2.900. Revisamos 600 (dos tardes con pizza). El 71% eran errores de verdad.

Resultado

  • Arreglamos la guía de etiquetado: una página, con ejemplos de los casos frontera.
  • Re-etiquetamos los sospechosos con la guía nueva.
  • El mismo TF-IDF con regresión logística de antes: de 0.79 a 0.86. El LLM con few-shot: 0.88. La diferencia entre modelos se hizo pequeña; la diferencia por limpiar los datos, enorme.

Doncs això: antes de pagar un modelo más grande, gastad dos tardes mirando vuestras etiquetas. Y si alguien os vende un modelo con 99% de accuracy, preguntad quién etiquetó el test.

Written by

Núria Puig

Data scientist a Barcelona 📊 Python, pandas, una mica de ML. Catalan, Spanish, English, whatever works. Sometimes I post in català, sorry not sorry.

Get the best of #ai_hype_check weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

7

Sign in to join the conversation.

Sign in to comment
Sofía Ramírez@sofi_dev_mx2 rep in AI Hype Check
¡Gracias por cumplir! Lo compartí en codigo_en_espanol. "el 18% de las respuestas del examen estaban mal" es la mejor explicación que he leído de esto 💜
0 net votes
Javier Montero@javi_montero1 rep in AI Hype Check
Vaya tela con la empresa externa. Déjame adivinar: la contratasteis por precio y etiquetaban becarios a destajo. Clásico de cárnica. Buen post, Núria, aunque seas del Barça.
3 net votes
Núria Puig@nuria_data#2 in AI Hype Check
jajaja no comment sobre la empresa 🙊 y lo del Barça no tiene nada que ver, madridista
0 net votes
Bruna Schmitt@bruna_dados#5 in AI Hype Check
Bah, que post bom. Fiz a mesma coisa com cleanlab num dataset de crédito ano passado, 12% de rótulo errado. Desculpa responder em português, mas acho que dá pra entender, né? 🧉
1 net votes
Núria Puig@nuria_data#2 in AI Hype Check
s'entén perfectament! 12% también es mucho, el problema es universal ahah
1 net votes
Dana Kowalski@dana_ml#1 in AI Hype Check
Read it with a translator and it held up perfectly. The model-agnostic improvement (0.79 to 0.86 on the old model) is the result most people never measure, because they only rerun the new model. Excellent post.
0 net votes
Luis Treviño@luis_qa_mty2 rep in AI Hype Check
desde QA esto me suena muchísimo: si el test está mal, todos los resultados están mal. igual que los tests automáticos que verifican la respuesta incorrecta jaja
0 net votes