File size: 7,089 Bytes
f259ebc
 
 
 
 
 
 
 
 
 
 
 
c8bb941
 
f259ebc
 
 
 
 
 
 
c8bb941
f259ebc
 
 
 
 
 
332b6bb
 
c8bb941
332b6bb
f259ebc
332b6bb
f259ebc
c8bb941
f259ebc
c8bb941
f259ebc
 
 
 
 
 
 
 
 
 
d55f337
f259ebc
 
d55f337
f259ebc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9f37983
f259ebc
c8bb941
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
---
language: en
library_name: scikit-learn
license: mit
pipeline_tag: text-classification
tags:
- text-classification
- tf-idf
- complement-naive-bayes
- grid-search
model_format: skops
dataset_name: ucirvine/sms_spam
datasets:
- ucirvine/sms_spam
---
# **Modelo de Clasificación de Spam usando TF-IDF y Complement Naive Bayes**

Este modelo ha sido entrenado para clasificar mensajes de texto, determinando si son válidos (*ham*) o si corresponden a mensajes de *SPAM*, basándose únicamente en el contenido del mensaje.

# **Conjunto de Datos**

El conjunto de datos utilizado para llevar a cabo el entrenamiento del modelo ha sido `ucirvine/sms_spam`, el cual contiene mensajes SMS reales en el idioma inglés.

# **Arquitectura del Modelo**

El modelo está compuesto por dos pasos principales:

* **TF-IDF (Term Frequency-Inverse Document Frequency):** Primero se tokeniza cada palabra de cada mensaje SMS para, posteriormente, vectorizarla de acuerdo con el método TF-IDF. Este método consiste en asignar una puntuación a las palabras presentes en un texto con base en su frecuencia (número de veces que aparecen) dentro de un documento individual y dentro del corpus completo.  
  * La Frecuencia del Término (TF) está dada por la siguiente fórmula:
$$TF(t, d) = \frac{f(t, d)}{\sum_{t' \in d} f(t', d)}$$
    Dado que en el caso de este modelo hemos utilizado la instrucción `tfidf_sublinear_tf=True`, se atenúa la influencia de la aparición desmedida de determinados términos mediante el siguiente ajuste logarítmico:  
$$TF(t, d) = 1 + \log(f(t, d)) \quad \text{si } f(t, d) > 0$$  
  * Respecto a la Frecuencia Inversa del Documento (IDF), se aplica la fórmula estándar implementada en Scikit-Learn:  
$$IDF_{\text{Scikit-Learn}}(t) = \log\left(\frac{1 + N}{1 + df(t)}\right) + 1$$

  Finalmente, obtenemos la puntuación definitiva multiplicando ambos términos:
$$TF\text{-}IDF(t, d) = TF(t, d) \times IDF(t)$$
  Adicionalmente, el método TF-IDF hace uso de `word\_tokenize` de la librería **NLTK** para tokenizar los mensajes SMS mediante reglas estándar de la lingüística, separando contracciones del inglés de manera inteligente y aislando los signos de puntuación de las palabras, siendo este uno de los enfoques más recomendados para nuestro caso de estudio.

* **Complement Naive Bayes (CNB):** Se ha seleccionado esta versión de Naive Bayes ya que es una extensión de *Multinomial Naive Bayes* diseñada específicamente para corregir los sesgos generados por conjuntos de datos con clases desbalanceadas. Consiste en hallar la probabilidad de que aparezca un término en el *complemento* de la clase objetivo. Resulta ideal para nuestro escenario, ya que la gran mayoría de los mensajes del conjunto de datos son válidos (*ham*), y tan solo una pequeña minoría ha sido etiquetada como *SPAM*.

## **Hiperparámetros del Modelo**

A continuación, se detallan los hiperparámetros utilizados en cada uno de los pasos que conforman el pipeline del modelo:

