콘텐츠로 이동
Data Prep
상세

Synthetic Data Generation for Tabular Data

항목 내용
분야 Data Augmentation, Privacy-Preserving ML, Generative Models
주요 기법 CTGAN, TVAE, TabDDPM, TabSyn, Gaussian Copula
핵심 라이브러리 SDV (Synthetic Data Vault), Synthcity
대표 논문 CTGAN (NeurIPS 2019), TabDDPM (ICML 2023), TabSyn (ICLR 2024)

개요

합성 데이터 생성(Synthetic Data Generation)은 원본 데이터의 통계적 특성을 보존하면서 새로운 가상 데이터를 생성하는 기법이다.

활용 목적

목적 설명
프라이버시 보호 민감 정보 없이 데이터 공유 가능
데이터 증강 불균형 클래스 해결, 학습 데이터 확대
테스트 데이터 개발/테스트 환경용 현실적 데이터
규제 준수 GDPR, HIPAA 등 데이터 보호 규정 대응

품질 요구사항

+-------------------+     +-------------------+     +-------------------+
| Statistical       |     | Privacy           |     | Utility           |
| Fidelity          |     | Preservation      |     | Maintenance       |
+-------------------+     +-------------------+     +-------------------+
         |                         |                         |
         v                         v                         v
+-------------------+     +-------------------+     +-------------------+
| 분포, 상관관계,   |     | 개인 식별 불가,   |     | 하위 ML 모델에서  |
| 범주 비율 유지    |     | 멤버십 추론 방어  |     | 유사한 성능       |
+-------------------+     +-------------------+     +-------------------+

주요 기법 비교

기법별 특성 요약

기법 기반 장점 단점 적합 상황
Gaussian Copula 통계 빠름, 해석 용이 복잡한 분포 한계 정규 분포에 가까운 데이터
CTGAN GAN 복잡한 분포 학습 학습 불안정 혼합형 데이터
TVAE VAE 안정적 학습 분포 블러링 연속형 위주 데이터
TabDDPM Diffusion 고품질, 안정적 느린 샘플링 품질 중시
TabSyn Diffusion + VAE SOTA 품질 복잡한 구조 대규모, 고품질 필요

성능 벤치마크 (OpenML-CC18 기준)

기법 ML Efficiency Statistical Similarity Detection Score
TabDDPM 0.91 0.89 0.52
TabSyn 0.93 0.92 0.51
CTGAN 0.84 0.81 0.58
TVAE 0.86 0.83 0.56
GaussianCopula 0.79 0.76 0.62

(Detection Score: 낮을수록 실제 데이터와 구분 어려움)


CTGAN (Conditional Tabular GAN)

핵심 아이디어

NeurIPS 2019에서 발표된 CTGAN은 tabular 데이터의 두 가지 주요 문제를 해결한다:

  1. Mode-specific Normalization: 연속형 변수의 다중 모드 분포 처리
  2. Training-by-Sampling: 범주형 변수의 불균형 문제 해결

아키텍처

+------------------+     +------------------+     +------------------+
| Real Data        |     | Generator G      |     | Discriminator D  |
| (x_real)         |     |                  |     |                  |
+------------------+     +------------------+     +------------------+
         |                       |                        |
         v                       v                        v
+------------------+     +------------------+     +------------------+
| Mode-specific    |     | Noise z          |     | Real vs Fake     |
| Normalization    |     | + Condition c    |     | Classification   |
+------------------+     +------------------+     +------------------+
         |                       |                        |
         v                       v                        v
+------------------+     +------------------+     +------------------+
| Transformed      |     | G(z, c)          |     | D(x) -> [0, 1]   |
| x_transformed    |     | = x_fake         |     |                  |
+------------------+     +------------------+     +------------------+

Mode-specific Normalization

연속형 변수의 다중 모드 분포를 처리하기 위해:

원본 값 x_j (j번째 연속형 컬럼)
         |
         v
+---------------------------+
| Variational GMM (VGM)     |
| K개 모드로 분해           |
+---------------------------+
         |
         v
+---------------------------+
| 각 값 x_j에 대해:         |
| 1. 모드 선택 확률 계산    |
| 2. 가장 높은 모드 k 선택  |
| 3. 모드 k 내 정규화       |
+---------------------------+
         |
         v
출력: (alpha_k, beta_k)
- alpha_k: 모드 선택 one-hot
- beta_k: 모드 내 정규화된 값

Training-by-Sampling

범주형 변수의 불균형 해결:

전통적 학습:
Category A (90%) -> 90% 샘플링
Category B (10%) -> 10% 샘플링

Training-by-Sampling:
Category A (90%) -> ~50% 샘플링
Category B (10%) -> ~50% 샘플링
(로그 빈도 기반 리샘플링)

TVAE (Tabular VAE)

구조

TVAE는 Variational Autoencoder를 tabular 데이터에 적용한 모델이다:

+------------------+     +------------------+     +------------------+
| Input x          |     | Latent z         |     | Reconstructed x' |
| (transformed)    | --> | ~ N(mu, sigma)   | --> | (transformed)    |
+------------------+     +------------------+     +------------------+
        |                       |                        |
        v                       v                        v
