CD_41 Original + Derivados

CD_41: Handwritten Digits (Binary 8 vs All)

Conjunto de datos de reconocimiento óptico transformado a clasificación binaria desbalanceada (Dígito 8 vs Resto). Consta de 64 variables enteras (rango 0-16) que representan la intensidad de tinta en una cuadrícula espacial 8x8.

📈 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.90 0.98 0.94 180
Clase 1 0.25 0.05 0.08 20
Accuracy 0.89
Macro Avg 0.58 0.52 0.51 200
Weighted Avg 0.84 0.89 0.86 200
AUC-ROC: 0.67
F1-Score (weighted): 0.86
Accuracy: 0.89
➡️ Mejora
⬆ +0.32 AUC ⬆ +0.11 F1 ⬆ +0.07 Acc
🏆 MEJOR RENDIMIENTO

🔮 Conjunto Sintético

Clase Precisión Recall F1-Score Soporte
Clase 0 0.99 0.97 0.98 180
Clase 1 0.76 ⬆ +0.51 0.95 ⬆ +0.90 0.84 ⬆ +0.76 20
Accuracy 0.96 ⬆ +0.07
Macro Avg 0.88 ⬆ +0.30 0.96 ⬆ +0.44 0.91 ⬆ +0.40 200
Weighted Avg 0.97 ⬆ +0.13 0.96 ⬆ +0.07 0.97 ⬆ +0.11 200
AUC-ROC: 0.99 ⬆ +0.32
F1-Score (weighted): 0.97 ⬆ +0.11
Accuracy: 0.96 ⬆ +0.07

📊 Resumen de Mejoras en Clase Minoritaria (Clase 1)

🎯
Precisión
Original: 0.25
Sintético: 0.76
⬆ +0.51
📈
Recall
Original: 0.05
Sintético: 0.95
⬆ +0.90
⚖️
F1-Score
Original: 0.08
Sintético: 0.84
⬆ +0.76

📚 Fuente Original del Conjunto

Pen-Based Recognition of Handwritten Digits Dataset

v1.0
Kaynak, C.
Publicado: 1995

📄 Resumen (Abstract)

El conjunto de datos de Reconocimiento de Dígitos Manuscritos basado en Lápiz (Pen-Based Recognition of Handwritten Digits) contiene 5,620 instancias de dígitos manuscritos extraídos de un formulario preimpreso utilizando programas de preprocesamiento de NIST. Un total de 43 personas contribuyeron a la recolección de datos: 30 para el conjunto de entrenamiento y 13 diferentes para el conjunto de prueba. Los mapas de bits de 32×32 píxeles se dividen en bloques no superpuestos de 4×4 y se cuenta el número de píxeles encendidos en cada bloque, generando una matriz de entrada de 8×8 donde cada elemento es un entero en el rango 0..16. Esta reducción de dimensionalidad proporciona invarianza a pequeñas distorsiones. El objetivo es clasificar los dígitos manuscritos en 10 clases (0-9).

🔬 Contexto y Motivación

El reconocimiento de dígitos manuscritos es un problema clásico en el campo del reconocimiento de patrones y el aprendizaje automático. Este dataset fue creado como parte de una investigación sobre métodos de combinación de múltiples clasificadores para mejorar la precisión del reconocimiento. La aplicación práctica del reconocimiento de dígitos manuscritos incluye:

  • Lectura automática de cheques y documentos bancarios
  • Procesamiento de formularios y encuestas
  • Reconocimiento de direcciones postales y códigos postales
  • Digitalización de documentos históricos

El preprocesamiento de NIST (Instituto Nacional de Estándares y Tecnología de EE.UU.) es un estándar en el campo, y la reducción de 32×32 a 8×8 mediante bloques de 4×4 es una técnica efectiva para reducir dimensionalidad mientras se mantiene la información estructural de los dígitos.

📊 Descripción de Datos

El dataset contiene 5,620 instancias con 64 atributos (63 variables predictoras y 1 variable objetivo). Las características son de tipo entero en el rango 0..16 y no presentan valores faltantes. La variable objetivo representa el dígito manuscrito (0-9).

