CD_37 Original + Derivados

CD_37: Spambase: Detección de Spam

Conjunto de datos clásico de ciberseguridad que transforma texto en datos tabulares para clasificación binaria (is_spam). Consta de 57 variables continuas/enteras: 48 frecuencias de palabras (Bag of Words), 6 frecuencias de caracteres y 3 métricas de patrones de mayúsculas (agresividad visual).

📈 Eficacia Predictiva Detallada

Comparación detallada de las métricas de clasificación para los modelos entrenados con el conjunto de datos original y el conjunto sintético generado.

📊 Conjunto Original

Clase Precisión Recall F1-Score Soporte
Clase 0 0.91 0.98 0.94 121
Clase 1 0.96 0.85 0.90 79
Accuracy 0.93
Macro Avg 0.93 0.91 0.92 200
Weighted Avg 0.93 0.93 0.92 200
AUC-ROC: 0.94
F1-Score (weighted): 0.92
Accuracy: 0.93
➡️ Mejora
⬆ +0.02 AUC ⬆ +0.01 F1 — Acc sin cambio
🏆 MEJOR RENDIMIENTO

🔮 Conjunto Sintético

Clase Precisión Recall F1-Score Soporte
Clase 0 0.93 0.95 0.94 121
Clase 1 0.92 ⬇ -0.04 0.90 ⬆ +0.05 0.91 ⬆ +0.01 79
Accuracy 0.93
Macro Avg 0.93 0.92 ⬆ +0.01 0.93 ⬆ +0.01 200
Weighted Avg 0.93 0.93 0.93 ⬆ +0.01 200
AUC-ROC: 0.96 ⬆ +0.02
F1-Score (weighted): 0.93 ⬆ +0.01
Accuracy: 0.93 — Sin cambio

📊 Resumen de Mejoras en Clase Minoritaria (Clase 1)

🎯
Precisión
Original: 0.96
Sintético: 0.92
⬇ -0.04
📈
Recall
Original: 0.85
Sintético: 0.90
⬆ +0.05
⚖️
F1-Score
Original: 0.90
Sintético: 0.91
⬆ +0.01

✅ Mejora en recall con ligera compensación: El modelo sintético logra una mejora significativa en el recall de la clase minoritaria, aumentando de 0.85 a 0.90 (+0.05), lo que significa que identifica correctamente un 5% más de casos positivos. Aunque la precisión disminuye ligeramente de 0.96 a 0.92 (-0.04), el F1-Score mejora de 0.90 a 0.91 (+0.01). El AUC-ROC aumenta de 0.94 a 0.96 (+0.02), demostrando una mejor capacidad de discriminación general, mientras que la accuracy se mantiene estable en 0.93.

📚 Fuente Original del Conjunto

Spam Base Dataset

v1.0
Hewlett-Packard Labs
Disponible en repositorios públicos

📄 Resumen (Abstract)

El conjunto de datos Spam Base está diseñado para la clasificación de correos electrónicos como spam (correo no deseado) o no spam (correo legítimo). El concepto de "spam" es diverso e incluye: anuncios de productos/sitios web, esquemas de "ganar dinero rápido", cadenas de correo, pornografía, entre otros. La colección de correos spam provino de administradores de correo y de individuos que reportaron correos no deseados. La colección de correos no spam provino de correos de trabajo y personales archivados. Las palabras 'george' y el código de área '650' son indicadores de correo legítimo (no spam), útiles para construir un filtro de spam personalizado.

🔬 Contexto y Motivación

El spam es un problema significativo en la comunicación por correo electrónico, que consume anualmente miles de millones de dólares en pérdida de productividad, almacenamiento y filtrado. Los filtros de spam basados en aprendizaje automático son una de las defensas más efectivas contra este problema. Este dataset fue creado por Hewlett-Packard Labs y es uno de los más utilizados en la investigación de clasificación de texto y detección de spam.

Según Cranor y LaMacchia (1998) en Communications of the ACM, el rendimiento típico de los filtros de spam es de alrededor de ~7% de error de clasificación. Los falsos positivos (marcar correo legítimo como spam) son altamente indeseables. Si se insiste en tener cero falsos positivos en el conjunto de entrenamiento/prueba, entre el 20-25% del spam pasa a través del filtro.

⚠️ Observación Importante

Las palabras 'george' y el código de área '650' son indicadores de no spam en este dataset, ya que provienen de correos de trabajo de Hewlett-Packard (ubicada en el área 650 de California). Para construir un filtro de spam de propósito general, es necesario cegar tales indicadores o obtener una colección de no spam muy amplia y diversa.

📊 Descripción de Datos

El dataset contiene 4,601 instancias (correos electrónicos) con 57 atributos (56 variables predictoras y 1 variable objetivo). Las características son de tipo continuo y entero.

📋 Estructura de las Variables

Las 57 variables se dividen en cuatro categorías:

1. Frecuencias de Palabras (48 atributos)

Variables de tipo word_freq_PALABRA (48 variables continuas en [0,100])

  • Porcentaje de palabras en el correo que coinciden con PALABRA
  • Cálculo: 100 × (número de veces que aparece la palabra) / (total de palabras en el correo)
  • Una "palabra" es cualquier cadena de caracteres alfanuméricos delimitada por caracteres no alfanuméricos

Ejemplos de palabras: make, address, all, 3d, our, over, remove, internet, order, mail, receive, will, people, report, addresses, free, business, email, you, credit, your, font, 000, money, hp, hpl, george, 650, lab, labs, telnet, 857, data, 415, 85, technology, 1999, parts, pm, direct, cs, meeting, original, project, re, edu, table, conference

