En este artículo veremos la primera parte de un ejercicio de detección de spam o correo basura dentro de nuestro correo electrónico con Python. Utilizaremos el SMS Spam Collection Dataset, alojado en Kaggle.
Ejercicio de detección de spam con Python
Lo primero que haremos será descargar los datos y descomprimirlos:
! wget https://transfer.sh/KWNxRn/datasets.zip
! unzip datasets.zip
Después cargamos los datos:
import pandas as pd
import numpy as pd
#Ejercicio de detección de spam con Python
df = pd.read_csv ('./datasets/spam.csv', encoding = 'latin-1')
df = df [['v1', 'v2']]
df.rename (columns = {'v1' : 'label', 'v2' : 'email'}, inplace = True)
Ahora leemos los datos:
#Ejercicio de detección de spam con Python
df.head ()
Vemos que en la columna email tenemos un texto cualquiera, mientras que en la columna label tenemos si es spam o no es spam (ham).
df.shape
(5572, 2)
#Ejercicio de detección de spam con Python
df = pd.read_csv ('./datasets/spam.csv', encoding = 'latin-1')
df = df [['v1', 'v2']]
df.rename (columns = {'v1' : 'label', 'v2' : 'email'}, inplace = True)
df ['label'].value_counts ()
ham 4825
spam 747
Name: label, dtype: int64
En la distribución que tiene el dataset, nos aparece que muy pocas son spam y el resto no lo son. Este desequilibrio de datos puede afectar al módulo que entrenemos.
Preprocesado
Lo primero que haremos es una binarización de las etiquetas:
#Ejercicio de detección de spam con Python
df ['label'] = df ['label'].map ({'ham': 0, 'spam': 1})
df.head ()
Lo pasamos todo a minúsculas:
#Ejercicio de detección de spam con Python
df ['email'] = df ['email'].str.lower ()
#Ejercicio de detección de spam con Python
df.head ()
Train/test set
Cogemos un número aleatorio que sea menor que 0.75:
#Ejercicio de detección de spam con Python
msk = np.random.rand (len (df)) < 0.75
#Ejercicio de detección de spam con Python
df_train = df [msk]
df_test = df [~msk]
#Ejercicio de detección de spam con Python
df_train.shape
(4206, 2)
df_test.shape
(1366, 2)
Features
Ahora haremos preprocesado de todos estos componentes de train y test, ya que con esta información podemos generar diferentes datasets:
#Ejercicio de detección de spam con Python
#Count Vectorizer simple
cv_simple = CountVectorizer ()
X_train_cv_simple = cv_simple.fit_transform (df_train ['email'])
X_test_cv_simple = cv_simple.transform (df_test ['email'])
#Count Vectorizer con n grams, max features, min df y max df
cv_complex = CountVectorizer (ngram_range = (1, 2), max_features = 2000, max_df = 0.95, min_df = 5)
X_train_cv_complex = cv_complex.fit_transform (df_train ['email'])
X_test_cv_complex = cv_complex.transform (df_test ['email'])
#TfIdfVectorizer simple
tfidf_simple = TfidfVectorizer ()
X_train_tfidf_simple = tfidf_simple.fit_transform (df_train ['email'])
X_test_tfidf_simple = tfidf_simple.fit_transform (df_test ['email'])
#TfIdfVectorizer complejo
tfidf_complex = TfidfVectorizer (ngram_range = (1, 2), max_features = 2000, max_df = 0.95, min_df = 5)
X_train_tfidf_complex = tfidf_complex.fit_transform (df_train ['email'])
X_test_tfidf_complex = tfidf_complex.fit_transform (df_test ['email'])
Así, esta primera parte está lista. Lo que nos quedaría sería generar las etiquetas de si es o no es spam.
Para poder acceder a las opciones laborales del Big Data, uno de los mercados con mayor demanda y mejores salarios, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación intensiva adquirirás los conocimientos tanto teóricos como prácticos imprescindibles para abrirte paso en el mundillo tecnológico en pocos meses. ¡No dudes en dar el paso que transformará tu futuro y entra ya para pedir más información!