📋 Estructura de los Datos
1. Preprocesamiento NIST
  • Imágenes originales: 32×32 píxeles (mapas de bits)
  • Bloques no superpuestos: 4×4 píxeles
  • Matriz resultante: 8×8 = 64 características
  • Cada característica: número de píxeles encendidos en el bloque (0-16)
  • Esta técnica reduce dimensionalidad y proporciona invarianza a pequeñas distorsiones

Referencia: Garris, M. D., et al. (1994). NIST Form-Based Handprint Recognition System, NISTIR 5469.

2. Variables
Variable Tipo Descripción Rango
Attribute1 - Attribute64 Entero Número de píxeles encendidos en cada bloque de 4×4 0 - 16
Variable Objetivo
class Categórica (Target) Dígito manuscrito (0-9) 0,1,2,3,4,5,6,7,8,9
3. Distribución de Clases
Dígito Entrenamiento Prueba
0 376 178
1 389 182
2 380 177
3 389 183
4 387 181
5 376 182
6 377 181
7 387 179
8 380 174
9 382 180

Total: 4,494 entrenamiento, 1,126 prueba

📋 Características del Dataset

  • Tipo de problema: Clasificación multiclase (10 clases: dígitos 0-9)
  • Dimensión: Multivariante (5,620 × 64)
  • Tipo de características: Enteras (0-16)
  • Valores faltantes: No
  • Área de aplicación: Reconocimiento de Patrones, Visión por Computadora, Procesamiento de Imágenes
  • Preprocesamiento: Normalización NIST, reducción de 32×32 a 8×8
  • Participantes: 43 personas (30 entrenamiento, 13 prueba)
  • Distribución balanceada: Clases aproximadamente balanceadas

📖 Publicación Introductoria

El trabajo fundamental que describe los métodos de combinación de múltiples clasificadores aplicados al reconocimiento de dígitos manuscritos es:

Kaynak, C. (1995). Methods of Combining Multiple Classifiers and Their Applications to Handwritten Digit Recognition. MSc Thesis, Institute of Graduate Studies in Science and Engineering, Bogazici University.

📖 Referencia Técnica del Preprocesamiento NIST

Garris, M. D., Blue, J. L., Candela, G. T., Dimmick, D. L., Geist, J., Grother, P. J., Janet, S. A., & Wilson, C. L. (1994). NIST Form-Based Handprint Recognition System. NISTIR 5469. National Institute of Standards and Technology.

⚖️ Ética y Privacidad

El conjunto de datos contiene dígitos manuscritos anonimizados que no contienen información personal identificable. Los participantes son referidos únicamente por su contribución a los conjuntos de entrenamiento y prueba. 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.

📋 Notas de Uso

Este conjunto de datos es un clásico en el reconocimiento de dígitos manuscritos y es ideal para clasificación multiclase. Se recomienda:

  • La variable objetivo class está codificada como 0-9 (dígitos manuscritos)
  • Las 64 características representan una imagen de 8×8 píxeles donde cada valor indica la densidad de píxeles en bloques de 4×4
  • Los valores de las características están en el rango 0-16, lo que representa el número de píxeles encendidos en cada bloque
  • Este dataset es adecuado para redes neuronales (MLP, CNN) y métodos de clasificación tradicionales (SVM, Random Forest)
  • El conjunto de entrenamiento y prueba ya están separados (30 personas para entrenamiento, 13 para prueba)
  • Las clases están aproximadamente balanceadas (entre 376-389 ejemplos por clase en entrenamiento)
  • La reducción de 32×32 a 8×8 proporciona invarianza a pequeñas distorsiones y reduce el costo computacional
  • Utilizar matriz de confusión para evaluar el rendimiento por dígito
  • Las características no requieren normalización ya que están en un rango fijo (0-16)
  • El dataset ha sido ampliamente utilizado en investigaciones sobre combinación de clasificadores (ensemble methods)

💡 Importancia en el Reconocimiento de Patrones

El reconocimiento de dígitos manuscritos es un problema fundamental en el campo del aprendizaje automático y la visión por computadora. Este dataset ha sido utilizado como referencia en numerosas investigaciones debido a:

  • Su tamaño moderado (5,620 instancias) que permite probar rápidamente algoritmos
  • Su distribución balanceada de clases, evitando sesgos en la evaluación
  • La separación predefinida de entrenamiento y prueba (con diferentes personas)
  • La reducción de dimensionalidad (64 características) que facilita el entrenamiento de modelos
  • Su naturaleza multiclase (10 clases) que representa un desafío realista

