12 - Proyecto: detección de spam con modelos Naive Bayes

Lección 12 del curso Probabilidad Nivel Avanzado.

En la lección anterior vimos una explicación detallada de los Modelos de Naive Bayes y vimos además un sencillo ejemplo numérico que nos permitió entender todos los detalles detrás del entrenamiento y la generación de predicciones con este tipo de modelos.

Así que es momento de poner en práctica todo lo aprendido hasta el momento con un proyecto real. Entonces, en esta última lección haremos uso de los Modelos de Naive Bayes para resolver un problema en el ámbito del Procesamiento del Lenguaje Natural (el lenguaje hablado y escrito por nosotros los seres humanos).

Para esto usaremos un set de datos que contiene mensajes de texto SMS. Realizaremos la exploración y pre-procesamiento de los datos y veremos cómo codificar el texto de manera adecuada para construir un Modelo de Naive Bayes que nos permita realizar la clasificación de cada mensaje dependiendo de su contenido.

Introducción

Comencemos entonces hablando en detalle del problema a resolver y del set de datos que usaremos en este proyecto:

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Bien, como lo acabamos de ver el objetivo de este proyecto será entrenar, validar y poner a prueba un Modelo de Naive Bayes capaz de clasificar mensajes de texto en una de dos categorías: “spam” o “ham” (es decir mensajes “normales”).

Y para ello usaremos un set de datos que contiene 5.572 mensajes de texto. Por cada uno de estos mensajes, además del texto, contamos con el número de caracteres, de palabras y de frases dentro del mensaje.

Análisis exploratorio de datos

Y como en todo proyecto de Ciencia de Datos y Machine Learning, la primera etapa que debemos llevar a cabo una vez hayamos recolectado los datos es realizar el análisis exploratorio de los mismos. Veamos en detalle este análisis exploratorio:

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Perfecto, gracias a este análisis exploratorio de los datos ya tenemos un panorama claro de las características de nuestro set de datos.

Como parte de este análisis hemos verificado que no existen datos incompletos pero que sí existen algunos mensajes de texto duplicados.

Adicionalmente hemos visto que tenemos un set de datos desbalanceado (lo cual resultará relevante en la etapa de validación de los modelos) y que además las variables número de caracteres, número de palabras y número de frases están correlacionadas.

Pre-procesamiento de los datos

Con esto ya estamos listos para implementar la etapa de pre-procesamiento, donde prepararemos los datos para poderlos llevar posteriormente a cada uno de los modelos a construir. Veamos en detalle esta etapa:

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Bien, con este pre-procesamiento nos hemos enfocado fases como la eliminación de las filas duplicadas; la normalización del texto en los mensajes y la eliminación de las columnas “words” y “sentences” (pues están correlacionadas con la variable “characters”).

Además hemos representado numéricamente la columna categoría y hemos creado los sets de entrenamiento, validación y prueba.

Adicionalmente, hemos hecho uso de la técnica TF-IDF (Term Frequency - Inverse Document Frequency) para codificar numéricamente los mensajes de texto dependiendo de la frecuencia con que cada palabra aparece en cada mensaje y en la totalidad del corpus (es decir en todos los mensajes que hacen parte del set de datos).

Como resultado de esta codificación TF-IDF cada mensaje es codificado a través de una matriz que usaremos como entrada para uno de los modelos que construiremos.

Entrenamiento y validación de los modelos

Así que en este punto ya hemos completado la etapa más demandante de nuestro proyecto y estamos listos para entrenar y validar los diferentes modelos de Naive Bayes. Veamos esta fase en detalle:

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Como acabamos de ver hemos hecho uso de la librería Scikit-Learn para, con muy pocas líneas de código, entrenar y validar dos modelos diferentes.

El primer modelo acepta como entrada el número de caracteres de cada mensaje mientras que el segundo hace uso de la matriz TF-IDF de cada mensaje obtenida anteriormente.

Una vez realizado el entrenamiento de estos modelos (haciendo uso del set de entrenamiento) realizamos su validación que nos permitió ver, con ayuda de la métrica de desempeño recall, que realmente el modelo que mejor clasifica los mensajes “spam” es aquel que acepta como entrada las matrices TF-IDF.

Prueba del modelo seleccionado

Así que habiendo elegido el modelo con el mejor desempeño, lo único que nos resta es ponerlo a prueba. Veamos esta última fase en detalle:

Contenido exclusivo suscriptores

Suscríbete y accede al código fuente y al video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

¡Excelente! Acabamos de ver que esta fase de prueba nos permite simular lo que ocurriría en una situación real pues nos permite ver qué tipo de predicciones generaría el modelo con datos nunca antes vistos.

Y para lograr esto hicimos uso del set de prueba así como del método predict() que en tan sólo una línea de código nos permite generar este conjunto de predicciones.

Así que en este punto ya hemos logrado resolver un problema de procesamiento del lenguaje natural, como lo es la detección de spam, haciendo uso de estos modelos de Naive Bayes.

Hemos visto que a pesar de la simplicidad de estos modelos los resultados son muy pero muy buenos: cuando validamos el modelo seleccionado obtuvimos un recall de casi 87%, lo cual quiere decir que de cada 100 mensajes spam procesados por el modelo, 87 son clasificados correctamente en esta categoría.

Cierre del curso

Y con esto culminamos este curso de Probabilidad Nivel Avanzado, así que !los felicito por haber llegado hasta este punto!

A lo largo de este curso, y de los dos primeros cursos de la serie (Probabilidad Nivel Básico y Probabilidad Nivel Intermedio), hemos aprendido diferentes herramientas teóricas y prácticas de la probabilidad que resultan útiles al momento de abordar diferentes problemas de Ciencia de Datos y Machine Learning.

Como siempre, los invito a dejar sus comentarios y sugerencias y la valoración del curso en este enlace, pues esto me ayudará un montón a seguir mejorando el contenido de la Academia.

¡Les envío un saludo y nos vemos en el próximo curso!

Ver todas las lecciones de este curso