Andersoncrs commited on
Commit
f259ebc
·
verified ·
1 Parent(s): 7ba5415

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ Modelo_TF-IDF_CNB.skops filter=lfs diff=lfs merge=lfs -text
Modelo_TF-IDF_CNB.skops ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:29614054eacf41a8dd5a97d0cefe77a75584c4178200c6a3f645cf0590abf8eb
3
+ size 28757364
README.md ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: en
3
+ library_name: scikit-learn
4
+ license: mit
5
+ pipeline_tag: text-classification
6
+ tags:
7
+ - text-classification
8
+ - tf-idf
9
+ - complement-naive-bayes
10
+ - grid-search
11
+ model_format: skops
12
+ dataset_name: ucirvine/sms_spam
13
+ ---
14
+ # **Modelo de Clasificación de Spam usando TF-IDF y Complement Naive Bayes**
15
+
16
+ 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.
17
+
18
+ # **Conjunto de Datos**
19
+
20
+ 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.
21
+
22
+ # **Arquitectura del Modelo**
23
+
24
+ El modelo está compuesto por dos pasos principales:
25
+
26
+ * **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.
27
+ * La Frecuencia del Término (TF) está dada por la siguiente fórmula:
28
+ $$TF(t, d) = \frac{f(t, d)}{\sum_{t' \in d} f(t', d)}$$
29
+ 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:
30
+ $$TF(t, d) = 1 + \log(f(t, d)) \quad \text{si } f(t, d) > 0$$
31
+ * Respecto a la Frecuencia Inversa del Documento (IDF), se aplica la fórmula estándar implementada en Scikit-Learn:
32
+ $$IDF_{\text{Scikit-Learn}}(t) = \log\left(\frac{1 + N}{1 + df(t)}\right) + 1$$
33
+
34
+ Finalmente, obtenemos la puntuación definitiva multiplicando ambos términos:
35
+ $$TF\text{-}IDF(t, d) = TF(t, d) \times IDF(t)$$
36
+
37
+ 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.
38
+
39
+ * **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*.
40
+
41
+ ## **Hiperparámetros del Modelo**
42
+
43
+ A continuación, se detallan los hiperparámetros utilizados en cada uno de los pasos que conforman el pipeline del modelo:
44
+
45
+ | Hiperparámetro | Valor |
46
+ | :--- | :--- |
47
+ | **memory** | None |
48
+ | **steps** | [('tfidf', TfidfVectorizer(binary=True, max_df=0.9, ngram_range=(1, 2), sublinear_tf=True,
49
+ tokenizer=<function word_tokenize at 0x75236ee85170>)), ('cnb', ComplementNB(alpha=0.5))] |
50
+ | **transform_input** | None |
51
+ | **verbose** | False |
52
+ | **tfidf** | TfidfVectorizer(binary=True, max_df=0.9, ngram_range=(1, 2), sublinear_tf=True,
53
+ tokenizer=<function word_tokenize at 0x75236ee85170>) |
54
+ | **cnb** | ComplementNB(alpha=0.5) |
55
+ | **tfidf__analyzer** | word |
56
+ | **tfidf__binary** | True |
57
+ | **tfidf__decode_error** | strict |
58
+ | **tfidf__dtype** | <class 'numpy.float64'> |
59
+ | **tfidf__encoding** | utf-8 |
60
+ | **tfidf__input** | content |
61
+ | **tfidf__lowercase** | True |
62
+ | **tfidf__max_df** | 0.9 |
63
+ | **tfidf__max_features** | None |
64
+ | **tfidf__min_df** | 1 |
65
+ | **tfidf__ngram_range** | (1, 2) |
66
+ | **tfidf__norm** | l2 |
67
+ | **tfidf__preprocessor** | None |
68
+ | **tfidf__smooth_idf** | True |
69
+ | **tfidf__stop_words** | None |
70
+ | **tfidf__strip_accents** | None |
71
+ | **tfidf__sublinear_tf** | True |
72
+ | **tfidf__token_pattern** | (?u)\b\w\w+\b |
73
+ | **tfidf__tokenizer** | <function word_tokenize at 0x75236ee85170> |
74
+ | **tfidf__use_idf** | True |
75
+ | **tfidf__vocabulary** | None |
76
+ | **cnb__alpha** | 0.5 |
77
+ | **cnb__class_prior** | None |
78
+ | **cnb__fit_prior** | True |
79
+ | **cnb__force_alpha** | True |
80
+ | **cnb__norm** | False |
81
+
82
+ ## **Selección del Modelo**
83
+
84
+ 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.
85
+
86
+ 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.
87
+
88
+ # **Limitaciones del Modelo**
89
+
90
+ Al utilizar este modelo en un escenario real, es fundamental tener en cuenta la siguiente limitación clave:
91
+
92
+ * **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.
93
+
94
+ # **Evaluación del Modelo**
95
+
96
+ A continuación, se adjunta la matriz de confusión obtenida al evaluar el modelo sobre el conjunto de prueba (*test set*):
97
+
98
+ ![Matriz de Confusión de la Prueba](matriz_confusion_final.png)
99
+
100
+ # **Contacto**
101
+
102
+ Si tienes alguna pregunta, sugerencia o deseas conectar conmigo, no dudes en escribirme o visitar mis perfiles profesionales:
103
+
104
+ * 💼 **LinkedIn:** [Anderson Camilo Rodríguez Silva](https://www.linkedin.com/in/andersoncrs)
105
+ * 🐙 **GitHub:** [Andersoncrs](https://github.com/Andersoncrs)
106
+ * 📧 **Correo Electrónico:** andersoncamilo.rodriguez.s@gmail.com
107
+
matriz_confusion_final.png ADDED