Este dataset ha sido fundamental para el desarrollo de técnicas de ensemble y combinación de clasificadores, que son ampliamente utilizadas en aplicaciones del mundo real como la lectura automática de cheques y el procesamiento de formularios.

📖 Cómo citar la fuente original

Kaynak, C. (1995). Methods of Combining Multiple Classifiers and Their Applications to Handwritten Digit Recognition. MSc Thesis, Institute of Graduate Studies in Science and Engineering, Bogazici University. UCI Machine Learning Repository - Pen-Based Recognition of Handwritten Digits. https://archive.ics.uci.edu/ml/datasets/Pen-Based+Recognition+of+Handwritten+Digits

📚 Referencias Adicionales

  • Kaynak, C. (1995). Methods of Combining Multiple Classifiers and Their Applications to Handwritten Digit Recognition. MSc Thesis, Bogazici University.
  • Garris, M. D., Blue, J. L., Candela, G. T., Dimmick, D. L., Geist, J., Grother, P. J., Janet, S. A., & Wilson, C. L. (1994). NIST Form-Based Handprint Recognition System. NISTIR 5469. National Institute of Standards and Technology.
  • UCI Machine Learning Repository - Pen-Based Recognition of Handwritten Digits. https://archive.ics.uci.edu/ml/datasets/Pen-Based+Recognition+of+Handwritten+Digits
  • LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324. (MNIST dataset)

🔄 Transformaciones Aplicadas

Modificaciones realizadas al conjunto original (Handwritten Digits - Optical Recognition)

  • Fusión de archivos de entrenamiento y prueba:
    • Integración de 2 archivos (optdigits.tra y optdigits.tes) para crear el dataset maestro completo.
    • Asignación de nombres de columnas: 64 variables (px_0 a px_63) representando una cuadrícula de 8x8 píxeles + 1 variable de clase multiclase.
    • Carga de archivos sin cabecera con nombres definidos explícitamente.
  • Transformación de la variable objetivo de multiclase a binaria:
    • Creación de is_digit_8 a partir de la variable original class (dígitos 0-9).
    • Mapeo: class = 8 (Dígito 8) → 1 (Clase Positiva), class ≠ 8 (cualquier otro dígito) → 0 (Clase Negativa).
    • Eliminación de la columna original class para evitar Data Leakage (el modelo aprendería trivialmente que si class=8 entonces target=1).
    • Documentación detallada del objetivo: detección específica del dígito 8 en reconocimiento de patrones.
  • Estandarización y optimización de tipos de datos:
    • Conversión forzada de todas las 65 variables (64 píxeles + target) a tipo entero (int).
    • Rango de valores de píxeles: 0 a 16 (intensidad de tinta en bloques de 4x4 píxeles originales).
    • Eliminación de decimales espurios para optimizar memoria y mejorar legibilidad.
  • 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 dígito 8).
    • 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_handwritten_digits.txt con semántica completa de la variable objetivo y las variables de píxeles.
    • Documentación de la cuadrícula de 8x8 (64 píxeles) con mapa de índices visual.
    • Descripción de valores de píxeles: rango 0-16 (intensidad de tinta).
    • Contextualización del dataset: reconocimiento óptico de dígitos manuscritos.
    • Estadísticas del conjunto: total de instancias y desbalance calculado.
  • Preservación de la estructura y calidad de datos:
    • Mantenimiento de las 5,620 instancias (dígitos manuscritos) originales para el dataset completo.
    • Dataset reducido de 1,000 ejemplos estratificados para experimentación eficiente.
    • Dataset final con 64 variables predictoras (píxeles de la imagen 8x8) y 1 variable objetivo binaria.
    • Guardado en formato CSV con separador punto y coma (;) para compatibilidad internacional.

