Naive Bayes para clasificar reseñas con TF-IDF

Resumen

Clasificar reseñas como positivas o negativas de forma automática es uno de los usos más prácticos del machine learning aplicado a negocios. Con un clasificador Naive Bayes entrenado sobre datos vectorizados con TF-IDF, puedes detectar comentarios negativos y responderlos a tiempo, optimizando la relación con tus clientes.

¿Qué es un clasificador Naive Bayes y por qué usarlo?

Es un clasificador probabilístico basado en el teorema de Bayes que asume independencia entre las features. En la práctica, calcula la probabilidad de que una reseña pertenezca a una clase (positiva o negativa) tratando cada palabra como un evento independiente.

Este modelo es ideal cuando trabajas con hardware limitado y necesitas baja latencia. Su entrenamiento es rápido, sobre todo si usas GPU, lo que reduce costos sin sacrificar resultados aceptables.

¿Cuándo conviene usar Naive Bayes? Cuando necesitas un clasificador rápido, con poco consumo de recursos y datasets de texto vectorizados. Es perfecto para prototipos y casos donde la latencia importa más que captar matices complejos.

¿Cómo defines una reseña positiva o negativa?

El criterio que usamos parte de las estrellas: una reseña con más de tres estrellas es positiva, y una con menos de tres (una o dos) es negativa. Con eso construimos una variable binaria de sentimiento.

Para esto trabajamos con Scikit-Learn y creamos una nueva columna llamada sentiment_bin, donde uno representa positivo y cero negativo. La regla es directa: si la calificación es mayor a tres, asignamos uno; si no, cero.

¿Cómo se reparten los datos para entrenar el modelo?

Las variables de entrada son la matriz TF-IDF, que vectoriza todo el dataset. La variable a predecir es sentiment_bin, con sus unos y ceros. Luego dividimos la información en entrenamiento y prueba.

  • En este caso usamos 80% para entrenamiento y 20% para prueba.
  • En otros escenarios se utiliza 70% entrenamiento, 20% prueba y 10% validación.
  • Definimos un random_state para que el split sea reproducible.

El set de entrenamiento ayuda al modelo a aprender, y con eso predice casos nuevos.

¿Cómo se entrena y evalúa el modelo en Scikit-Learn?

Después de importar los paquetes necesarios, definimos el clasificador Naive Bayes y usamos la función fit, que ejecuta el entrenamiento. Con GPU es casi instantáneo; con CPU tarda apenas unos segundos más.

Al evaluar, obtuvimos un 79% de accuracy, una métrica que en la industria se considera buena cuando supera el 70%. También revisamos el F1 score, útil para evaluar datasets balanceados, con valores de 0.84 y 0.70 para cada clase.

¿Qué diferencia hay entre accuracy y F1 score? El accuracy mide el porcentaje total de aciertos. El F1 score combina precisión y recall, y es más confiable cuando las clases están desbalanceadas o quieres equilibrar falsos positivos y negativos.

¿Cómo guardas el modelo entrenado para reutilizarlo?

Una vez que el modelo funciona, lo guardamos para usarlo con casos nuevos sin volver a entrenarlo. Definimos un model_path y lo nombramos NbClassifier, con extensión .pkl.

Para cargarlo después, basta con usar la función .load. Así tu modelo queda listo para producción o para nuevas inferencias en cualquier momento.

¿Cómo aplicas el modelo a reseñas nuevas?

Acá viene lo interesante: cualquier texto nuevo debe pasar por el mismo preprocesamiento que aplicaste en el entrenamiento. Si te saltas este paso, el modelo no podrá interpretar la entrada correctamente.

El flujo es claro:

  1. Aplicar la función clean para limpieza básica.
  2. Eliminar stopwords y aplicar lematización con el modelo de spaCy.
  3. Transformar el texto al espacio vectorial con TF-IDF.
  4. Pasar el vector al modelo cargado (mi_modelo) y obtener la predicción: uno positivo, cero negativo.

Por ejemplo, la reseña "This product is excellent and exceeded my expectations" se clasifica como uno, positivo. Hasta acá, todo coherente.

¿Por qué Naive Bayes falla con sarcasmo y emojis?

Probamos con la frase "I hate it, but it looks like a wink wink" acompañada de un emoji. El modelo devolvió cero, negativo, sin captar la ironía. Con "I loved it?" devolvió uno, positivo, ignorando que el signo de interrogación marcaba sarcasmo.

Esto pasa por dos razones: la función clean elimina signos de interrogación y exclamación, y los modelos tradicionales no procesan emojis ni contexto irónico. Es el techo natural de este tipo de clasificadores.

¿Los modelos Naive Bayes entienden sarcasmo? No. Tratan cada palabra de forma independiente y no capturan contexto ni tono. Para eso necesitas modelos modernos como los transformers, que sí modelan relaciones complejas entre palabras.

Habilidades y conceptos clave de la clase

  • Teorema de Bayes y supuesto de independencia entre features, base del clasificador [02:15].
  • TF-IDF como técnica de vectorización para transformar texto en matrices numéricas [03:40].
  • Variable binaria de sentimiento (sentiment_bin), con uno para positivo y cero para negativo [02:50].
  • Split 80/20 entre entrenamiento y prueba, con random_state para reproducibilidad [03:55].
  • Accuracy del 79% y F1 score de 0.84 y 0.70 como métricas de evaluación [05:20].
  • Serialización del modelo con extensión .pkl para reutilización futura [06:10].
  • Pipeline de preprocesamiento: función clean, eliminación de stopwords y lematización con spaCy [07:00].
  • Limitaciones: los modelos tradicionales no detectan emojis ni sarcasmo, lo que abre paso a los transformers [09:15].

¿Has entrenado algún clasificador con tus propios datos? Cuéntame en los comentarios qué dataset usaste y qué accuracy lograste.