<НА ГЛАВНУЮ

Полное руководство по созданию синтетических данных с помощью Synthetic Data Vault (SDV)

Руководство по использованию библиотеки Synthetic Data Vault (SDV) для создания реалистичных синтетических табличных данных с описанием установки, подготовки метаданных, генерации и оценки качества.

Почему синтетические данные?

Реальные данные часто бывают дорогими, неструктурированными и ограниченными из-за правил конфиденциальности. Синтетические данные предлагают удобное решение и уже широко используются:

  • Большие языковые модели обучаются на AI-сгенерированном тексте.
  • Системы обнаружения мошенничества моделируют крайние случаи.
  • Модели компьютерного зрения предварительно обучаются на искусственных изображениях.

Введение в SDV

Synthetic Data Vault (SDV) — это библиотека на Python с открытым исходным кодом, которая создает реалистичные синтетические табличные данные, обучаясь на реальных наборах данных с помощью машинного обучения. Это позволяет безопасно делиться данными, проводить тестирование и обучать модели без риска нарушения конфиденциальности.

Установка SDV

Для начала установите библиотеку SDV:

pip install sdv

Загрузка данных

Импортируйте необходимые модули и загрузите CSV-файлы из локальной папки:

from sdv.io.local import CSVHandler
 
connector = CSVHandler()
FOLDER_NAME = '.'  # Если данные в текущей папке
 
data = connector.read(folder_name=FOLDER_NAME)
salesDf = data['data']

Это загрузит CSV-файлы в pandas DataFrame. Основной набор данных доступен через data['data'].

Подготовка метаданных

SDV требует метаданные, которые описывают структуру и типы данных в наборе. Метаданные можно загрузить из JSON-файла:

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

Метаданные содержат:

  • Названия таблиц и первичные ключи.
  • Типы столбцов (категориальные, числовые, даты и др.).
  • Форматы столбцов, например, шаблоны дат или регулярные выражения для ID.
  • Связи между таблицами для сложных наборов.

Пример файла 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": []
    }
  }
}

Можно также автоматически определить метаданные:

metadata = Metadata.detect_from_dataframes(data)

Но автоматический вывод может быть не всегда точным, поэтому рекомендуется проверить результаты.

Создание синтетических данных

Когда метаданные и данные готовы, обучите модель и создайте синтетический набор:

from sdv.single_table import GaussianCopulaSynthesizer
 
synthesizer = GaussianCopulaSynthesizer(metadata)
synthesizer.fit(data=salesDf)
synthetic_data = synthesizer.sample(num_rows=10000)

Параметр num_rows задаёт количество строк в синтетическом наборе.

Оценка качества синтетических данных

SDV предоставляет инструменты для оценки качества синтетики по сравнению с оригиналом:

from sdv.evaluation.single_table import evaluate_quality
 
quality_report = evaluate_quality(salesDf, synthetic_data, metadata)

Также можно визуализировать распределения конкретных столбцов:

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

На графике видно, что распределение по столбцу «Sales» в реальных и синтетических данных очень похоже.

Сравнение средних продаж по месяцам

С помощью pandas и matplotlib сравним средние продажи по месяцам:

import pandas as pd
import matplotlib.pyplot as plt
 
salesDf['Date'] = pd.to_datetime(salesDf['Date'], format='%d-%m-%Y')
synthetic_data['Date'] = pd.to_datetime(synthetic_data['Date'], format='%d-%m-%Y')
 
salesDf['Month'] = salesDf['Date'].dt.to_period('M').astype(str)
synthetic_data['Month'] = synthetic_data['Date'].dt.to_period('M').astype(str)
 
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')
 
avg_monthly_comparison = pd.concat([actual_avg_monthly, synthetic_avg_monthly], axis=1).fillna(0)
 
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('Сравнение средних месячных продаж: реальные против синтетических')
plt.xlabel('Месяц')
plt.ylabel('Средние продажи')
plt.xticks(rotation=45)
plt.grid(True)
plt.legend()
plt.ylim(bottom=0)
plt.tight_layout()
plt.show()

График показывает, что синтетические данные хорошо повторяют реальные тенденции с минимальными отличиями.

Итог

SDV позволяет создавать качественные синтетические табличные данные, которые сохраняют важные статистические свойства исходного набора. Это помогает решать задачи анализа и машинного обучения, учитывая ограничения по конфиденциальности и доступности данных.

Полный учебник и исходный код доступны на GitHub. Следите за проектом и присоединяйтесь к сообществу для получения обновлений и ресурсов.

🇬🇧

Switch Language

Read this article in English

Switch to English