📊 Resultado: Dataset de 5,620 dígitos manuscritos (con versión reducida estratificada de 1,000 ejemplos) con 64 variables predictoras (intensidades de píxeles en cuadrícula 8x8) y 1 variable objetivo binaria (is_digit_8). Desbalance preservado (~90% otros dígitos / ~10% dígito 8) — escenario ideal para validación de técnicas de generación de datos sintéticos y evaluación del índice TabDSFidelity en contextos de reconocimiento de patrones y visión por computador, donde la detección de una clase específica en imágenes de baja resolución es fundamental.

🔢 Fuente: Optical Recognition of Handwritten Digits Dataset (UCI Machine Learning Repository) - Dígitos manuscritos de 0 a 9 en imágenes de 8x8.

🖼️ Estructura de imagen: 64 píxeles (px_0 a px_63) en cuadrícula 8x8, cada uno con intensidad de tinta de 0 a 16 (bloques de 4x4 píxeles originales).

🎯 Variable objetivo: is_digit_8 (1 = El dígito es 8, 0 = Es cualquier otro dígito: 0-7, 9).

📁 Leyenda disponible: Archivo leyenda_handwritten_digits.txt con descripción completa de la variable objetivo, mapa de la cuadrícula de píxeles, y estadísticas del conjunto.

🧹 Limpieza aplicada: Fusión de archivos .tra y .tes, transformación de multiclase a binaria, eliminación de variable original para evitar Data Leakage, estandarización de tipos, reducción estratificada a 1,000 ejemplos.

⚠️ Prevención de Data Leakage: Eliminación intencional de la variable class multiclase para evitar que el modelo aprenda la relación trivial entre la clase original y el target binario.

📋 Diccionario de Datos Detallado

