Разработка системы генерации синтетических табличных данных
Синтетические табличные данные — наиболее практически востребованный тип синтетики в бизнесе. Финансовые транзакции, медицинские записи, пользовательские профили — всё это структурированные данные, которые нужны для обучения моделей, но ограничены compliance требованиями.
Выбор метода генерации
| Метод | Скорость | Качество | Приватность | Подходит для |
|---|---|---|---|---|
| Gaussian Copula | Быстро | Хорошее | Высокая | Числовые данные, нормальные распределения |
| CTGAN | Медленно | Отличное | Средняя | Категориальные + числовые |
| TVAE | Средне | Отличное | Средняя | Высокая размерность |
| REaLTabFormer | Медленно | Превосходное | Требует DP | Сложные зависимости |
CTGAN: детали реализации
import pandas as pd
from ctgan import CTGAN
import numpy as np
def train_ctgan_synthesizer(
data: pd.DataFrame,
discrete_columns: list,
epochs: int = 300
) -> CTGAN:
synthesizer = CTGAN(
embedding_dim=128,
generator_dim=(256, 256),
discriminator_dim=(256, 256),
batch_size=500,
epochs=epochs,
verbose=True,
pac=10, # Packing size для улучшения режима
)
synthesizer.fit(data, discrete_columns=discrete_columns)
return synthesizer
# Пример: финансовые транзакции
financial_data = pd.read_parquet("transactions.parquet")
discrete_cols = ['merchant_category', 'transaction_type', 'currency', 'is_fraud']
synth = train_ctgan_synthesizer(financial_data, discrete_cols)
# Генерация с сохранением соотношений классов
n_real = len(financial_data)
synthetic = synth.sample(n_real * 5) # 5x синтетических данных
# Проверка соотношения fraud (важно для несбалансированных датасетов)
print(f"Real fraud rate: {financial_data['is_fraud'].mean():.4f}")
print(f"Synthetic fraud rate: {synthetic['is_fraud'].mean():.4f}")
Обработка специфических типов данных
from sdv.single_table import CTGANSynthesizer
from sdv.metadata import SingleTableMetadata
# Специальная обработка временных рядов и ID
metadata = SingleTableMetadata()
metadata.add_column('user_id', sdtype='id', regex_format='user_[0-9]{6}')
metadata.add_column('email', sdtype='email')
metadata.add_column('phone', sdtype='phone_number')
metadata.add_column('ip_address', sdtype='ipv4_address')
metadata.add_column('amount', sdtype='numerical', computer_representation='Float')
metadata.add_column('created_at', sdtype='datetime',
datetime_format='%Y-%m-%d %H:%M:%S')
metadata.add_column('category', sdtype='categorical')
synthesizer = CTGANSynthesizer(metadata, epochs=500)
synthesizer.fit(real_df)
Условная генерация
# Генерация только определённых сегментов
# Например: только premium клиенты с транзакциями > $1000
synthetic_premium = synthesizer.sample(
num_rows=50_000,
conditions=[
Condition({'customer_tier': 'premium', 'amount_gt_1000': True})
]
)
Валидация статистического качества
from scipy.stats import ks_2samp
import matplotlib.pyplot as plt
def validate_synthetic_quality(real: pd.DataFrame, synthetic: pd.DataFrame) -> dict:
results = {}
for col in real.select_dtypes(include=np.number).columns:
ks_stat, p_value = ks_2samp(real[col].dropna(), synthetic[col].dropna())
results[col] = {
'real_mean': real[col].mean(),
'synthetic_mean': synthetic[col].mean(),
'real_std': real[col].std(),
'synthetic_std': synthetic[col].std(),
'ks_stat': ks_stat,
'distribution_match': p_value > 0.05
}
# Корреляционная матрица
real_corr = real.select_dtypes(np.number).corr()
synth_corr = synthetic.select_dtypes(np.number).corr()
corr_diff = (real_corr - synth_corr).abs().mean().mean()
results['correlation_mae'] = corr_diff # Цель: < 0.05
return results
Для большинства задач оптимизации ML-моделей синтетические данные, сгенерированные CTGAN с score > 0.85 по SDMetrics, позволяют достичь 95-98% качества модели по сравнению с обучением на реальных данных того же объёма.







