自訂合成方法:SDV

自訂合成方法:SDV

SDV (Synthetic Data Vault) 是業界主流且廣受歡迎的合成資料生成套件,提供多種先進的演算法。為了幫助使用者了解如何在 PETsARD 中整合外部套件,我們額外開發了這個示範,展示如何使用 custom_method 方式靈活運用 SDV 的各種合成方法,並完全控制所有參數設定,包括 CPU/GPU 選擇、訓練參數調整等。這個示範不僅展示了 SDV 的使用方式,更重要的是提供了自訂外部方法的完整範例,讓您可以輕鬆整合其他第三方套件或自行開發的演算法。

使用範例

請點擊下方按鈕在 Colab 中執行範例:

Open In Colab

Loader:
  load_benchmark_with_schema:
    filepath: benchmark://adult-income
    schema: benchmark://adult-income_schema
    nrows: 100 # 載入前 100 筆資料以加快測試速度
Preprocessor:
  default:
    method: default

Synthesizer:
  # 方法 1: GaussianCopula
  exp1_gaussiancopula:
    method: custom_method
    module_path: sdv-custom-methods.py
    class_name: SDV_GaussianCopula
    # 可選參數:
    # device: cpu                      # 計算設備(預設:cpu)
    # default_distribution: truncnorm  # 數值欄位的預設分布(預設:truncnorm)
    # enforce_min_max_values: true     # 強制最小/最大值限制(預設:true)
    # enforce_rounding: true           # 整數欄位四捨五入(預設:true)
    # numerical_distributions:         # 欄位特定分布(預設:{})
    #   age: beta
    #   hours-per-week: gamma

  # 方法 2: CTGAN
  exp2_ctgan:
    method: custom_method
    module_path: sdv-custom-methods.py
    class_name: SDV_CTGAN
    epochs: 2                       # 訓練輪數(預設:300)
    batch_size: 50                  # 批次大小(預設:500)⚠️ 重要:必須可被 'pac' 整除(預設 pac=10)
    verbose: true                   # 顯示訓練進度(預設:false)
    generator_dim:                  # 生成器層大小(預設:(256, 256))
      - 16
      - 16
    discriminator_dim:              # 判別器層大小(預設:(256, 256))
      - 16
      - 16
    # 可選參數:
    # device: cpu                   # 計算設備(預設:cpu)
    # pac: 10                       # PAC(打包)大小(預設:10)
    # discriminator_steps: 1        # 每次生成器更新的判別器更新次數(預設:1)
    # generator_lr: 0.0002          # 生成器學習率(預設:0.0002)
    # discriminator_lr: 0.0002      # 判別器學習率(預設:0.0002)
    # enforce_rounding: true        # 整數欄位四捨五入(預設:true)

  # 方法 3: CopulaGAN
  exp3_copulagan:
    method: custom_method
    module_path: sdv-custom-methods.py
    class_name: SDV_CopulaGAN
    epochs: 2                       # 訓練輪數(預設:300)
    batch_size: 50                  # 批次大小(預設:500)
                                    # ⚠️ 重要:必須可被 'pac' 整除(預設 pac=10)
                                    # 有效值:10, 20, 30, 40, 50, 60, 70, 80, 90, 100 等
    # pac: 10                       # PAC(打包)大小(預設:10)
                                    # 控制樣本如何打包在一起
                                    # batch_size 必須可被此值整除
    verbose: true                   # 顯示訓練進度(預設:false)
    generator_dim:                  # 生成器層大小(預設:(256, 256))
      - 16
      - 16
    discriminator_dim:              # 判別器層大小(預設:(256, 256))
      - 16
      - 16
    # 可選參數:
    # device: cpu                   # 計算設備(預設:cpu)
    # default_distribution: beta    # 數值欄位的預設分布(預設:beta)
    # discriminator_steps: 1        # 每次生成器更新的判別器更新次數(預設:1)
    # generator_lr: 0.0002          # 生成器學習率(預設:0.0002)
    # discriminator_lr: 0.0002      # 判別器學習率(預設:0.0002)
    # enforce_rounding: true        # 整數欄位四捨五入(預設:true)
    # numerical_distributions:      # 欄位特定分布(預設:{})
    #   age: beta

  # 方法 4: TVAE
  exp4_tvae:
    method: custom_method
    module_path: sdv-custom-methods.py
    class_name: SDV_TVAE
    epochs: 2                       # 訓練輪數(預設:300)
    batch_size: 50                  # 批次大小(預設:500)
                                    # 注意:TVAE 不使用 'pac',但保持 batch_size=50 以保持一致性
    verbose: true                   # 顯示訓練進度(預設:false)
    encoder_layers:                 # 編碼器層大小(預設:(128, 128))
      - 16
      - 16
    decoder_layers:                 # 解碼器層大小(預設:(128, 128))
      - 16
      - 16
    embedding_dim: 32               # 嵌入維度(預設:128)
    # 可選參數:
    # device: cpu                   # 計算設備(預設:cpu)
    # encoder_layers: [128, 128]    # 編碼器層大小(預設:(128, 128))
    # decoder_layers: [128, 128]    # 解碼器層大小(預設:(128, 128))
    # enforce_min_max_values: true  # 強制最小/最大值限制(預設:true)
    # enforce_rounding: true        # 整數欄位四捨五入(預設:true)
    # verbose: false                # 顯示訓練進度(預設:false)
    # l2scale: 0.00001              # L2 正則化係數(預設:1e-5)
    # loss_factor: 2                # 重建損失因子(預設:2)