Variable Descripción Tipo Rango / Categorías Unidad ¿Objetivo?
px_0 Intensidad de tinta - Bloque (0,0) - Esquina superior izquierda Numérico 0 - 0 píxeles No
px_1 Intensidad de tinta - Bloque (0,1) Numérico 0 - 7 píxeles No
px_2 Intensidad de tinta - Bloque (0,2) Numérico 0 - 16 píxeles No
px_3 Intensidad de tinta - Bloque (0,3) Numérico 0 - 16 píxeles No
px_4 Intensidad de tinta - Bloque (0,4) Numérico 0 - 16 píxeles No
px_5 Intensidad de tinta - Bloque (0,5) Numérico 0 - 16 píxeles No
px_6 Intensidad de tinta - Bloque (0,6) Numérico 0 - 16 píxeles No
px_7 Intensidad de tinta - Bloque (0,7) - Esquina superior derecha Numérico 0 - 15 píxeles No
px_8 Intensidad de tinta - Bloque (1,0) Numérico 0 - 1 píxeles No
px_9 Intensidad de tinta - Bloque (1,1) Numérico 0 - 15 píxeles No
px_10 Intensidad de tinta - Bloque (1,2) Numérico 0 - 16 píxeles No
px_11 Intensidad de tinta - Bloque (1,3) Numérico 0 - 16 píxeles No
px_12 Intensidad de tinta - Bloque (1,4) Numérico 0 - 16 píxeles No
px_13 Intensidad de tinta - Bloque (1,5) Numérico 0 - 16 píxeles No
px_14 Intensidad de tinta - Bloque (1,6) Numérico 0 - 16 píxeles No
px_15 Intensidad de tinta - Bloque (1,7) Numérico 0 - 13 píxeles No
px_16 Intensidad de tinta - Bloque (2,0) Numérico 0 - 2 píxeles No
px_17 Intensidad de tinta - Bloque (2,1) Numérico 0 - 16 píxeles No
px_18 Intensidad de tinta - Bloque (2,2) Numérico 0 - 16 píxeles No
px_19 Intensidad de tinta - Bloque (2,3) Numérico 0 - 16 píxeles No
px_20 Intensidad de tinta - Bloque (2,4) Numérico 0 - 16 píxeles No
px_21 Intensidad de tinta - Bloque (2,5) Numérico 0 - 16 píxeles No
px_22 Intensidad de tinta - Bloque (2,6) Numérico 0 - 16 píxeles No
px_23 Intensidad de tinta - Bloque (2,7) Numérico 0 - 5 píxeles No
px_24 Intensidad de tinta - Bloque (3,0) Numérico 0 - 1 píxeles No
px_25 Intensidad de tinta - Bloque (3,1) Numérico 0 - 15 píxeles No
px_26 Intensidad de tinta - Bloque (3,2) Numérico 0 - 16 píxeles No
px_27 Intensidad de tinta - Bloque (3,3) Numérico 0 - 16 píxeles No
px_28 Intensidad de tinta - Bloque (3,4) Numérico 0 - 16 píxeles No
px_29 Intensidad de tinta - Bloque (3,5) Numérico 0 - 16 píxeles No
px_30 Intensidad de tinta - Bloque (3,6) Numérico 0 - 15 píxeles No
px_31 Intensidad de tinta - Bloque (3,7) Numérico 0 - 1 píxeles No
px_32 Intensidad de tinta - Bloque (4,0) Numérico 0 - 0 píxeles No
px_33 Intensidad de tinta - Bloque (4,1) Numérico 0 - 14 píxeles No
px_34 Intensidad de tinta - Bloque (4,2) Numérico 0 - 16 píxeles No
px_35 Intensidad de tinta - Bloque (4,3) Numérico 0 - 16 píxeles No
px_36 Intensidad de tinta - Bloque (4,4) Numérico 0 - 16 píxeles No
px_37 Intensidad de tinta - Bloque (4,5) Numérico 0 - 16 píxeles No
px_38 Intensidad de tinta - Bloque (4,6) Numérico 0 - 13 píxeles No
px_39 Intensidad de tinta - Bloque (4,7) Numérico 0 - 0 píxeles No
px_40 Intensidad de tinta - Bloque (5,0) Numérico 0 - 3 píxeles No
px_41 Intensidad de tinta - Bloque (5,1) Numérico 0 - 15 píxeles No
px_42 Intensidad de tinta - Bloque (5,2) Numérico 0 - 16 píxeles No
px_43 Intensidad de tinta - Bloque (5,3) Numérico 0 - 16 píxeles No
px_44 Intensidad de tinta - Bloque (5,4) Numérico 0 - 16 píxeles No
px_45 Intensidad de tinta - Bloque (5,5) Numérico 0 - 16 píxeles No
px_46 Intensidad de tinta - Bloque (5,6) Numérico 0 - 16 píxeles No
px_47 Intensidad de tinta - Bloque (5,7) Numérico 0 - 2 píxeles No
px_48 Intensidad de tinta - Bloque (6,0) Numérico 0 - 10 píxeles No
px_49 Intensidad de tinta - Bloque (6,1) Numérico 0 - 16 píxeles No
px_50 Intensidad de tinta - Bloque (6,2) Numérico 0 - 16 píxeles No
px_51 Intensidad de tinta - Bloque (6,3) Numérico 0 - 16 píxeles No
px_52 Intensidad de tinta - Bloque (6,4) Numérico 0 - 16 píxeles No
px_53 Intensidad de tinta - Bloque (6,5) Numérico 0 - 16 píxeles No
px_54 Intensidad de tinta - Bloque (6,6) Numérico 0 - 16 píxeles No
px_55 Intensidad de tinta - Bloque (6,7) Numérico 0 - 10 píxeles No
px_56 Intensidad de tinta - Bloque (7,0) - Esquina inferior izquierda Numérico 0 - 0 píxeles No
px_57 Intensidad de tinta - Bloque (7,1) Numérico 0 - 7 píxeles No
px_58 Intensidad de tinta - Bloque (7,2) Numérico 0 - 16 píxeles No
px_59 Intensidad de tinta - Bloque (7,3) Numérico 0 - 16 píxeles No
px_60 Intensidad de tinta - Bloque (7,4) Numérico 0 - 16 píxeles No
px_61 Intensidad de tinta - Bloque (7,5) Numérico 0 - 16 píxeles No
px_62 Intensidad de tinta - Bloque (7,6) Numérico 0 - 16 píxeles No
px_63 Intensidad de tinta - Bloque (7,7) - Esquina inferior derecha Numérico 0 - 14 píxeles No
is_digit_8 Clasificación del dígito manuscrito (objetivo) Binario 0: No es 8, 1: Es 8 N/A
65 Variables totales
64 Numéricas
0 Categóricas
1 Binarias
Objetivo: Dígito 8 (is_digit_8)
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 Dígitos Manuscritos (Binary 8 vs All). Comprender estas codificaciones es fundamental para la correcta interpretación de los resultados de reconocimiento óptico de caracteres (OCR).

