17 · Clasificador de spam: comparación BOW vs TF-IDF
Cambia CountVectorizer por TfidfVectorizer en el mismo dataset y mide si la ponderación IDF mejora el clasificador de spam.
Cambia BOW por TF-IDF y mide si la ponderación IDF mejora el mismo clasificador de spam en los mismos datos.
Sin esto:
Tendrías resultados de BOW sin una comparación de referencia.
En la lección anterior construiste un clasificador de spam con Bag of Words. El pipeline funcionó bien — ¿pero es BOW el mejor vectorizador para esta tarea? Esta lección responde esa pregunta ejecutando el mismo proyecto con una línea diferente: cambiar CountVectorizer por TfidfVectorizer y comparar los resultados cara a cara.
Este es el A/B testing en la capa de representación — un paso estándar del flujo de trabajo cuando iteras sobre cualquier pipeline de clasificación de texto.
Por qué TF-IDF podría ganar en spam:
La clave es la ponderación IDF. En un dataset de spam, tokens como "FREE", "WINNER" y "URGENT" aparecen casi exclusivamente en mensajes spam — tienen baja frecuencia de documento y por lo tanto alto peso IDF. TF-IDF potencia estos tokens raros pero informativos relativo a palabras comunes como "you", "your", "the" que aparecen en ambas clases.
Por qué TF-IDF podría no ganar en spam:
Los mensajes SMS cortos tienen pocos tokens. El impulso IDF es significativo en corpus grandes (miles de documentos) pero puede ser ruidoso en 40 mensajes. Además, los marcadores de spam como "FREE" y "CLICK" aparecen tan frecuentemente dentro de los mensajes spam que el conteo bruto (BOW) ya les da un alto peso en la clase spam.
Esta lección ejecuta: (1) reportes de clasificación lado a lado, (2) validación cruzada de 5 pliegues para ambos pipelines, y (3) una ablación con sublinear_tf=True para ver si el escalado logarítmico de la frecuencia de términos añade más señal.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Cuándo TF-IDF supera a BOW: datos ricos en tokens raros vs documentos cortos con señal frecuente
¿Por qué TF-IDF podría superar a BOW en un clasificador de spam?
- Cambiar CountVectorizer por TfidfVectorizer es una línea de código. Siempre ejecuta ambos con cross_val_score y deja que los datos decidan — BOW y TF-IDF son similares en corpus pequeños de texto corto, mientras que TF-IDF gana consistentemente en corpus grandes con tokens informativos raros.
- La validación cruzada de 5 pliegues da una estimación confiable de la generalización: media ± std entre pliegues. Una diferencia menor que la std no es significativa — solo confía en diferencias mayores que 1 desviación estándar como indicativas.
- sublinear_tf=True reemplaza TF con 1 + log(TF), evitando que un solo token repetido domine el vector de features. Útil cuando los spammers repiten el mismo token muchas veces ('FREE FREE FREE') para aumentar su conteo bruto.
- El A/B testing de diferentes vectorizadores es un paso estándar al iterar sobre clasificación de texto. La regla: documentos cortos + dataset pequeño → BOW y TF-IDF son similares; documentos largos + dataset grande → TF-IDF gana. FeatureUnion puede ensamblar ambos si ninguno domina claramente.
El A/B testing de diferentes vectorizadores es un paso estándar al iterar sobre pipelines de clasificación de texto. Este flujo de trabajo — fijar el modelo, variar la representación, medir con CV — aparece en el proceso de ingeniería de features de todos los equipos NLP de producción. La misma metodología se extiende a comparar TF-IDF vs sentence embeddings, unigramas vs trigramas, o vocabularios con stemming vs sin stemming.
Si lo quitas: Atascado con una sola representación y sin comparación cara a cara. No tendrías una forma fundamentada de elegir entre BOW y TF-IDF — o cualquiera dos representaciones de features — más allá de la intuición.