Guía paso a paso para crear datos sintéticos utilizando la bóveda de datos sintéticos (SDV)

Los datos del mundo real a menudo son costosos, desordenados y limitados por las reglas de privacidad. Los datos sintéticos ofrecen una solución, y ya se usa ampliamente:

  • LLMS Train en texto generado por IA
  • Los sistemas de fraude simulan casos de borde
  • Los modelos de visión se prevían en imágenes falsas

SDV (Synthetic Data Vault) es una biblioteca de Python de código abierto que genera datos tabulares realistas utilizando el aprendizaje automático. Aprende patrones de datos reales y crea datos sintéticos de alta calidad para un intercambio seguro, pruebas y capacitación de modelos.

En este tutorial, utilizaremos SDV para generar datos sintéticos paso a paso.

Primero instalaremos la biblioteca SDV:

from sdv.io.local import CSVHandler

connector = CSVHandler()
FOLDER_NAME = '.' # If the data is in the same directory

data = connector.read(folder_name=FOLDER_NAME)
salesDf = data['data']

A continuación, importamos el módulo necesario y nos conectamos a nuestra carpeta local que contiene los archivos del conjunto de datos. Esto lee los archivos CSV de la carpeta especificada y los almacena como marcos de datos PANDAS. En este caso, accedemos al conjunto de datos principal utilizando datos[‘data’].

from sdv.metadata import Metadata
metadata = Metadata.load_from_json('metadata.json')

Ahora importamos los metadatos para nuestro conjunto de datos. Este metadato se almacena en un archivo JSON y le dice a SDV cómo interpretar sus datos. Incluye:

  • El nombre de la tabla
  • El clave principal
  • El tipo de datos de cada columna (por ejemplo, categórico, numérico, de fecha y hora, etc.)
  • Opcional formatos de columna como patrones de fecha y hora o patrones de identificación
  • Mesa relaciones (para configuraciones de múltiples table)

Aquí hay un formato de muestra Metadata.json:

{
  "METADATA_SPEC_VERSION": "V1",
  "tables": {
    "your_table_name": {
      "primary_key": "your_primary_key_column",
      "columns": {
        "your_primary_key_column": { "sdtype": "id", "regex_format": "T[0-9]{6}" },
        "date_column": { "sdtype": "datetime", "datetime_format": "%d-%m-%Y" },
        "category_column": { "sdtype": "categorical" },
        "numeric_column": { "sdtype": "numerical" }
      },
      "column_relationships": []
    }
  }
}
from sdv.metadata import Metadata

metadata = Metadata.detect_from_dataframes(data)

Alternativamente, podemos usar la biblioteca SDV para inferir automáticamente los metadatos. Sin embargo, los resultados no siempre son precisos o completos, por lo que es posible que deba revisarlos y actualizarlo si hay alguna discrepancia.

from sdv.single_table import GaussianCopulaSynthesizer

synthesizer = GaussianCopulaSynthesizer(metadata)
synthesizer.fit(data=salesDf)
synthetic_data = synthesizer.sample(num_rows=10000)

Con los metadatos y el conjunto de datos original listos, ahora podemos usar SDV para entrenar un modelo y generar datos sintéticos. El modelo aprende la estructura y los patrones en su conjunto de datos real y utiliza ese conocimiento para crear registros sintéticos.

Puede controlar cuántas filas generar utilizando el num_rows argumento.

from sdv.evaluation.single_table import evaluate_quality

quality_report = evaluate_quality(
    salesDf,
    synthetic_data,
    metadata)

La biblioteca SDV también proporciona herramientas para evaluar la calidad de sus datos sintéticos comparándolo con el conjunto de datos original. Un gran lugar para comenzar es generando un Informe de calidad

También puede visualizar cómo los datos sintéticos se comparan con los datos reales utilizando las herramientas de trazado incorporadas de SDV. Por ejemplo, importar get_column_plot de sdv.evaluation.single_table Para crear gráficos de comparación para columnas específicas:

from sdv.evaluation.single_table import get_column_plot

fig = get_column_plot(
    real_data=salesDf,
    synthetic_data=synthetic_data,
    column_name="Sales",
    metadata=metadata
)
   
fig.show()

Podemos observar que la distribución de la columna de ‘ventas’ en los datos reales y sintéticos es muy similar. Para explorar más a fondo, podemos usar matplotlib para crear comparaciones más detalladas, como visualizar las tendencias promedio de ventas mensuales en ambos conjuntos de datos.

import pandas as pd
import matplotlib.pyplot as plt

# Ensure 'Date' columns are datetime
salesDf['Date'] = pd.to_datetime(salesDf['Date'], format="%d-%m-%Y")
synthetic_data['Date'] = pd.to_datetime(synthetic_data['Date'], format="%d-%m-%Y")

# Extract 'Month' as year-month string
salesDf['Month'] = salesDf['Date'].dt.to_period('M').astype(str)
synthetic_data['Month'] = synthetic_data['Date'].dt.to_period('M').astype(str)

# Group by 'Month' and calculate average sales
actual_avg_monthly = salesDf.groupby('Month')['Sales'].mean().rename('Actual Average Sales')
synthetic_avg_monthly = synthetic_data.groupby('Month')['Sales'].mean().rename('Synthetic Average Sales')

# Merge the two series into a DataFrame
avg_monthly_comparison = pd.concat([actual_avg_monthly, synthetic_avg_monthly], axis=1).fillna(0)

# Plot
plt.figure(figsize=(10, 6))
plt.plot(avg_monthly_comparison.index, avg_monthly_comparison['Actual Average Sales'], label="Actual Average Sales", marker="o")
plt.plot(avg_monthly_comparison.index, avg_monthly_comparison['Synthetic Average Sales'], label="Synthetic Average Sales", marker="o")

plt.title('Average Monthly Sales Comparison: Actual vs Synthetic')
plt.xlabel('Month')
plt.ylabel('Average Sales')
plt.xticks(rotation=45)
plt.grid(True)
plt.legend()
plt.ylim(bottom=0)  # y-axis starts at 0
plt.tight_layout()
plt.show()

Este gráfico también muestra que las ventas mensuales promedio en ambos conjuntos de datos son muy similares, con solo diferencias mínimas.

En este tutorial, demostramos cómo preparar sus datos y metadatos para la generación de datos sintéticos utilizando la biblioteca SDV. Al capacitar un modelo en su conjunto de datos original, SDV puede crear datos sintéticos de alta calidad que reflejen de cerca los patrones y distribuciones de los datos reales. También exploramos cómo evaluar y visualizar los datos sintéticos, confirmando que las métricas clave como las distribuciones de ventas y las tendencias mensuales siguen siendo consistentes. Los datos sintéticos ofrecen una forma poderosa de superar los desafíos de privacidad y disponibilidad al tiempo que permiten el análisis de datos sólido y los flujos de trabajo de aprendizaje automático.


Mira el Cuaderno en Github. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro 95k+ ml de subreddit y suscribirse a Nuestro boletín.


Soy un graduado de ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en varias áreas.