is_digit_8 🎯 Objetivo
Código Significado
0 No es 8 - El dígito escrito es cualquier otro (0-7, 9). Clase mayoritaria (~90.14%)
1 Es 8 - El dígito escrito es un 8. Clase minoritaria (~9.86%)
🎯

Variable Objetivo: Clasifica si el dígito manuscrito corresponde al número 8 versus cualquier otro dígito.

Variables Binarias Binario

Formato: 0 = No es 8, 1 = Es 8

is_digit_8 🎯 Variable Objetivo: Clasificación del dígito 8 (0: No, 1: Sí)
ℹ️

Nota: Única variable binaria en el dataset.

📊
Variables numéricas: 64
  • px_0 a px_63 (Matriz 8×8)
  • Rango: 0-16 (enteros)
  • 4 variables constantes: px_0, px_32, px_39, px_56
🎯
Variables binarias: 1
  • 🎯 is_digit_8 (Objetivo - Detectar dígito 8)
⚠️
Recomendaciones de Modelado:
  • Desbalance: Emplear SMOTE o ADASYN
  • Reducción dimensional: Eliminar variables constantes (px_0, px_32, px_39, px_56)
  • Normalización: Las variables ya están en escala común [0,16]. No requiere escalado adicional.
  • Estructura espacial: Considerar modelos que capturen la estructura 8×8 (CNN, SVM con kernels)
  • Métrica: Priorizar Recall sobre Accuracy para detectar la clase minoritaria

🔬 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

  • px_0 = 0 (Esquina superior izquierda)
  • px_63 = 0 (Esquina inferior derecha)
  • is_digit_8 == 1 → px_35 > 0 (Cintura del 8)
  • is_digit_8 == 1 → px_4 > 0 (Parte superior del 8)
  • is_digit_8 == 1 → px_60 > 0 (Parte inferior del 8)
  • px_11 == 0 → (px_10 > 0) OR (px_13 > 0)
  • px_27 == 16 → px_28 > 0
  • px_20 > 12 → px_28 > 0
  • is_digit_8 == 1 → px_29 ≥ 0
  • is_digit_8 == 1 → px_28 > 0
  • px_35 ≤ 16 (Valor máximo de píxel)
  • px_0 y px_63 son mutuamente excluyentes (no pueden ser ambos altos)
  • px_18 > 10 → px_27 > 0
  • is_digit_8 == 0 → px_36 < 16
  • px_28 > 10 → px_36 > 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 1082 0.993 0.955 0.960 5.545 0.077 0.429 0.372 0.952 92.645 0 1082 0.515
