En un artículo anterior iniciamos el desarrollo de un ejercicio de detección de spam con Python, en el cual realizamos la parte de preprocesado, train y test del set y la selección de features.
En este post, seguiremos con este ejercicio de detección de spam con Python, incluyendo, entre otras cosas, un modelo de clasificación binaria y generamos las etiquetas para corroborar si es spam o no.
Detección de spam con Python
Modelo de clasificación binaria
Para crear la etiqueta de si es spam o no es spam en nuestro ejercicio de detección de spam con Python, vamos a utilizar unas logistic regression básicas. Lo importante aquí es la comparativa entre cómo le afecta el preprocesamiento que le hagamos al texto al performance del algoritmo.
Entonces, lo primero que haremos será importar características necesarias. En este caso, hemos importado el módulo de scikit learn de regresión logística, el LogisticRegression, y el confusion_matrix classification_report para la parte de métricas:
#Ejercicio de detección de spam con Python
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report
Posteriormente, generamos los algoritmos:
#Ejercicio de detección de spam con Python
lr_cv_simple = LogisticRegression ()
lr_cv_complex = LogisticRegression ()
lr_tfidf_simple = LogisticRegression ()
lr_tfidf_complex = LogisticRegression ()
Ahora lo que haremos será el entrenamiento de los modelos:
#Ejercicio de detección de spam con Python
lr_cv_simple.fit (X_train_cv_simple, df_train ['label']) #train
y_pred_cv_simple = lr_cv_simple.predict (X_test_cv_simple) #test
#Ejercicio de detección de spam con Python
lr_cv_complex.fit (X_train_cv_complex, df_train ['label']) #train
y_pred_cv_complex = lr_cv_complex.predict (X_test_cv_complex) #test
#Ejercicio de detección de spam con Python
lr_tfidf_simple.fit (X_train_tfidf_simple, df_train ['label']) #train
y_pred_tfidf_simple = lr_tfidf_simple.predict (X_test_tfidf_simple) #test
#Ejercicio de detección de spam con Python
lr_tfidf_complex.fit (X_train_tfidf_complex, df_train ['label']) #train
y_pred_tfidf_complex = lr_tfidf_complex.predict (X_test_tfidf_complex) #test
Corremos el train y test de este modelo:
#Ejercicio de detección de spam con Python
print ('CountVectorizer simple \ n')
print (confusion_matrix (df_test ['label'], y_pred_cv_simple))
print (classification_report (df_test ['label'], y_pred_cv_simple))
Lo que vemos es un count vectorizer simple. En un primer momento podríamos decir que se ve bastante bien, pero también que tiene bastante overfitting, ya que el recall es muy alto (1.00).
#Ejercicio de detección de spam con Python
print ('CountVectorizer complejo \ n')
print (confusion_matrix (df_test ['label'], y_pred_cv_complejo))
print (classification_report (df_test ['label'], y_pred_cv_complejo))
#Ejercicio de detección de spam con Python
print ('TfIdfVectorizer simple \ n')
print (confusion_matrix (df_test ['label'], y_pred_tfidf_simple))
print (classification_report (df_test ['label'], y_pred_tfidf_simple))
#Ejercicio de detección de spam con Python
print ('TfIdf complejo \ n')
print (confusion_matrix (df_test ['label'], y_pred_tfidf_complejo))
print (classification_report (df_test ['label'], y_pred_tfidf_complejo))
Si vemos el TfIdf, podemos observar que los valores son muy parecidos. Lo que cambia un poco más es el f1 – score, que al final viene a ser el más importante. En el count vectorizer nos da 0.96, mientras que en el TfIdf, tanto en el simple como en el complejo, nos da 0.94.
El TfIdf calcula el valor de las palabras con base en la rareza que tengan en el documento; el count vectorizer lo único que hace es contar frecuencias.
Precision y recall
En la imagen anterior hemos visto que hay dos columnas que se nombran precision y recall. Ampliemos un poco más ambos conceptos:
- Precision hace referencia al total de predicciones positivas, es decir, los valores true positive más el false positive del total. La fórmula sería la siguiente:
- tp / (tp + fp), donde tp equivale a true positive y fp equivale a false positive.
- Recall, por el contrario, hace referencia al número de falsos negativos más true positivos. La fórmula queda así:
- tp / (tp + fn)
Como podemos observar, lo único que cambia entre ambas fórmulas es que para la precision se trabaja con false positive, mientras que para el recall se trabaja con false negative.
Cada una de estas funcionalidades tiene sus objetivos. Si observamos en la documentación que nos proporciona scikit learn, podemos encontrar que el recall es la habilidad del clasificador para encontrar todos los positivos, de modo que cuanto mayor recall se tenga, mejor encuentra los casos positivos. No obstante, precision es la habilidad del clasificador para no clasificar como positivo un ejemplo que es negativo.
¿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!