2. Frecuencias de Caracteres (6 atributos)

Variables de tipo char_freq_CARACTER (6 variables continuas en [0,100])

  • Porcentaje de caracteres en el correo que coinciden con CARACTER
  • Cálculo: 100 × (número de ocurrencias del carácter) / (total de caracteres en el correo)
  • Caracteres: ; (punto y coma), ( (paréntesis abierto), [ (corchete abierto), ! (exclamación), $ (dólar), # (numeral)
3. Longitudes de Secuencias de Mayúsculas (3 atributos)
  • capital_run_length_average (continuo [1,...]): Longitud promedio de secuencias ininterrumpidas de letras mayúsculas
  • capital_run_length_longest (entero [1,...]): Longitud de la secuencia más larga de letras mayúsculas
  • capital_run_length_total (entero [1,...]): Suma de las longitudes de secuencias de mayúsculas (total de letras mayúsculas en el correo)
4. Variable Objetivo
  • Class (binaria): 1 = Spam, 0 = No Spam

📋 Características del Dataset

  • Tipo de problema: Clasificación binaria (Spam vs. No Spam)
  • Dimensión: Multivariante (4,601 × 57)
  • Tipo de características: Continuas y Enteras
  • Valores faltantes: No reportados
  • Área de aplicación: Procesamiento de Texto, Ciberseguridad, Filtrado de Correo
  • Rendimiento típico: ~7% de error de clasificación
  • Desafío principal: Minimizar falsos positivos (correo legítimo marcado como spam)

📖 Referencia Académica

Para más información sobre el problema del spam, se recomienda consultar:

Cranor, L. F., & LaMacchia, B. A. (1998). Spam!. Communications of the ACM, 41(8), 74-83. https://doi.org/10.1145/280324.280336

⚖️ Ética y Privacidad

El conjunto de datos contiene correos electrónicos que han sido anonimizados y transformados en características numéricas (frecuencias de palabras y caracteres, métricas de mayúsculas). No contiene contenido textual completo de los correos, lo que protege la privacidad de los remitentes y destinatarios. Restricción de confidencialidad: El uso de los datos está restringido a fines académicos y de investigación. La publicación de resultados debe limitarse a métricas de evaluación, resultados agregados y metodología del modelo, sin divulgación de información que permita la reidentificación de los correos o sus remitentes.

📋 Notas de Uso

Este conjunto de datos es uno de los más utilizados en la investigación de detección de spam. Se recomienda:

  • La variable objetivo Class está codificada como 1 = Spam y 0 = No Spam
  • Las 48 variables word_freq_* representan el porcentaje de palabras que coinciden con términos específicos
  • Las palabras 'george' y '650' son indicadores de no spam en este dataset (debido a su origen en HP)
  • Para construir un filtro de spam de propósito general, se debe tener cuidado con estos indicadores específicos del contexto
  • Los falsos positivos (correo legítimo clasificado como spam) son altamente indeseables y deben ser penalizados en la evaluación
  • El rendimiento típico es de aproximadamente ~7% de error de clasificación
  • Las características capital_run_length_* capturan patrones de mayúsculas, comunes en correos spam (ej: "FREE", "URGENT")
  • Estandarizar/normalizar las características dado que están en diferentes escalas
  • Utilizar validación cruzada para evaluar el rendimiento del modelo
  • El dataset es adecuado para métodos de clasificación como Regresión Logística, SVM, Árboles de Decisión, Random Forest, y Redes Neuronales

💡 Importancia en el Filtrado de Spam

El filtrado de spam es una de las aplicaciones más exitosas del aprendizaje automático en la vida cotidiana. Los filtros de spam basados en ML son utilizados por miles de millones de usuarios en todo el mundo a través de servicios como Gmail, Outlook y Yahoo Mail. La importancia de este problema radica en:

  • Productividad: El spam consume tiempo y recursos, reduciendo la eficiencia de los usuarios
  • Seguridad: El spam a menudo contiene phishing, malware y estafas que ponen en riesgo a los usuarios
  • Costos: Las empresas gastan miles de millones de dólares anualmente en infraestructura y filtrado de spam
  • Privacidad: El spam puede violar la privacidad y exponer información personal

El equilibrio entre detectar spam y evitar falsos positivos es crítico. Los falsos positivos son especialmente dañinos porque pueden causar la pérdida de correos importantes, y en el peor de los casos, correos de trabajo críticos o notificaciones legales.

📖 Cómo citar la fuente original

Spam Base Dataset. UCI Machine Learning Repository. Hewlett-Packard Labs. https://archive.ics.uci.edu/ml/datasets/Spambase

📚 Referencias Adicionales

  • Cranor, L. F., & LaMacchia, B. A. (1998). Spam!. Communications of the ACM, 41(8), 74-83. https://doi.org/10.1145/280324.280336
  • UCI Machine Learning Repository - Spambase. https://archive.ics.uci.edu/ml/datasets/Spambase
  • Sahami, M., Dumais, S., Heckerman, D., & Horvitz, E. (1998). A Bayesian approach to filtering junk e-mail. AAAI Workshop on Learning for Text Categorization, 55-62.
  • Androutsopoulos, I., Koutsias, J., Chandrinos, K. V., & Spyropoulos, C. D. (2000). An experimental comparison of naive Bayesian and keyword-based anti-spam filtering with personal e-mail messages. Proceedings of the 23rd Annual International ACM SIGIR Conference, 160-167.

🔄 Transformaciones Aplicadas

Modificaciones realizadas al conjunto original (Spambase Dataset)

  • Estructuración y nomenclatura de variables:
    • Asignación de nombres de columnas según la documentación oficial: 57 variables predictoras (48 de frecuencia de palabras + 6 de frecuencia de caracteres + 3 de longitud de mayúsculas) y 1 variable objetivo.
    • Variables de frecuencia de palabras: word_freq_make a word_freq_conference (48 columnas).
    • Variables de frecuencia de caracteres: char_freq_;, char_freq_(, char_freq_[, char_freq_!, char_freq_$, char_freq_#.
    • Variables de longitud de mayúsculas: capital_run_length_average, capital_run_length_longest, capital_run_length_total.
    • Carga del archivo spambase.data sin cabecera utilizando los nombres definidos.
  • Verificación y tratamiento de valores faltantes:
    • Confirmación de ausencia de valores perdidos en el dataset original.
    • Implementación de imputación con 0 como medida preventiva, asumiendo ausencia de palabra en el texto.
    • Garantía de integridad total del conjunto de datos.
  • Estandarización de tipos de datos:
    • Conversión forzada de la variable objetivo is_spam a tipo entero (int) para eliminar decimales.
    • Preservación de todas las variables predictoras en su tipo numérico original (flotantes).
  • Codificación de la variable objetivo:
    • Preservación de is_spam en su formato binario original: 0 = No-Spam (correo legítimo), 1 = Spam (correo basura/no solicitado).
    • Documentación detallada en leyenda sobre el objetivo de clasificación de correos electrónicos.
  • Submuestreo estratificado para reducción del dataset:
    • Reducción del dataset a 1,000 ejemplos representativos mediante muestreo estratificado.
    • Uso de train_test_split con parámetro stratify para preservar exactamente la proporción original de clases (desbalance de spam).
    • Semilla fija (random_state=42) para garantizar reproducibilidad científica de la muestra.
    • Verificación de integridad con diferencia máxima < 1% en proporción de clases.
  • Generación de documentación completa:
    • Creación del archivo leyenda_spambase.txt con semántica completa de la variable objetivo y todas las variables predictoras.
    • Documentación de variables de frecuencia de palabras (48) como porcentajes (0.0 - 100.0).
    • Documentación de variables de frecuencia de caracteres (6) como porcentajes (0.0 - 100.0).
    • Documentación de variables de longitud de mayúsculas (3) con sus unidades (media, máximo, total).
    • Contextualización del dataset: correos electrónicos para clasificación de spam/no-spam.
  • Preservación de la estructura y calidad de datos:
    • Mantenimiento de las 4,601 instancias (correos electrónicos) originales para el dataset completo.
    • Dataset reducido de 1,000 ejemplos estratificados para experimentación eficiente.
    • Dataset final con 57 variables predictoras (todas numéricas) y 1 variable objetivo binaria.
    • Guardado en formato CSV con separador punto y coma (;) para compatibilidad internacional.

📊 Resultado: Dataset de 4,601 correos electrónicos (con versión reducida estratificada de 1,000 ejemplos) con 57 variables predictoras (48 de frecuencia de palabras, 6 de frecuencia de caracteres, 3 de longitud de mayúsculas) y 1 variable objetivo binaria (is_spam). Desbalance moderado (~60% no-spam / ~40% spam) — escenario ideal para validación de técnicas de generación de datos sintéticos y evaluación del índice TabDSFidelity en contextos de clasificación de texto y detección de spam, donde las características lingüísticas y estructurales de los correos electrónicos son determinantes.

📧 Fuente: Spambase Dataset (UCI Machine Learning Repository) - Correos electrónicos para clasificación de spam/no-spam.

📊 Variables de frecuencia de palabras: 48 variables que miden el porcentaje de aparición de palabras específicas en el correo (ej. "free", "money", "credit", "remove").

🔣 Variables de frecuencia de caracteres: 6 variables que miden el porcentaje de caracteres especiales (;, (, [, !, $, #) en el correo.

🔠 Variables de mayúsculas: Longitud promedio, máxima y total de secuencias ininterrumpidas de mayúsculas — indicador de "gritos" o énfasis en spam.

📁 Leyenda disponible: Archivo leyenda_spambase.txt con descripción completa de la variable objetivo, variables de frecuencia de palabras, caracteres y mayúsculas.

🎯 Variable objetivo: is_spam (1 = Spam/correo no solicitado, 0 = No-Spam/correo legítimo).

🧹 Limpieza aplicada: Carga sin cabecera, asignación de nombres de columnas, verificación de nulos, conversión de target a entero, reducción estratificada a 1,000 ejemplos.

📋 Diccionario de Datos Detallado

Variable Descripción Tipo Rango / Categorías Unidad ¿Objetivo?
word_freq_make Frecuencia de la palabra "make" Numérico 0 - 4.54 % No
word_freq_address Frecuencia de la palabra "address" Numérico 0 - 14.28 % No
word_freq_all Frecuencia de la palabra "all" Numérico 0 - 4 % No
word_freq_3d Frecuencia de la palabra "3d" Numérico 0 - 7.07 % No
word_freq_our Frecuencia de la palabra "our" Numérico 0 - 4.54 % No
word_freq_over Frecuencia de la palabra "over" Numérico 0 - 3.57 % No
word_freq_remove Frecuencia de la palabra "remove" Numérico 0 - 4 % No
word_freq_internet Frecuencia de la palabra "internet" Numérico 0 - 3.12 % No
word_freq_order Frecuencia de la palabra "order" Numérico 0 - 3.23 % No
word_freq_mail Frecuencia de la palabra "mail" Numérico 0 - 5 % No
word_freq_receive Frecuencia de la palabra "receive" Numérico 0 - 2 % No
word_freq_will Frecuencia de la palabra "will" Numérico 0 - 5.88 % No
word_freq_people Frecuencia de la palabra "people" Numérico 0 - 5.55 % No
word_freq_report Frecuencia de la palabra "report" Numérico 0 - 5.12 % No
word_freq_addresses Frecuencia de la palabra "addresses" Numérico 0 - 2.21 % No
word_freq_free Frecuencia de la palabra "free" Numérico 0 - 4.54 % No
word_freq_business Frecuencia de la palabra "business" Numérico 0 - 4.5 % No
word_freq_email Frecuencia de la palabra "email" Numérico 0 - 9.09 % No
word_freq_you Frecuencia de la palabra "you" Numérico 0 - 18.75 % No
word_freq_credit Frecuencia de la palabra "credit" Numérico 0 - 5.22 % No
word_freq_your Frecuencia de la palabra "your" Numérico 0 - 8 % No
word_freq_font Frecuencia de la palabra "font" Numérico 0 - 10.58 % No
word_freq_000 Frecuencia de la palabra "000" Numérico 0 - 2.59 % No
word_freq_money Frecuencia de la palabra "money" Numérico 0 - 9.09 % No
word_freq_hp Frecuencia de la palabra "hp" Numérico 0 - 15.38 % No
word_freq_hpl Frecuencia de la palabra "hpl" Numérico 0 - 16.66 % No
word_freq_george Frecuencia de la palabra "george" Numérico 0 - 25 % No
word_freq_650 Frecuencia de la palabra "650" Numérico 0 - 5.88 % No
word_freq_lab Frecuencia de la palabra "lab" Numérico 0 - 10 % No
word_freq_labs Frecuencia de la palabra "labs" Numérico 0 - 5.88 % No
word_freq_telnet Frecuencia de la palabra "telnet" Numérico 0 - 4.76 % No
word_freq_857 Frecuencia de la palabra "857" Numérico 0 - 4.76 % No
word_freq_data Frecuencia de la palabra "data" Numérico 0 - 3.73 % No
word_freq_415 Frecuencia de la palabra "415" Numérico 0 - 4.76 % No
word_freq_85 Frecuencia de la palabra "85" Numérico 0 - 5.88 % No
word_freq_technology Frecuencia de la palabra "technology" Numérico 0 - 4.76 % No
word_freq_1999 Frecuencia de la palabra "1999" Numérico 0 - 4.54 % No
word_freq_parts Frecuencia de la palabra "parts" Numérico 0 - 0.46 % No
word_freq_pm Frecuencia de la palabra "pm" Numérico 0 - 4.54 % No
word_freq_direct Frecuencia de la palabra "direct" Numérico 0 - 4.76 % No
word_freq_cs Frecuencia de la palabra "cs" Numérico 0 - 7.14 % No
word_freq_meeting Frecuencia de la palabra "meeting" Numérico 0 - 5.26 % No
word_freq_original Frecuencia de la palabra "original" Numérico 0 - 1.6 % No
word_freq_project Frecuencia de la palabra "project" Numérico 0 - 4.57 % No
word_freq_re Frecuencia de la palabra "re" Numérico 0 - 16.66 % No
word_freq_edu Frecuencia de la palabra "edu" Numérico 0 - 7.14 % No
word_freq_table Frecuencia de la palabra "table" Numérico 0 - 0.93 % No
word_freq_conference Frecuencia de la palabra "conference" Numérico 0 - 2.56 % No
char_freq_semicolon Frecuencia del caracter ";" Numérico 0 - 4.123 % No
char_freq_( Frecuencia del caracter "(" Numérico 0 - 1.754 % No
char_freq_[ Frecuencia del caracter "[" Numérico 0 - 2.777 % No
char_freq_! Frecuencia del caracter "!" Numérico 0 - 32.478 % No
char_freq_$ Frecuencia del caracter "$" Numérico 0 - 5.3 % No
char_freq_# Frecuencia del caracter "#" Numérico 0 - 13.129 % No
capital_run_length_average Longitud promedio de secuencias de mayúsculas Numérico 1 - 1,021.5 caracteres No
capital_run_length_longest Longitud de la secuencia más larga de mayúsculas Numérico 1 - 2,042 caracteres No
capital_run_length_total Número total de letras mayúsculas en el email Numérico 2 - 4,128 caracteres No
is_spam Clasificación del correo electrónico (objetivo) Binario 0: No-Spam, 1: Spam N/A
58 Variables totales
57 Numéricas
0 Categóricas
1 Binarias
Objetivo: Spam (is_spam)
Datos ausentes: 0%

📈 Distribución de la variable objetivo en el conjunto original

📖 Leyenda de Variables Categóricas

Esta sección detalla los códigos y significados de las variables categóricas y binarias presentes en el conjunto de datos de Detección de Spam (Spambase). Comprender estas codificaciones es fundamental para la correcta interpretación de los resultados de clasificación de correos electrónicos.

is_spam 🎯 Objetivo
Código Significado
0 No-Spam (Legítimo) - Correo electrónico válido y seguro (~61%)
1 Spam - Correo no deseado o comercial no solicitado (~39%)
🎯

Variable Objetivo: Clasifica correos electrónicos como spam o legítimos basado en contenido textual y características.

Variables Binarias Binario

Formato: 0 = No-Spam, 1 = Spam

is_spam 🎯 Variable Objetivo: Clasificación de spam (0: No-Spam, 1: Spam)
ℹ️

Nota: Única variable binaria en el dataset.

📊
Variables binarias: 1
  • 🎯 is_spam (Objetivo - Spam)
📈
Variables numéricas: 57
  • 48 Frecuencias de palabras
  • 6 Frecuencias de caracteres
  • 3 Estadísticas de mayúsculas
⚠️
Recomendaciones de Clasificación:
  • Señales de spam: Alta frecuencia de: free, money, credit, receive, remove, 000
  • Caracteres de spam: Alta frecuencia de: !, $, # (especialmente ! en secuencias largas)
  • Mayúsculas agresivas: capital_run_length_longest alto (>100) es indicador de spam
  • Indicadores de legítimo: george, hp, hpl, edu, lab, cs (correos de HP Labs y académicos)
  • Escalado: Todas las variables están en el rango 0-100 (%), excepto las de mayúsculas
  • Mejores predictores: char_freq_!, word_freq_free, word_freq_money, capital_run_length_longest

🔬 Metodología de Generación (Reproducibilidad Científica)

📐 Método Principal

SMOTE RSB* Adaptado

Versión: 2.0

DOI: 10.1007/s42979-026-04896-8

📏 Reglas de restricción

  • capital_run_length_average ≤ capital_run_length_longest (Promedio ≤ secuencia más larga)
  • capital_run_length_longest ≤ capital_run_length_total (Secuencia más larga ≤ total mayúsculas)
  • word_freq_hpl > 0 → is_spam = 0 (HP Labs → legítimo)
  • word_freq_george > 0 → is_spam = 0 (Mención "george" → legítimo)
  • is_spam == 0 → (word_freq_650 > 0.1) OR (word_freq_857 > 0.1) OR (word_freq_415 > 0.1)
  • word_freq_make > 0.5 → is_spam = 1
  • char_freq_$ > 0.5 → is_spam = 1
  • char_freq_! > 1.5 → is_spam = 1
  • word_freq_remove > 0 → is_spam = 1
  • word_freq_business > 1 → is_spam = 1
  • word_freq_000 > 0.5 → is_spam = 1
  • is_spam == 0 → (word_freq_labs > 0.1) OR (word_freq_telnet > 0.1) OR (word_freq_technology > 0.1) OR (word_freq_data > 0.1) OR (word_freq_meeting > 0.1)
  • word_freq_credit y word_freq_cs son mutuamente excluyentes (Jerga financiera vs técnica)
  • word_freq_000 y word_freq_conference son mutuamente excluyentes
  • capital_run_length_average > 20 → is_spam = 1
  • word_freq_re > 1 → is_spam = 0

⚙️ Hiperparámetros SMOTE RSB* Adaptado

Valor escala0.03
Probabilidad Base0.1

🔄 Hiperparámetros CTGAN

epochs500
batch_size50
generator_lr0.0002
discriminator_lr0.0002
pac10
generator_dim(256, 256)
discriminator_dim(256, 256)
embedding_dim128
l2scale1e-05

📊 Hiperparámetros TVAE

epochs 500
batch_size 50
embedding_dim 128
compress_dims (128, 128)
decompress_dims (128, 128)
l2scale 1e-5
loss_factor 2

🔐 Reproducibilidad

Random Seed42
Python3.12.12

Librerías utilizadas:

  • pandas: 2.3.3
  • numpy: 2.4.4
  • scikit-learn: 1.7.2
  • imbalanced-learn: 0.14.0
  • ctgan: 0.11.1
  • torch: 2.9.0
  • sdv: 1.28.0
  • scipy: 1.16.3
  • matplotlib: 3.10.9
📝

Para reproducir exactamente este conjunto de datos, ejecute el script de generación con la semilla aleatoria 42. Los resultados pueden variar ligeramente según la versión de las librerías.

📊 Conjuntos de Datos Derivados

El conjunto original ha sido sometido a un proceso de balanceo de clases y generación sintética para mejorar la representación de clases minoritarias. Nota: se ha empleado un conjunto de validación para evaluar el índice de fidelidad. Se han generado tres familias de conjuntos:

  • 📊 Balanceados: Conjuntos creados mediante técnicas de sobremuestreo
  • 🔮 Sintéticos Puros: Conjuntos generados completamente con modelos generativos
  • ✨ Aumentados: Combinación del conjunto original + datos sintéticos

El mejor conjunto de cada etapa fue seleccionado mediante el índice TabDSFidelity.

📊 Conjuntos Balanceados 8 conjuntos

Algoritmo Ratio N° Ejemplos AUC-ROC F1 Accuracy TabDSFidelity Jensen-Shannon Kolmogorov-Smirnov Kullback-Leibler Correlación Tiempo Total (s) Dist. Promedio Copias Exactas Ataque MIA Mejor
Random Oversampling 1 728 0.949 0.934 0.935 6.648 0.053 0.828 0.023 0.992 77.849 0 728 0.557 🏆
Smote 1 728 0.955 0.919 0.920 4.859 0.129 0.598 0.023 0.993 66.498 0.001 604 0.492
Borderline SMOTE 1 728 0.955 0.914 0.915 4.757 0.118 0.740 0.023 0.993 65.964 0.002 602 0.535
ADASYN 1.038 742 0.952 0.924 0.925 5.166 0.127 0.670 0.027 0.993 65.533 0.002 602 0.480
SMOTE RSB* Adaptado 1.003 727 0.952 0.934 0.935 5.987 0.127 0.617 0.023 0.994 64.920 0.002 604 0.483
SMOTE RSB* Adaptado + Reglas 1.003 727 0.960 0.929 0.930 6.259 0.126 0.622 0.023 0.994 65.170 0.002 602 0.525
OOF PSO para Balanceo 1 728 0.953 0.949 0.950 6.076 0.152 0.377 0.023 0.753 63.800 0.063 600 0.469
OOF PSO para Balanceo + Reglas 1.110 728 0.937 0.904 0.905 0.000 0.179 0.269 0.035 0.663 65.562 0.079 510 0.453
Mejor seleccionado: Random Oversampling (TabDSFidelity: 6.648, AUC: 0.949, F1: 0.934, MIA: 0.557). Nota: Ratio <= 1.5 = Conjunto Balanceado.

🔮 Conjuntos Sintéticos Puros 10 conjuntos

Algoritmo Ratio N° Ejemplos AUC-ROC F1 Accuracy TabDSFidelity Jensen-Shannon Kolmogorov-Smirnov Kullback-Leibler Correlación Tiempo Total (s) Dist. Promedio Copias Exactas Ataque MIA Mejor
SMOTE RSB* + Ruido Gaussiano 1.432 5833 0.820 0.738 0.745 2.914 0.455 0.024 0.001 0.986 131.004 0.023 0 0.521
SMOTE RSB* + Ruido Gaussiano + Reglas 1.166 5833 0.884 0.843 0.845 5.063 0.455 0.024 0.042 0.981 368.899 0.023 0 0.592
CTGAN 1.027 10000 0.833 0.752 0.750 4.698 0.271 0.141 0.026 0.932 663.649 0.039 0 0.481
CTGAN + Reglas del Dominio 1.212 10000 0.878 0.778 0.775 5.400 0.273 0.128 0.007 0.929 1065.720 0.037 0 0.502
TVAE 1.050 10000 0.940 0.856 0.855 6.693 0.335 0.099 0.018 0.924 515.605 0.009 0 0.491
TVAE + Reglas del Dominio 1.163 10000 0.944 0.861 0.860 6.811 0.335 0.100 0.010 0.923 922.798 0.010 0 0.513
OOF PSO para Aumento 1 10000 0.832 0.747 0.750 2.022 0.501 0.037 0.023 0.586 252.782 0.285 0 0.523
OOF PSO para Aumento + Reglas 1.161 10000 0.748 0.680 0.685 0.357 0.494 0.037 0.042 0.624 657.985 0.277 0 0.509
SMOTE RSB* Refinado 1.104 6430 0.962 0.944 0.945 7.164 0.463 0.006 0.014 0.985 146.285 0.007 18 0.493 🏆
SMOTE RSB* Refinado + Reglas 1.385 6430 0.954 0.910 0.910 6.553 0.462 0.006 0.071 0.982 416.288 0.010 18 0.434
Mejor seleccionado: SMOTE RSB* Refinado (TabDSFidelity: 7.164, AUC: 0.962, F1: 0.944, MIA: 0.493). Nota: Ratio <= 1.5 = Conjunto Balanceado.

✨ Conjuntos Aumentados 10 conjuntos

Algoritmo Ratio N° Ejemplos AUC-ROC F1 Accuracy TabDSFidelity Jensen-Shannon Kolmogorov-Smirnov Kullback-Leibler Correlación Tiempo Total (s) Dist. Promedio Copias Exactas Ataque MIA Mejor
SMOTE RSB* + Ruido Gaussiano 1.375 6561 0.937 0.908 0.910 4.833 0.412 0.025 0.002 0.987 256.371 0.022 0 0.519
SMOTE RSB* + Ruido Gaussiano + Reglas 1.146 6561 0.950 0.878 0.880 4.212 0.412 0.025 0.040 0.984 492.933 0.023 0 0.530
CTGAN 1.025 10728 0.926 0.841 0.840 2.864 0.247 0.156 0.026 0.935 876.327 0.036 147 0.474
CTGAN + Reglas del Dominio 1.197 10728 0.943 0.880 0.880 5.352 0.249 0.144 0.008 0.933 1277.690 0.034 147 0.552
TVAE 1.046 10728 0.948 0.904 0.905 6.154 0.313 0.107 0.018 0.948 730.947 0.008 147 0.492
TVAE + Reglas del Dominio 1.151 10728 0.956 0.909 0.910 6.777 0.313 0.109 0.010 0.948 1133.020 0.009 147 0.538 🏆
OOF PSO para Aumento 1 10728 0.946 0.934 0.935 5.226 0.461 0.037 0.023 0.604 464.555 0.266 147 0.523
OOF PSO para Aumento + Reglas 1.149 10728 0.965 0.929 0.930 6.123 0.455 0.037 0.040 0.641 886.158 0.258 147 0.509
SMOTE RSB* Refinado 1.093 7158 0.961 0.919 0.920 6.349 0.419 0.006 0.014 0.986 289.101 0.006 245 0.556
SMOTE RSB* Refinado + Reglas 1.339 7158 0.956 0.924 0.925 6.333 0.418 0.006 0.065 0.984 559.578 0.009 245 0.538
Mejor seleccionado: TVAE + Reglas del Dominio (TabDSFidelity: 6.777, AUC: 0.956, F1: 0.909, MIA: 0.538). Nota: Ratio <= 1.5 = Conjunto Balanceado.

📈 Diagrama del Proceso de Generación

Conjunto Original
CD_37
Balanceo
(8 métodos)
↓ Selección por TabDSFidelity
⭐ Mejor Balanceado
Random Oversampling
Generación Sintética
(10 métodos)
↓ Evaluación TabDSFidelity
⭐ Mejor Sintético
SMOTE RSB* Refinado
⭐ Mejor Aumentado
TVAE + Reglas del Dominio
Conjunto Sintético Final
Seleccionado por calidad

📊 Guía de Métricas de Evaluación

Para interpretar correctamente los resultados de los conjuntos de datos generados, es fundamental comprender qué mide cada métrica y cómo se relacionan entre sí. A continuación, se detalla cada una de las métricas utilizadas en la evaluación:

🎯 Métricas de Rendimiento Predictivo

AUC-ROC (0.5 - 1.0)

¿Qué mide? Capacidad del modelo para distinguir entre clases (Ej: mortalidad vs supervivencia).

Interpretación:

  • 0.5: Sin capacidad predictiva (aleatorio)
  • 0.7-0.8: Aceptable
  • 0.8-0.9: Excelente
  • >0.9: Sobresaliente

Ejemplo: AUC-ROC = 0.82 significa que hay un 82% de probabilidad de que el modelo clasifique correctamente un paciente fallecido frente a uno superviviente.

F1-Score (0 - 1.0)

¿Qué mide? Media armónica entre precisión y sensibilidad (recall).

Interpretación:

  • 0.7-0.8: Buen equilibrio entre precisión y sensibilidad
  • 0.8-0.9: Muy buen equilibrio
  • >0.9: Excelente equilibrio

Ejemplo: F1 = 0.76 indica que el modelo mantiene un buen balance entre identificar correctamente a los pacientes que fallecen (sensibilidad) y no etiquetar erróneamente a los que sobreviven (precisión).

Accuracy (0 - 1.0)

¿Qué mide? Proporción de predicciones correctas sobre el total.

Interpretación:

  • 0.7-0.8: Buen rendimiento general
  • 0.8-0.9: Muy buen rendimiento
  • >0.9: Excelente rendimiento

Ejemplo: Accuracy = 0.75 significa que el 75% de las predicciones del modelo son correctas.

⚠️ Nota: En conjuntos desbalanceados, esta métrica puede ser engañosa. Es mejor usar F1-Score o AUC-ROC.

🔬 Índice de Fidelidad del Conjunto

TabDSFidelity (0 - 10+)

¿Qué mide? Calidad global del conjunto sintético comparado con el original.

Interpretación:

  • < 3.0: Baja fidelidad (poca similitud con el original)
  • 3.0 - 6.0: Fidelidad moderada
  • 6.0 - 8.0: Alta fidelidad
  • > 8.0: Muy alta fidelidad (excelente representación)

Ejemplo: TabDSFidelity = 8.08 indica que el conjunto sintético mantiene una alta similitud con el original, preservando las relaciones y distribuciones de los datos reales, además de maximizar su eficacia predictiva.

💡 Importante: Este es el índice para seleccionar el mejor conjunto de datos sintéticos. Para este caso, el peso empleado para las métricas "AUC-ROC", "F1-Score" y "Accuracy" fue (2) y para el resto de las métricas fue (1).

📊 Métricas de Similitud de Distribuciones

Jensen-Shannon (Promedio) (0 - 1.0)

¿Qué mide? Similitud entre las distribuciones de variables numéricas del conjunto sintético y el original.

Interpretación:

  • Cerca de 0: Distribuciones muy similares (ideal)
  • 0.1 - 0.3: Diferencias moderadas
  • > 0.3: Diferencias significativas

Ejemplo: JS = 0.118 indica que las distribuciones de las variables numéricas (edad, presión arterial, etc.) son bastante similares a las del conjunto original.

📌 Nota: Es el promedio de la divergencia de Jensen-Shannon calculada para todas las variables numéricas.

Kolmogorov-Smirnov (p-valor promedio) (0 - 1.0)

¿Qué mide? Probabilidad estadística de que las muestras numéricas del conjunto sintético provengan de la misma distribución continua que el original.

Interpretación:

  • Cerca de 1.0: Altísima probabilidad de que sean la misma distribución (ideal)
  • > 0.05: Similitud aceptable (no se rechaza que sean iguales)
  • < 0.05: Diferencias estadísticamente significativas

Ejemplo: KS p-valor = 0.753 indica que hay evidencia fuerte a favor de que las distribuciones acumulativas de la variable sintética y la original son equivalentes.

📌 Nota: Se reporta el promedio de los p-valores obtenidos mediante la prueba de Kolmogorov-Smirnov de dos muestras para las variables numéricas.

Kullback-Leibler (Promedio) (0 - ∞)

¿Qué mide? Divergencia entre las distribuciones de variables categóricas del conjunto sintético y el original.

Interpretación:

  • Cerca de 0: Distribuciones muy similares (ideal)
  • 0.01 - 0.1: Diferencias pequeñas
  • > 0.1: Diferencias notables

Ejemplo: KL = 0.014 indica que la distribución de las variables categóricas (género, mortalidad) es muy similar a la del conjunto original.

📌 Nota: Es el promedio de la divergencia de Kullback-Leibler para todas las variables categóricas. A diferencia de JS y KS, esta métrica se aplica solo a variables categóricas.

📊 Métricas de Estructura

Similitud de Correlación (0 - 1.0)

¿Qué mide? Preservación de las relaciones entre variables del conjunto original.

Interpretación:

  • Cerca de 1.0: Las relaciones entre variables se mantienen casi idénticas
  • > 0.9: Excelente preservación de relaciones
  • 0.7 - 0.9: Buena preservación
  • < 0.7: Pérdida significativa de relaciones

Ejemplo: Correlación = 0.976 significa que las relaciones entre variables (ej. edad y mortalidad) se mantienen en un 97.6% respecto al conjunto original.

⏱️ Métricas de Rendimiento Temporal

Tiempo Total (s) (segundos)

¿Qué mide? Tiempo total de ejecución del proceso de generación del conjunto.

Interpretación:

  • < 100s: Generación rápida
  • 100-300s: Tiempo moderado
  • > 300s: Proceso lento (puede ser aceptable para conjuntos grandes)

Ejemplo: Tiempo total = 69.45s significa que el proceso completo de generación del conjunto balanceado tomó aproximadamente 1.16 minutos.

⏱️ Nota: Incluye el tiempo de generación sintética + cálculo de métricas.

🔒 Métricas de Privacidad

Estas métricas evalúan el riesgo de exposición de información sensible y la capacidad de un atacante para inferir datos de los pacientes a partir del conjunto de datos sintéticos.

Distancia al Registro Más Cercano (≥ 0)

¿Qué mide? La distancia promedio entre cada registro sintético y su registro más cercano en el conjunto de datos original.

Interpretación:

  • Cerca de 0: Los datos sintéticos son muy similares a los originales → ⚠️ ALTO RIESGO de privacidad
  • 0.01 - 0.05: Similaridad moderada → Riesgo moderado
  • > 0.05: Buena separación de los datos originales → ✅ BAJO RIESGO de privacidad

Ejemplo: Distancia promedio = 0.015 en SMOTE indica que los registros sintéticos están relativamente cerca de los originales, lo que podría implicar un riesgo de privacidad moderado.

🔬

Metodología: Calculada utilizando la Distancia de Gower, la cual maneja internamente tipos de datos mixtos, normalizando las variables numéricas y penalizando diferencias categóricas para devolver un índice estandarizado entre 0 y 1.

💡

Recomendación: Valores < 0.01 deben ser evaluados con precaución. Idealmente, buscar valores > 0.02 para garantizar la privacidad.

Copias Exactas (≥ 0)

¿Qué mide? Número de registros sintéticos que son copias idénticas de registros en el conjunto de datos original.

Interpretación:

  • 0: Ninguna copia exacta → ✅ SEGURO
  • 1 - 10: Pocas copias → Riesgo bajo
  • 11 - 50: Copias moderadas → ⚠️ RIESGO MODERADO
  • > 50: Muchas copias → 🔴 ALTO RIESGO de reidentificación

Ejemplo: SMOTE RSB* Refinado genera 76 copias exactas de 8817 registros (0.86%), lo que representa un riesgo de privacidad que debe ser evaluado.

⚠️

Importante: La presencia de copias exactas es uno de los indicadores más críticos de fuga de datos. Idealmente, este valor debe ser 0.

Ataque de Inferencia de Membresía (MIA) (0 - 1.0)

¿Qué mide? Tasa de éxito (medida en AUC-ROC) de un atacante para determinar si un registro específico pertenece al conjunto de datos original.

Interpretación:

  • 0.5: Aleatorio (ideal) → ✅ PRIVACIDAD ÓPTIMA
  • 0.5 - 0.55: Riesgo bajo
  • 0.55 - 0.6: Riesgo moderado → ⚠️ PRIVACIDAD CUESTIONABLE
  • > 0.6: Riesgo alto → 🔴 PRIVACIDAD COMPROMETIDA

Ejemplo: MIA = 0.553 significa que el atacante tiene un éxito ligeramente superior al 50% aleatorio, lo que indica un riesgo de privacidad bajo/moderado.

🎯

Objetivo: Buscar valores lo más cercanos a 0.5. Valores > 0.6 indican que el conjunto sintético no protege adecuadamente la privacidad.

📝 Resumen Rápido para Selección

🏆
Para seleccionar el mejor conjunto:
  • Priorizar TabDSFidelity más alto
  • Buscar AUC-ROC y F1 altos
  • Valores de divergencia JS y KL cercanos a 0
  • P-valor de KS lo más cercano a 1.0 posible (>0.05)
  • Correlación > 0.9
⚖️
Balance entre calidad y tiempo:
  • Un TabDSFidelity > 8.0 indica excelente calidad
  • Tiempos de generación < 200s son aceptables
  • La Correlación > 0.95 asegura buena preservación de relaciones
🔒
Para garantizar la privacidad:
  • MIA lo más cercano a 0.5 (ideal)
  • Copias exactas = 0 (ideal) o lo más bajo posible
  • Distancia promedio > 0.02 para buena separación
  • Evaluar balance entre calidad (TabDSFidelity) y privacidad (MIA)

📥 Descargar conjuntos y código Python

Formatos incluidos: CSV.

📚 Cómo citar este conjunto

Díaz Bastida, M., Pérez Vázquez, R. A., & Bello Pérez, R. (2026). High-Fidelity Synthetic Dataset for Spam Detection (Version 1). figshare. https://doi.org/10.6084/m9.figshare.32945930.v1