Smote 1 1082 0.995 0.968 0.970 6.368 0.086 0.332 0.372 0.955 72.389 0.015 600 0.517
Borderline SMOTE 1 1082 0.985 0.957 0.960 4.221 0.083 0.364 0.372 0.956 72.370 0.017 600 0.485
ADASYN 1.002 1081 0.989 0.951 0.955 4.284 0.082 0.359 0.371 0.958 72.186 0.017 600 0.478
SMOTE RSB* Adaptado 1.019 1072 0.999 0.990 0.990 8.697 0.081 0.337 0.364 0.954 81.322 0.022 600 0.502
SMOTE RSB* Adaptado + Reglas 1.019 1072 0.999 0.990 0.990 8.711 0.082 0.341 0.364 0.956 78.830 0.026 600 0.463 🏆
OOF PSO para Balanceo 1 1082 0.992 0.935 0.945 1.365 0.207 0.173 0.372 0.715 85.822 0.138 600 0.467
OOF PSO para Balanceo + Reglas 1 1082 0.996 0.935 0.945 1.551 0.215 0.076 0.372 0.696 89.853 0.156 570 0.485
Mejor seleccionado: SMOTE RSB* Adaptado + Reglas del Dominio (TabDSFidelity: 8.711, AUC: 0.999, F1: 0.990, MIA: 0.463). 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.051 4400 0.984 0.974 0.975 8.904 0.103 0.289 0.352 0.955 123.579 0.044 0 0.441 🏆
SMOTE RSB* + Ruido Gaussiano + Reglas 1.051 4400 0.995 0.974 0.975 8.895 0.104 0.276 0.352 0.955 335.331 0.044 0 0.434
CTGAN 1.008 10000 0.666 0.747 0.690 5.392 0.163 0.241 0.368 0.853 1367.950 0.164 0 0.450
CTGAN + Reglas del Dominio 1.008 10000 0.615 0.728 0.665 5.018 0.163 0.240 0.368 0.851 1815.260 0.164 0 0.450
TVAE 1.301 10000 0.988 0.954 0.950 8.402 0.136 0.248 0.275 0.913 884.406 0.102 0 0.458
TVAE + Reglas del Dominio 1.301 10000 0.986 0.958 0.955 8.397 0.136 0.246 0.275 0.912 1332.610 0.102 0 0.471
OOF PSO para Aumento 1 10000 0.882 0.038 0.110 1.393 0.378 0.066 0.372 0.591 262.968 0.220 0 0.499
OOF PSO para Aumento + Reglas 1 10000 0.870 0.038 0.110 1.363 0.374 0.068 0.372 0.594 728.181 0.214 0 0.623
SMOTE RSB* Refinado 1.070 4173 0.994 0.968 0.970 8.879 0.108 0.282 0.345 0.955 111.827 0.045 0 0.531
SMOTE RSB* Refinado + Reglas 1.070 4173 0.999 0.979 0.980 8.882 0.109 0.268 0.345 0.954 309.274 0.045 0 0.499
Mejor seleccionado: SMOTE RSB* + Ruido Gaussiano (TabDSFidelity: 8.904, AUC: 0.984, F1: 0.974, MIA: 0.441). 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.045 5472 0.995 0.979 0.980 8.637 0.098 0.291 0.354 0.956 234.371 0.039 247 0.467
SMOTE RSB* + Ruido Gaussiano + Reglas 1.045 5472 0.996 0.980 0.980 8.698 0.098 0.280 0.354 0.955 451.898 0.039 247 0.445 🏆
CTGAN 1.009 11072 0.968 0.933 0.930 2.360 0.148 0.242 0.368 0.885 1606.390 0.150 121 0.516
CTGAN + Reglas del Dominio 1.009 11072 0.971 0.951 0.950 4.118 0.148 0.241 0.368 0.885 2056.260 0.150 121 0.503
TVAE 1.270 11072 0.993 0.976 0.975 7.832 0.124 0.251 0.283 0.928 1131.630 0.094 121 0.503
TVAE + Reglas del Dominio 1.270 11072 0.993 0.971 0.970 7.359 0.124 0.248 0.283 0.927 1578.210 0.094 121 0.502
OOF PSO para Aumento 1.002 11072 0.998 0.976 0.975 5.513 0.334 0.068 0.371 0.612 515.590 0.200 121 0.497
OOF PSO para Aumento + Reglas 1.002 11072 0.999 0.981 0.980 6.066 0.330 0.070 0.371 0.625 987.559 0.195 121 0.475
SMOTE RSB* Refinado 1.059 5245 0.997 0.974 0.975 8.301 0.101 0.287 0.349 0.956 219.369 0.040 254 0.522
SMOTE RSB* Refinado + Reglas 1.059 5245 0.993 0.974 0.975 8.035 0.102 0.276 0.349 0.955 415.199 0.040 254 0.472
Mejor seleccionado: SMOTE RSB* + Ruido Gaussiano + Reglas del Dominio (TabDSFidelity: 8.698, AUC: 0.996, F1: 0.980, MIA: 0.445). Nota: Ratio <= 1.5 = Conjunto Balanceado.

📈 Diagrama del Proceso de Generación

Conjunto Original
CD_41
Balanceo
(8 métodos)
↓ Selección por TabDSFidelity
⭐ Mejor Balanceado
SMOTE RSB* Adaptado + Reglas del Dominio
Generación Sintética
(10 métodos)
↓ Evaluación TabDSFidelity
⭐ Mejor Sintético
SMOTE RSB* + Ruido Gaussiano
⭐ Mejor Aumentado
SMOTE RSB* + Ruido Gaussiano + 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 Handwritten Digit Recognition (Version 1). figshare. https://doi.org/10.6084/m9.figshare.32946101.v1