+------------------+     +------------------+     +------------------+
| Encoder          |     | Reparameterization|    | Decoder          |
| q(z|x)           |     | z = mu + sigma*e |     | p(x|z)           |
+------------------+     +------------------+     +------------------+

손실 함수

L_TVAE = L_reconstruction + beta * L_KL

L_reconstruction:
- 연속형: Gaussian NLL 또는 MSE
- 범주형: Cross-Entropy

L_KL = KL(q(z|x) || p(z))
     = -0.5 * sum(1 + log(sigma^2) - mu^2 - sigma^2)

TabDDPM (Tabular Denoising Diffusion)

핵심 아이디어

ICML 2023에서 발표된 TabDDPM은 diffusion model을 tabular 데이터에 적용했다:

  • Gaussian Diffusion: 연속형 변수
  • Multinomial Diffusion: 범주형 변수

Forward Process (Noise 추가)

연속형 변수 (Gaussian):
x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1 - alpha_bar_t) * epsilon
epsilon ~ N(0, I)

범주형 변수 (Multinomial):
q(x_t | x_0) = Cat(x_t; p = alpha_bar_t * x_0 + (1 - alpha_bar_t) / K)
K = 범주 수

Reverse Process (Denoising)

+------------------+     +------------------+     +------------------+
| x_T ~ N(0,I)     |     | x_t              |     | x_0              |
| or Uniform       | --> | Iterative        | --> | Generated        |
+------------------+     | Denoising        |     | Sample           |
                         +------------------+     +------------------+
                                |
                                v
                         +------------------+
                         | MLP Network      |
                         | epsilon_theta(   |
                         |   x_t, t, cond)  |
                         +------------------+

학습 목표

연속형: L = E[|| epsilon - epsilon_theta(x_t, t) ||^2]

범주형: L = E[-log p_theta(x_0 | x_t)]
        (x_0 예측 후 cross-entropy)

TabSyn: VAE + Diffusion Hybrid

핵심 아이디어

ICLR 2024에서 발표된 TabSyn은 VAE와 Diffusion을 결합한 2단계 접근법이다:

+------------------+     +------------------+     +------------------+
| Stage 1: VAE     |     | Stage 2:         |     | Generated        |
| Encoder/Decoder  | --> | Latent Diffusion | --> | Tabular Data     |
+------------------+     +------------------+     +------------------+

Stage 1 (VAE Pre-training):
- 원본 데이터 -> Latent space 학습
- 연속형/범주형 각각 임베딩

Stage 2 (Latent Diffusion):
- Latent space에서 diffusion 수행
- 차원 감소로 효율성 향상

장점

항목 TabDDPM TabSyn
샘플링 공간 원본 차원 압축된 latent
샘플링 속도 느림 빠름
범주형 처리 직접 multinomial 임베딩 후 연속
품질 우수 SOTA

평가 메트릭

Statistical Fidelity

