Полное руководство по созданию синтетических данных с помощью 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