📥Detección de Spam con Machine Learning
Enunciado y contexto del ejercicio
Se propone la construcción de un sistema de aprendizaje automático capaz de predecir si un correo determinado se corresponde con un correo de SPAM o no, para ello, se utilizará el siguiente conjunto de datos:
Conjunto de datos
The corpus trec07p contains 75,419 messages:
25220 ham
50199 spamThese messages constitute all the messages delivered to a particular server between these dates:
Sun, 8 Apr 2007 13:07:21 -0400
Fri, 6 Jul 2007 07:04:53 -04001. Lectura de los correos electrónicos
Antes de comenzar a realizar ninguna acción, debemos implementar una función que lea de disco los correos electrónicos que forman parte del conjunto de datos de manera que podamos visualizar el formato que tienen.
Implementa una función en Python que lea el conjunto de datos de correos electrónicos y las etiquetas asociados a ellos.
Pista: Revisa los archivos que se encuentran en el directorio del conjunto de datos, el archivo full/index contiene la etiqueta de los correos y la ruta al mismo.
f = open('full/index', 'r')
f.read().splitlines()
['spam ../data/inmail.1',
'ham ../data/inmail.2',
'spam ../data/inmail.3',
'spam ../data/inmail.4',
'spam ../data/inmail.5',
'spam ../data/inmail.6',
'spam ../data/inmail.7',
'spam ../data/inmail.8',
'spam ../data/inmail.9',
'ham ../data/inmail.10',
'spam ../data/inmail.11',
'spam ../data/inmail.12',
'spam ../data/inmail.13',
'spam ../data/inmail.14',
'spam ../data/inmail.15',
...]2. Procesamiento de texto HTML en los emails
En este caso práctico relacionado con la detección de correos electrónicos de SPAM, el conjunto de datos que disponemos esta formado por correos electrónicos, con sus correspondientes cabeceras y campos adicionales. Por lo tanto, requieren un preprocesamiento previo a que sean ingeridos por el algoritmo de Machine Learning.
Implementa una clase en Python 3 que permita procesar texto que contiene código HTML y elimine los tags HTML.
Pista: Revisa la clase HTMLParser para implementar esta sección: https://docs.python.org/es/3.8/library/html.parser.html
3. Procesamiento de lenguaje natural
Además de eliminar los posibles tags HTML que se encuentren en el correo electrónico, deben realizarse otras acciones de preprocesamiento para evitar que los mensajes contengan ruido innecesario. Entre ellas se encuentra la eliminación de los signos de puntuación, eliminación de posibles campos del correo electrónico que no son relevantes o eliminación de los afijos de una palabra manteniendo únicamente la raiz de la misma (Stemming).
Explora e implementa diferentes funciones en Python 3 que permitan realizar los procesamientos que se indican en el texto anterior. Ten en cuenta que el texto de los correos electrónicos esta en Inglés.
Pista 1: Ten en cuenta que los correos electrónicos se encuentran en bruto y, por lo tanto, contienen valores que no nos van a resultar de interés, por ejemplo, las cabeceras o el pie del correo electrónico. Utiliza el paquete externo email para procesar los correos y eliminar todo menos el cuerpo del mismo.
Pista 2: Una vez que hayas eliminado todos los componentes del correo menos su cuerpo, explora la librería nltk para eliminar signos de puntuación y afijos. Revisa la clase PorterStemmer() de nltk así como los métodos y atributos nltk.corpus.stopwords.words('english'), string.punctuation y nltk.tokenize.word_tokenize
4. Procesamiento de texto HTML en los emails
Pon todo lo anterior en común y construye una clase EmailParser que procese los emails aplicando todas las transformaciones que hemos implementado en las secciones anteriores.
Implementa una clase en Python 3 que contenga toda la funcionalidad que hemos visto en el apartado anterior. Implementa una función que permita leer correos electrónicos y aplicarles las transformaciones de manera simultánea.
5. Codificando el conjunto de datos
Con las funciones presentadas anteriormente se permite la lectura de los correos electrónicos de manera programática y el procesamiento de los mismos para eliminar aquellos componentes que no resultan de utilidad para la detección de correos de SPAM. Sin embargo, cada uno de los correos sigue estando representado por un string.
La mayoría de los algoritmos de Machine Learning no son capaces de ingerir texto como parte del conjunto de datos. Por lo tanto, deben aplicarse una serie de funciones adicionales que transformen el texto de los correos electrónicos parseados en una representación numérica.
Aplica alguna técnica de codificación/vectorización sobre los correos electrónicos parseados para transformar el texto en una representación numérica.
Pista: Revisa la clase CountVectorizer de Sklearn para realizar la codificación.
6. Entrenamiento del algoritmo
¡Enhorabuena! Ya tienes la parte más complicada del ejercicio realizada. En este apartado vamos a entrenar un algoritmo de Machine Learning que aprenderá de los vectores anteriores a clasificar los correos en spam y legítimos.
Utiliza el algoritmo de Machine Learning LogisticRegression para clasificar entre correos electrónicos de spam y legítimos. Puedes encontrar la implementación de este algoritmo en Sklearn.
Pista 1: Comienza leyendo un número de correos pequeño para que no tarde demasiado tiempo, por ejemplo 100 correos. Aplica todas las transformaciones que hemos implementado anteriormente sobre ellos.
Pista 2: Aplica la vectorización al conjunto de datos para representar los correos de manera numérica.
Podemos leer estos datos de una manera más visual usando Pandas:

Pista 3: Entrena el algoritmo LogisticRegression de Sklearn. Este algoritmo se basa en aprendizaje supervisado y funciona exactamente igual que el algoritmo Perceptron que hemos presentado en secciones anteriores.
7. Predicción
¡Muy bien, ya casi has terminado! Ya tenemos nuestro algoritmo entrenado y listo para realizar predicciones, lo único que nos queda es probar que tal se comporta para correos que no ha visto nunca.
Utiliza el algoritmo de Machine Learning LogisticRegression para predecir si un nuevo correo que no ha visto nunca es spam o legitimo.
Pista: Revisa el método predict() que tiene la clase LogisticRegression. Ten en cuenta que cuando recibas un nuevo correo para el que quieres realizar una predicción debes aplicar sobre él todas las transformaciones que hemos realizado anteriormente. Al aplicar la vectorización utiliza únicamente el método transform() del objeto CountVectorizer.
8. Evaluación de resultados
Pista: Utiliza una métrica para evaluar los resultados. En este caso, utiliza la métrica accuracy_score. Puedes encontrar esta métrica implementada en Sklearn.
Vemos que el algoritmo ha acertado en un 94%, lo que es un porcentaje altísimo
Última actualización