Ejercicio de detección de spam con Python (parte 1)

Autor: | Última modificación: 12 de abril de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post: ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

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 ()
Ejercicio de detección de spam

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 ()
Ejercicio de detección de spam con Python (parte 1)

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 ()
Ejercicio de detección de spam con Python (parte 1)

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.

¿Quieres seguir avanzando?

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!

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado