Збір реальних даних для ML часто впирається в compliance-обмеження: GDPR, HIPAA або корпоративні політики забороняють передавати сирі датасети розробникам. У проекті з банківськими транзакціями ми не могли використовувати реальні записи — довелося генерувати синтетику, що зберегла розподіли та кореляції до KS p-value > 0.4. Синтетичні дані вирішують цю проблему: розширюють датасети, балансують класи (наприклад, 1% шахрайських транзакцій перетворити на 50%), тестують моделі без ризику витоку. За час роботи ми впровадили генерацію для 15+ проектів у фінансах, медицині та ритейлі. Кожен проект потребує індивідуального підходу — універсального рішення не існує. Особливо гостро проблема стоїть із незбалансованими датасетами: якщо цільовий клас менше 1%, без синтетики модель не навчити. Ми використовуємо CTGAN із conditional sampling, щоб генерувати приклади потрібного класу в потрібній пропорції. Економія на зборі даних — до 40%, а на compliance-аудиті — до 30%.
Чому синтетичні табличні дані необхідні для ML?
Ключовий біль — дефіцит якісних розмічених даних. Навіть якщо дані є, вони часто містять персональну інформацію, недоступну для зовнішніх команд. Синтетика знімає ці обмеження: ви отримуєте датасет із тими ж статистичними властивостями, але без ризику витоку. Для незбалансованих задач (fraud detection, рідкісні захворювання) це єдиний спосіб отримати представницьку вибірку minority class. Економія на зборі даних може досягати 40%, а швидкість розробки зростає в рази.
Як синтетичні табличні дані вирішують проблему незбалансованих класів?
CTGAN використовує conditional vector, який задає бажане співвідношення категорій у згенерованому датасеті. Наприклад, для fraud detection ми фіксуємо частку шахрайських транзакцій у 50% — це різко покращує recall моделі. Генератор і дискримінатор змагаються: перший вчиться створювати реалістичні записи, другий — відрізняти їх від реальних. У результаті розподіли та кореляції зберігаються з високою точністю. Для фінансових даних типовий KS p-value за числовими ознаками становить 0.2–0.6.
Вибір методу генерації — синтетичні табличні дані
Вибір залежить від типу даних і вимог до приватності. На основі нашого досвіду:
| Метод | Швидкість | Якість | Приватність | Підходить для |
|---|---|---|---|---|
| Gaussian Copula | Швидко | Добре | Висока | Числові дані, нормальні розподіли |
| CTGAN | Повільно | Відмінна | Середня | Категоріальні + числові |
| TVAE | Середньо | Відмінна | Середня | Висока розмірність |
| REaLTabFormer | Повільно | Чудова | Потребує DP | Складні залежності |
Gaussian Copula працює в 10 разів швидше за CTGAN, але CTGAN краще зберігає складні мультимодальні розподіли. Для незбалансованих класів CTGAN гарантує точне співвідношення класів після генерації за рахунок conditional vector. Ми налаштовуємо hyperparameters (embedding_dim, generator_dim) під кожен датасет — GPU utilization досягає 90% на епоху.
Як покращити якість синтетичних даних за допомогою fine-tuning?
Fine-tuning генеративної моделі на специфічному домені підвищує якість. Для медичних даних ми донавчаємо попередньо навчений CTGAN на 10 епохах зі зменшеним learning rate. Результат: KS p-value покращується з 0.05 до 0.4. Але важливо не перенавчитися — використовуємо early stopping за метриками SDMetrics. Для кожного проекту ми створюємо model card, де фіксуємо hyperparameters, метрики та умови генерації.
Як оцінити якість синтетичних даних?
Валідація — ключовий етап. Ми використовуємо SDMetrics та scipy для перевірки розподілів і кореляцій. Мета — щоб синтетичні дані були статистично невідмінними від реальних (p-value > 0.05).
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 return results Типові пороги якості, досяжні на практиці:
| Метрика | Цільове значення | Типовий результат (CTGAN) |
|---|---|---|
| KS p-value (числові) | > 0.05 | 0.10–0.60 |
| Correlation MAE | < 0.05 | 0.02–0.04 |
| Coverage категорій | > 95% | 98–100% |
Для більшості задач ML синтетичні дані, згенеровані CTGAN з score > 0.85 за SDMetrics, дозволяють досягти 95–98% якості моделі порівняно з навчанням на реальних даних того ж обсягу.
Розгорнути приклад коду 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, ) 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) print(f"Real fraud rate: {financial_data['is_fraud'].mean():.4f}") print(f"Synthetic fraud rate: {synthetic['is_fraud'].mean():.4f}") CTGAN: Modeling Tabular Data using Conditional GAN (Xu et al., 2019)
Коли валідація критична: типові помилки
- Перенавчання генератора: якщо модель запам'ятала реальні рядки, KS p-value аномально високий (> 0.9). Перевіряємо на дублікати.
- Неправильний вибір метрики: лише KS-тесту недостатньо — обов'язково дивимося кореляційну MAE та coverage категорій.
- Ігнорування типів даних: категоріальні ознаки з рідкісними значеннями потребують збільшення batch_size та epochs.
Що входить у розробку пайплайну синтетичних даних?
Ми пропонуємо повний цикл робіт:
- Аналіз датасету: оцінка розподілів, кореляцій, пропусків та викидів.
- Вибір та налаштування моделі: підбір архітектури (CTGAN, TVAE, Gaussian Copula) та гіперпараметрів.
- Навчання та валідація: використання SDMetrics, KS-тестів, кореляційного аналізу.
- Інтеграція: створення пайплайну на Airflow або Docker, API для генерації.
- Документація: model card з метриками, інструкція з експлуатації, звіт про якість.
- Навчання команди: воркшоп з використання синтезатора та інтерпретації метрик.
- Гарантійна підтримка: 2 тижні після впровадження.
Терміни — від 2 до 4 тижнів залежно від складності датасету. Вартість розраховується індивідуально. Отримайте консультацію з вибору методу генерації для вашого датасету — зв'яжіться з нами. Замовте розробку пайплайну під ваші дані.







