Antes de culpar al modelo, mira tus etiquetas
El 18% de nuestras etiquetas estaban mal y nadie lo sabía
Contents
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
Sign in to join the conversation.
Sign in to comment