Postprocessor:
  default:
    method: default
Evaluator:
  eval_all_methods:
    method: sdmetrics-qualityreport
Reporter:
  save_comparison:
    method: save_report
    granularity: global

前置需求

1. 安裝 SDV

pip install sdv

2. 下載腳本

下載 sdv-custom-methods.py 到與 YAML 檔案相同的目錄。

支援的方法

1. SDV_GaussianCopula

快速的統計方法,適合大型資料集和快速原型測試。

特點:

  • 無需訓練迭代,速度最快
  • 僅支援 CPU(不使用 GPU)
  • 可自訂數值欄位的分布類型

參數說明:

參數類型預設值說明
devicestringcpu計算設備(僅支援 cpu
default_distributionstringtruncnorm數值欄位的預設分布類型
numerical_distributionsdict{}為特定欄位指定分布類型
enforce_min_max_valuesbooltrue強制數值範圍限制
enforce_roundingbooltrue整數欄位四捨五入

可用的分布類型:

  • truncnorm:截斷常態分布
  • beta:Beta 分布
  • gamma:Gamma 分布
  • uniform:均勻分布
  • norm:常態分布

使用範例:

exp_gaussiancopula:
  method: custom_method
  module_path: sdv-custom-methods.py
  class_name: SDV_GaussianCopula
  device: cpu
  default_distribution: truncnorm
  numerical_distributions:
    age: beta
    hours-per-week: gamma

2. SDV_CTGAN

基於 GAN 的深度學習方法,提供最高品質的合成資料。

特點:

  • 高品質合成資料
  • 支援 GPU 加速
  • 可完整調整訓練參數

參數說明:

參數類型預設值說明
devicestringcpu計算設備(cpucuda
epochsint300訓練輪數
batch_sizeint500批次大小
discriminator_stepsint1判別器訓練步數
generator_lrfloat0.0002生成器學習率
discriminator_lrfloat0.0002判別器學習率
generator_dimlist[256, 256]生成器隱藏層大小
discriminator_dimlist[256, 256]判別器隱藏層大小
enforce_roundingbooltrue整數欄位四捨五入
verboseboolfalse顯示訓練進度

使用範例:

exp_ctgan:
  method: custom_method
  module_path: sdv-custom-methods.py
  class_name: SDV_CTGAN
  device: cuda        # 使用 GPU 加速
  epochs: 100         # 快速測試用較少輪數
  batch_size: 500
  verbose: true       # 顯示訓練進度

3. SDV_CopulaGAN

結合統計方法和 GAN 的混合模型。

特點:

  • 平衡統計準確性和生成品質
  • 更好的邊際分布擬合
  • 支援 GPU 加速

參數說明:

參數類型預設值說明
devicestringcpu計算設備(cpucuda
epochsint300訓練輪數
batch_sizeint500批次大小
default_distributionstringbeta數值欄位的預設分布類型
numerical_distributionsdict{}為特定欄位指定分布類型
discriminator_stepsint1判別器訓練步數
generator_lrfloat0.0002生成器學習率
discriminator_lrfloat0.0002判別器學習率
enforce_roundingbooltrue整數欄位四捨五入
verboseboolfalse顯示訓練進度

使用範例:

exp_copulagan:
  method: custom_method
  module_path: sdv-custom-methods.py
  class_name: SDV_CopulaGAN
  device: cpu
  epochs: 200
  default_distribution: beta

4. SDV_TVAE

基於 VAE 的生成模型,訓練過程穩定。

特點:

  • 穩定的訓練過程
  • 較好的收斂性
  • 支援 GPU 加速

參數說明:

參數類型預設值說明
devicestringcpu計算設備(cpucuda
epochsint300訓練輪數
batch_sizeint500批次大小
encoder_layerslist[128, 128]編碼器隱藏層大小
decoder_layerslist[128, 128]解碼器隱藏層大小
embedding_dimint128嵌入維度大小
l2scalefloat0.00001L2 正則化係數
loss_factorint2重建損失因子
enforce_min_max_valuesbooltrue強制數值範圍限制
enforce_roundingbooltrue整數欄位四捨五入
verboseboolfalse顯示訓練進度

使用範例:

exp_tvae:
  method: custom_method
  module_path: sdv-custom-methods.py
  class_name: SDV_TVAE
  device: cpu
  epochs: 300
  batch_size: 1000
  encoder_layers: [256, 256]
  decoder_layers: [256, 256]

Device 參數詳解

device 參數用於指定計算設備,可選擇使用 CPU 或 GPU(CUDA)進行訓練。

方法支援情況

方法CPUCUDA
SDV_GaussianCopula✗(會發出警告並使用 CPU)
SDV_CTGAN
SDV_CopulaGAN
SDV_TVAE

常見問題

Q: CTGAN/CopulaGAN/TVAE 訓練很慢怎麼辦?

  1. 減少 epochs:從 300 降到 50-100 進行測試
  2. 使用 GPU:設定 device: cuda(如果可用)
  3. 增加 batch_size:可加快每個 epoch 的速度

Q: GaussianCopula 可以使用 GPU 嗎?

不行,GaussianCopula 是純統計方法,不使用神經網絡,因此不支援 GPU。如果設定 device: cuda,系統會發出警告並自動使用 CPU。

Q: 如何選擇合適的方法?

需求推薦方法
快速測試SDV_GaussianCopula
最高品質SDV_CTGAN(需要 GPU)
平衡品質與速度SDV_CopulaGAN
訓練穩定性SDV_TVAE
無 GPU 環境SDV_GaussianCopula 或降低 epochs