메트릭 측정 대상 계산 방법
KS Statistic 연속형 분포 max
TVD 범주형 분포 0.5 * sum(
Correlation Diff 변수 간 상관
Mutual Info Gap 비선형 관계

Machine Learning Utility

+------------------+     +------------------+     +------------------+
| Train on         |     | Train on         |     | Compare          |
| Real Data        | vs  | Synthetic Data   | --> | Performance      |
| Test on Real     |     | Test on Real     |     | Gap              |
+------------------+     +------------------+     +------------------+

ML Efficiency = Performance(Train Syn, Test Real)
              / Performance(Train Real, Test Real)

목표: ML Efficiency >= 0.9

Privacy Metrics

메트릭 의미 위험 기준
DCR (Distance to Closest Record) 가장 가까운 실제 데이터와의 거리 DCR < 0.01
NNDR (Nearest Neighbor Distance Ratio) 1등/2등 거리 비율 NNDR < 0.5
Membership Inference 멤버십 추론 공격 성공률 > 55%

Python 구현

SDV (Synthetic Data Vault) 기본 사용

from sdv.single_table import CTGANSynthesizer, TVAESynthesizer, GaussianCopulaSynthesizer
from sdv.metadata import SingleTableMetadata
import pandas as pd

# 데이터 로드
df = pd.read_csv("data.csv")

# 메타데이터 자동 감지
metadata = SingleTableMetadata()
metadata.detect_from_dataframe(df)

# 모델 선택 및 학습
# Option 1: CTGAN
synthesizer = CTGANSynthesizer(
    metadata,
    epochs=300,
    batch_size=500,
    generator_dim=(256, 256),
    discriminator_dim=(256, 256),
    verbose=True
)

# Option 2: TVAE
synthesizer = TVAESynthesizer(
    metadata,
    epochs=300,
    batch_size=500,
    compress_dims=(128, 128),
    decompress_dims=(128, 128)
)

# Option 3: GaussianCopula (빠른 baseline)
synthesizer = GaussianCopulaSynthesizer(metadata)

# 학습
synthesizer.fit(df)

# 합성 데이터 생성
synthetic_df = synthesizer.sample(num_rows=1000)

Conditional Sampling

from sdv.sampling import Condition

# 특정 조건으로 생성
conditions = [
    Condition(
        num_rows=500,
        column_values={'category': 'A', 'region': 'Seoul'}
    ),
    Condition(
        num_rows=500,
        column_values={'category': 'B', 'region': 'Busan'}
    )
]

conditional_samples = synthesizer.sample_from_conditions(conditions)

품질 평가

from sdv.evaluation.single_table import evaluate_quality, run_diagnostic

# 품질 점수 계산
quality_report = evaluate_quality(
    real_data=df,
    synthetic_data=synthetic_df,
    metadata=metadata
)
print(f"Overall Score: {quality_report.get_score()}")

# 상세 진단
diagnostic = run_diagnostic(
    real_data=df,
    synthetic_data=synthetic_df,
    metadata=metadata
)
diagnostic.get_results()

TabDDPM 구현 (tab-ddpm 라이브러리)

# pip install tab-ddpm

from tab_ddpm import GaussianMultinomialDiffusion
from tab_ddpm.utils import get_model, train, sample

import torch
import numpy as np

# 데이터 준비
X_num = np.array(...)  # 연속형 변수 (N, D_num)
X_cat = np.array(...)  # 범주형 변수 (N, D_cat), integer-encoded

# 모델 설정
num_numerical = X_num.shape[1]
num_classes = [len(np.unique(X_cat[:, i])) for i in range(X_cat.shape[1])]

model = get_model(
    model_type='mlp',
    num_numerical_features=num_numerical,
    num_classes=num_classes,
    d_in=128,
    num_layers=4,
    d_hidden=256,
    dropout=0.0,
)

# Diffusion 설정
diffusion = GaussianMultinomialDiffusion(
    num_classes=num_classes,
    num_numerical_features=num_numerical,
    denoise_fn=model,
    num_timesteps=1000,
    gaussian_loss_type='mse',
    device='cuda'
)

# 학습
train(
    diffusion=diffusion,
    X_num=X_num,
    X_cat=X_cat,
    batch_size=256,
    num_epochs=100,
    lr=1e-3
)

# 샘플링
samples = sample(
    diffusion=diffusion,
    num_samples=1000,
    batch_size=256
)

실제 활용 사례

1. 의료 데이터 공유

+------------------+     +------------------+     +------------------+
| Hospital A       |     | Synthetic EHR    |     | Research         |
| (Original EHR)   | --> | Generation       | --> | Institution      |
+------------------+     +------------------+     +------------------+
                                |
                                v
                         +------------------+
                         | Privacy          |
                         | Guaranteed       |
                         +------------------+

2. 클래스 불균형 해결

# 소수 클래스만 조건부 생성
minority_condition = Condition(
    num_rows=len(majority_class),
    column_values={'fraud': True}
)
synthetic_fraud = synthesizer.sample_from_conditions([minority_condition])

# 균형 잡힌 데이터셋 구성
balanced_df = pd.concat([
    df[df['fraud'] == False],
    synthetic_fraud
])

3. 개발/테스트 환경

환경 데이터 유형 장점
개발 합성 데이터 민감 정보 노출 없음
스테이징 합성 데이터 프로덕션과 유사한 분포
프로덕션 실제 데이터 검증된 파이프라인

선택 가이드

                    +-------------------+
                    | 데이터 특성?      |
                    +-------------------+
                            |
           +----------------+----------------+
           |                                 |
           v                                 v
+------------------+               +------------------+
| 연속형 위주     |               | 혼합형/범주 다수 |
+------------------+               +------------------+
           |                                 |
           v                                 v
+------------------+               +------------------+
| GaussianCopula  |               | 품질 vs 속도?    |
| 또는 TVAE       |               +------------------+
+------------------+                        |
                              +-------------+-------------+
                              |                           |
                              v                           v
                    +------------------+       +------------------+
                    | 속도 중시        |       | 품질 중시        |
                    +------------------+       +------------------+
                              |                           |
                              v                           v
                    +------------------+       +------------------+
                    | CTGAN            |       | TabDDPM/TabSyn   |
                    +------------------+       +------------------+

참고문헌

  1. Xu, L. et al. (2019). "Modeling Tabular Data using Conditional GAN." NeurIPS 2019. arXiv:1907.00503

  2. Kotelnikov, A. et al. (2023). "TabDDPM: Modelling Tabular Data with Diffusion Models." ICML 2023. arXiv:2209.15421

  3. Zhang, H. et al. (2024). "Mixed-Type Tabular Data Synthesis with Score-based Diffusion in Latent Space." ICLR 2024. arXiv:2310.09656

  4. SDV Documentation. https://docs.sdv.dev/

  5. Synthcity Documentation. https://synthcity.readthedocs.io/

  6. Figueira, A. & Vaz, B. (2022). "Survey on Synthetic Data Generation, Evaluation Methods and GANs." Mathematics, 10(15), 2733.