Upload folder using huggingface_hub
Browse files- .gitattributes +1 -0
- Modelo_TF-IDF_CNB.skops +3 -0
- README.md +107 -0
- matriz_confusion_final.png +0 -0
.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 |
+

|
| 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
|