| Hiperparámetro | Valor |
| :--- | :--- |
| **memory** | None |
| **steps** | [('tfidf', TfidfVectorizer(binary=True, max_df=0.9, ngram_range=(1, 2), sublinear_tf=True,tokenizer=<function word_tokenize at 0x75236ee85170>)), ('cnb', ComplementNB(alpha=0.5))] |
| **transform_input** | None |
| **verbose** | False |
| **tfidf** | TfidfVectorizer(binary=True, max_df=0.9, ngram_range=(1, 2), sublinear_tf=True,tokenizer=<function word_tokenize at 0x75236ee85170>) |
| **cnb** | ComplementNB(alpha=0.5) |
| **tfidf__analyzer** | word |
| **tfidf__binary** | True |
| **tfidf__decode_error** | strict |
| **tfidf__dtype** | <class 'numpy.float64'> |
| **tfidf__encoding** | utf-8 |
| **tfidf__input** | content |
| **tfidf__lowercase** | True |
| **tfidf__max_df** | 0.9 |
| **tfidf__max_features** | None |
| **tfidf__min_df** | 1 |
| **tfidf__ngram_range** | (1, 2) |
| **tfidf__norm** | l2 |
| **tfidf__preprocessor** | None |
| **tfidf__smooth_idf** | True |
| **tfidf__stop_words** | None |
| **tfidf__strip_accents** | None |
| **tfidf__sublinear_tf** | True |
| **tfidf__token_pattern** | (?u)\b\w\w+\b |
| **tfidf__tokenizer** | <function word_tokenize at 0x75236ee85170> |
| **tfidf__use_idf** | True |
| **tfidf__vocabulary** | None |
| **cnb__alpha** | 0.5 |
| **cnb__class_prior** | None |
| **cnb__fit_prior** | True |
| **cnb__force_alpha** | True |
| **cnb__norm** | False |

## **Selección del Modelo**

El modelo final fue escogido como el mejor de entre diversas configuraciones evaluadas, aplicando variaciones tanto en la matriz de extracción de características TF-IDF como en los hiperparámetros del clasificador *Complement Naive Bayes*. Para encontrar este conjunto óptimo, se utilizó una búsqueda en rejilla (*Grid Search*), con la finalidad de identificar la combinación precisa que maximizara el rendimiento de nuestra métrica de evaluación de acuerdo con la rejilla de parámetros definida.

Cabe aclarar un aspecto fundamental en nuestra estrategia de selección: la evaluación y elección del modelo definitivo se rigió bajo la regla de negocio de **minimizar los falsos positivos** a cambio de permitir un ligero incremento en los falsos negativos. Tomamos esta decisión considerando que, en un escenario de producción real, etiquetar erróneamente un mensaje válido (*ham*) como *SPAM* genera un impacto negativo severo debido al riesgo inminente de que el usuario pierda información crítica. Por el contrario, consideramos que el impacto de que unos pocos mensajes de *SPAM* logren filtrarse a la bandeja de entrada es considerablemente menor; si bien representa una ligera molestia para el usuario, no pone en peligro la pérdida de datos importantes.

# **Limitaciones del Modelo**

Al utilizar este modelo en un escenario real, es fundamental tener en cuenta la siguiente limitación clave:

* **Restricción de Idioma:** El modelo ha sido entrenado y validado de manera exclusiva utilizando el conjunto de datos `ucirvine/sms\_spam`, el cual está compuesto en su totalidad por mensajes en el **idioma inglés**. Adicionalmente, tanto la etapa de extracción de características (TF-IDF) como las reglas gramaticales empleadas para la tokenización con **NLTK** han sido configuradas bajo los estándares lingüísticos del inglés. Por lo tanto, el modelo no es apto para analizar o clasificar mensajes en español u otros idiomas, ya que carece del vocabulario y las estructuras gramaticales necesarias para realizar una predicción precisa.

# **Evaluación del Modelo**

A continuación, se adjunta la matriz de confusión obtenida al evaluar el modelo sobre el conjunto de prueba (*test set*):

![Matriz de Confusión de la Prueba](matriz_confusion_final.png)

# **Contacto**

Si tienes alguna pregunta, sugerencia o deseas conectar conmigo, no dudes en escribirme o visitar mis perfiles profesionales:

* 💼 **LinkedIn:** [Anderson Rodríguez](https://www.linkedin.com/in/andersoncrs)  
* 🐙 **GitHub:** [Andersoncrs](https://github.com/Andersoncrs)  
* 📧 **Correo Electrónico:** andersoncamilo.rodriguez.s@gmail.com