Синтетичні табличні дані для ML: генерація, код, валідація

Реальні дані часто не можна використовувати через вимоги GDPR, HIPAA або корпоративні політики, що гальмує розробку ML-моделей. Ми розробляємо синтетичні табличні дані, які зберігають статистичні властивості оригіналів, але виключають ризики витоку. Наша команда реалізує проєкт під ключ — від генерації та коду до валідації, з подальшою підтримкою.
Часті запитання

Збір реальних даних для 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.

Що входить у розробку пайплайну синтетичних даних?

Ми пропонуємо повний цикл робіт:

  1. Аналіз датасету: оцінка розподілів, кореляцій, пропусків та викидів.
  2. Вибір та налаштування моделі: підбір архітектури (CTGAN, TVAE, Gaussian Copula) та гіперпараметрів.
  3. Навчання та валідація: використання SDMetrics, KS-тестів, кореляційного аналізу.
  4. Інтеграція: створення пайплайну на Airflow або Docker, API для генерації.
  5. Документація: model card з метриками, інструкція з експлуатації, звіт про якість.
  6. Навчання команди: воркшоп з використання синтезатора та інтерпретації метрик.
  7. Гарантійна підтримка: 2 тижні після впровадження.

Терміни — від 2 до 4 тижнів залежно від складності датасету. Вартість розраховується індивідуально. Отримайте консультацію з вибору методу генерації для вашого датасету — зв'яжіться з нами. Замовте розробку пайплайну під ваші дані.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142