Generación de Datos Sintéticos: CTGAN, CopulaGAN y TVAE Comparados
Introducción
El acceso a datos de alta calidad es la mayor restricción en el machine learning moderno. Las regulaciones de privacidad como GDPR y HIPAA limitan cómo los datos reales pueden compartirse entre equipos y entornos. Los equipos de desarrollo y QA necesitan datos de prueba realistas que no expongan información de clientes. Los datasets desbalanceados producen modelos sesgados que fallan en las clases minoritarias. La generación de datos sintéticos aborda estos tres problemas creando registros artificiales que preservan las propiedades estadísticas de los datos reales sin contener la información de ningún individuo.
El módulo SynthGen de CorePlexML proporciona tres motores generativos profundos para datos tabulares sintéticos: CTGAN, CopulaGAN y TVAE. Cada motor adopta un enfoque diferente para aprender y reproducir la distribución conjunta de tus datos. Elegir el más adecuado depende de las características de tu dataset, tus requisitos de calidad y cuánto tiempo puedes invertir en el entrenamiento.
Esta guía compara los tres motores en detalle, recorre las métricas de evaluación de calidad y demuestra flujos de trabajo end-to-end con el SDK para generar y validar datos sintéticos.
Los Tres Motores
CTGAN: Conditional Tabular GAN
CTGAN utiliza una arquitectura de red generativa adversarial diseñada específicamente para datos tabulares. A diferencia de las GANs enfocadas en imágenes, CTGAN introduce un generador condicional que maneja los desafíos únicos de columnas con tipos mixtos. Las columnas continuas se modelan con una mezcla gaussiana variacional, mientras que las columnas categóricas utilizan un vector condicional para asegurar la representación adecuada de todas las categorías.
CTGAN destaca en el manejo de datasets desbalanceados. El mecanismo de entrenamiento condicional muestrea de todas las categorías durante el entrenamiento, evitando que el generador ignore las clases poco frecuentes. Esto lo convierte en la opción predeterminada cuando tu dataset presenta un desbalance de clases significativo, como datos de detección de fraude donde los casos positivos representan menos del 1% de los registros.
La contrapartida es la estabilidad del entrenamiento. Las GANs son notoriamente susceptibles al colapso de modos, donde el generador aprende a producir solo un subconjunto de la diversidad presente en los datos reales. CTGAN mitiga este problema mediante entrenamiento por muestreo, pero aún puede ser necesario ajustar el número de epochs y el tamaño de lote para lograr una convergencia estable en datasets complejos.
Ideal para: datos tabulares mixtos con columnas categóricas y continuas, clases desbalanceadas, datasets que requieren representación fiel de grupos minoritarios.
CopulaGAN: Generación con Preservación de Correlaciones
CopulaGAN extiende CTGAN añadiendo una capa de transformación basada en cópulas que modela explícitamente la estructura de dependencia entre columnas antes de que comience el entrenamiento GAN. Una cópula captura la correlación entre variables de forma independiente a sus distribuciones marginales, lo que significa que CopulaGAN primero aprende cómo se relacionan las columnas entre sí y luego usa la GAN para generar datos que respeten esas relaciones.
Este enfoque de dos etapas produce datos sintéticos con una preservación de correlaciones inter-columna significativamente superior a la de CTGAN estándar. Si tu dataset contiene columnas con dependencias fuertes — como edad e ingreso en un dataset de préstamos, o temperatura y presión en un dataset de sensores — CopulaGAN reproducirá esas relaciones con mayor precisión.
El paso adicional de ajuste de la cópula añade tiempo de entrenamiento, y CopulaGAN puede ser sensible al número de valores distintos en columnas categóricas. Las features categóricas de muy alta cardinalidad pueden requerir preprocesamiento previo al entrenamiento.
Ideal para: datos financieros y actuariales, cualquier dataset donde preservar correlaciones estadísticas entre columnas sea crítico, datos tabulares derivados de sensores y series temporales.
TVAE: Tabular Variational Autoencoder
TVAE adopta un enfoque fundamentalmente diferente al de los motores basados en GAN. En lugar de entrenar un generador y un discriminador en un bucle adversarial, TVAE utiliza un autoencoder variacional que aprende una representación latente comprimida de tus datos y genera nuevos registros muestreando desde ese espacio latente.
La ventaja práctica es velocidad y estabilidad. TVAE se entrena significativamente más rápido que CTGAN y CopulaGAN porque evita la dinámica de entrenamiento adversarial que puede ralentizar la convergencia. No existe riesgo de colapso de modos. El entrenamiento también es más predecible: las curvas de pérdida disminuyen de manera constante en lugar de oscilar entre generador y discriminador.
TVAE funciona especialmente bien con datasets de mayor tamaño donde el tiempo de entrenamiento GAN se convierte en un cuello de botella. Para datasets con más de 100,000 filas, TVAE puede producir datos sintéticos utilizables en una fracción del tiempo que requiere CTGAN.
La contrapartida es que TVAE puede no capturar distribuciones multimodales complejas con tanta precisión como CTGAN, y su preservación de correlaciones generalmente no alcanza el nivel de CopulaGAN.
Ideal para: datasets grandes, prototipado rápido, escenarios donde la velocidad de entrenamiento importa más que la máxima fidelidad distribucional.
Tabla Comparativa
| Criterio | CTGAN | CopulaGAN | TVAE |
|---|---|---|---|
| Velocidad de entrenamiento | Moderada | La más lenta | La más rápida |
| Preservación de correlaciones | Buena | La mejor | Adecuada |
| Riesgo de colapso de modos | Moderado | Moderado | Ninguno |
| Manejo de clases desbalanceadas | El mejor | Bueno | Adecuado |
| Estabilidad de entrenamiento | Moderada | Moderada | La más estable |
| Tamaño ideal del dataset | Pequeño-Mediano | Pequeño-Mediano | Mediano-Grande |
| Mejor caso de uso | Propósito general | Datos correlacionados | Generación de alto volumen |
Métricas de Calidad
Generar datos sintéticos solo es útil si puedes verificar su calidad. CorePlexML evalúa los datos sintéticos en tres dimensiones fundamentales.
Similitud Estadística
La prueba de Kolmogorov-Smirnov (KS) compara la distribución acumulada de cada columna entre los datos reales y los sintéticos. Un estadístico KS cercano a cero indica que la distribución de la columna sintética coincide estrechamente con la real. CorePlexML ejecuta esta prueba por columna y reporta una puntuación de similitud agregada. Una puntuación superior a 0.85 generalmente indica buena fidelidad estadística.
Métricas de Privacidad
La métrica de Distancia al Registro más Cercano (DCR) mide qué tan lejos se encuentra cada registro sintético de su vecino más cercano en el dataset real. Si la DCR es demasiado pequeña, los datos sintéticos podrían estar memorizando registros reales en lugar de generar nuevos. CorePlexML señala cualquier registro sintético que caiga por debajo de un umbral de distancia configurable y reporta la distribución general de DCR.
Métricas de Utilidad
La prueba de Eficacia ML responde la pregunta más práctica: ¿puede un modelo entrenado con datos sintéticos rendir de forma comparable a uno entrenado con datos reales? CorePlexML entrena el mismo algoritmo tanto con el dataset real como con el sintético, y luego evalúa ambos modelos sobre un conjunto de prueba real reservado. La razón entre el rendimiento del modelo entrenado con datos sintéticos y el entrenado con datos reales proporciona una medida directa de cuán útiles son los datos sintéticos para tareas de ML posteriores.
Flujo de Trabajo SDK
A continuación se presenta un flujo de trabajo end-to-end usando el Python SDK de CorePlexML.
from coreplexml import CorePlexMLClient
client = CorePlexMLClient(
base_url="https://api.coreplexml.io",
api_key="sk_your_api_key"
)
# Step 1: Create a SynthGen model on an existing dataset version
model = client.synthgen.create_model(
dataset_version_id="dv_abc123",
engine="CTGAN",
epochs=300,
batch_size=500
)
print(f"Training job started: {model['job_id']}")
# Step 2: Poll until training completes
status = client.jobs.wait(model["job_id"], timeout=3600)
# Step 3: Generate synthetic records
synthetic = client.synthgen.generate(
model_id=model["model_id"],
num_rows=10000
)
print(f"Generated {synthetic['row_count']} rows")
# Step 4: Evaluate quality
evaluation = client.synthgen.evaluate(
model_id=model["model_id"],
metric="ks_test"
)
print(f"KS similarity score: {evaluation['aggregate_score']}")
# Step 5: Run ML efficacy test
efficacy = client.synthgen.evaluate(
model_id=model["model_id"],
metric="ml_efficacy"
)
print(f"Efficacy ratio: {efficacy['ratio']}")
Para probar un motor diferente, simplemente cambia el parámetro engine a "CopulaGAN" o "TVAE". Todas las demás llamadas a la API permanecen idénticas.
Combinación con la Privacy Suite
Un patrón especialmente potente consiste en encadenar la Privacy Suite con SynthGen para lograr la máxima protección de datos. Primero, escanea el dataset real en busca de PII. Luego aplica transformaciones de anonimización (enmascaramiento, generalización, pseudonimización). Finalmente, entrena un modelo SynthGen sobre los datos anonimizados.
# Scan for PII
scan = client.privacy.scan(dataset_version_id="dv_abc123")
print(f"Found {scan['pii_count']} PII columns")
# Apply anonymization
anon = client.privacy.transform(
dataset_version_id="dv_abc123",
profile="HIPAA"
)
# Train synthetic model on anonymized data
model = client.synthgen.create_model(
dataset_version_id=anon["output_version_id"],
engine="CopulaGAN",
epochs=300
)
Esto produce datos sintéticos que están dos capas alejados de los individuos reales: primero anonimizados, luego sintetizados. El dataset resultante puede compartirse libremente entre equipos y entornos sin preocupaciones de privacidad.
Mejores Prácticas
Ajuste de epochs. Comienza con 300 epochs para CTGAN y CopulaGAN. Monitorea las curvas de pérdida a través de los logs del trabajo de entrenamiento. Si la pérdida del discriminador se estabiliza demasiado pronto, aumenta los epochs. Si oscila de forma errática, reduce la tasa de aprendizaje o aumenta el tamaño de lote. Para TVAE, entre 150 y 200 epochs suele ser suficiente.
Preprocesamiento de datos. SynthGen maneja tipos mixtos de forma nativa, pero obtendrás mejores resultados si limpias tus datos previamente. Elimina columnas con más del 90% de valores faltantes. Consolida categorías poco frecuentes que aparezcan menos de 5 veces. Normaliza los nombres de columnas para evitar problemas de codificación.
Estrategia de validación. Siempre reserva un conjunto de prueba de tus datos reales antes de entrenar el modelo sintético. Utiliza este conjunto de prueba para la evaluación de eficacia ML. Nunca evalúes la calidad sintética usando los mismos datos que entrenaron el generador.
Verificación de privacidad. Ejecuta la métrica DCR sobre cada dataset sintético antes de compartirlo externamente. Establece un umbral de distancia mínima apropiado para tus requisitos de cumplimiento normativo.
Cuándo NO Usar Datos Sintéticos
Los datos sintéticos no son una solución universal. Evítalos cuando la precisión exacta a nivel de registro sea indispensable, como en auditorías financieras o reportes regulatorios donde cada fila debe trazarse hasta una transacción real. No utilices datos sintéticos como reemplazo para recolectar más datos reales cuando simplemente tienes pocos datos: los generadores entrenados con menos de 500 filas rara vez producen resultados útiles. Y sé cauteloso cuando tu tarea posterior sea sensible a casos extremos poco frecuentes que el generador puede no haber aprendido a reproducir.
Los datos sintéticos son una herramienta para aumentación, privacidad y pruebas. Complementan los datos reales en lugar de reemplazarlos. Utilizados correctamente con el motor adecuado y la validación apropiada, pueden acelerar de forma significativa tu ciclo de desarrollo de ML mientras mantienen tu programa de datos en cumplimiento y seguro.