拆分合成
高異質性資料是指在同一資料集中包含多種不同性質、特性差異顯著的資料子群。這些子群在統計分布、變數關係、資料密度等方面呈現明顯差異,使得單一合成器難以同時捕捉所有子群的特性。拆分合成(Split-Synthesize-Merge)是一種利用領域知識,將異質性資料預先分割為較為同質的子集,分別進行合成後再整合的策略。
拆分合成的緣起與價值
拆分合成方法源於 CAPE 團隊在某個公部門場域協助處理大規模人口統計資料時的實務經驗。當時面臨的主要挑戰是硬體限制:資料量達數 GB 規模,超出現有硬體設備能一次性完整運算的能力,記憶體不足導致訓練過程經常中斷。為了解決這個問題,團隊採用了「拆分-合成-合併」的策略。這種拆分是以「列(row)」為單位進行,而非欄位(column)。具體做法是依據領域知識選擇關鍵分群變數(如戶口類型),根據該變數的不同類別值將資料列拆分為多個較小的子集(例如將人口資料按戶口類型拆分為單人戶、夫妻戶、單親戶、核心戶、祖孫戶、三代戶、其他戶等七個子集),然後分別對各子集進行合成,最後將合成結果整合為完整資料集。
雖然拆分合成最初是為了克服硬體限制,但團隊在實踐過程中發現這種方法本身具有獨特價值。在處理高異質性資料方面,不同子群可能有完全不同的統計特性,分開處理能更精確地捕捉各子群的特性。對於不平衡資料,罕見類別在整體資料中容易被忽略,拆分後可針對不同比例的子群調整合成策略,確保罕見類別獲得充分關注。此外,拆分合成充分利用領域知識,透過資料工程手段預先協助合成器,相較於單純依賴深度學習模型,這種方法更有效率且對異質資料有更好的掌握程度。
拆分合成的核心概念包括三個關鍵要素。首先是選擇適當的拆分變數,理想的拆分變數應該能夠代表資料內在的異質性,通常是具有明確業務意義的類別變數。其次是遵循適當的分群原則,理想的分群應具有群內同質性(同一子群內資料特性相似)和群間異質性(不同子群間差異顯著),同時避免子群大小過度懸殊。最後是整合策略的設計,在合併各子群的合成結果時,需要保持原始分群變數的分布特性,各子群的合成樣本數應依據原始比例分配,確保整合後的資料保持整體邏輯一致性。
這種方法帶來多方面的優勢:突破硬體限制,將大型資料集分割為可處理的小單元;提升合成品質,針對同質子群的特性優化;改善罕見類別處理,確保小群體獲得足夠關注;提供靈活調整策略的空間,不同子群可採用不同參數或合成器;易於實施並行處理,大幅縮短整體處理時間。
工作流程圖
flowchart TD
Start([原始資料])
Split[外部拆分<br/>使用 SQL/Python<br/>依據關鍵變數切分]
Subset1[子集 1]
Subset2[子集 2]
Subset3[子集 N...]
Synth1[PETsARD 合成<br/>子集 1]
Synth2[PETsARD 合成<br/>子集 2]
Synth3[PETsARD 合成<br/>子集 N...]
Merge[外部合併<br/>使用 SQL/Python<br/>整合所有子集]
Eval[PETsARD 評測<br/>整體品質檢驗]
End([完成])
Start --> Split
Split --> Subset1
Split --> Subset2
Split --> Subset3
Subset1 --> Synth1
Subset2 --> Synth2
Subset3 --> Synth3
Synth1 --> Merge
Synth2 --> Merge
Synth3 --> Merge
Merge --> Eval
Eval --> End
style Start fill:#e1f5fe
style Split fill:#fff9c4
style Subset1 fill:#fff9c4
style Subset2 fill:#fff9c4
style Subset3 fill:#fff9c4
style Synth1 fill:#e1f5fe
style Synth2 fill:#e1f5fe
style Synth3 fill:#e1f5fe
style Merge fill:#fff9c4
style Eval fill:#e1f5fe
style End fill:#c8e6c9
classDef external fill:#fff9c4,stroke:#f57f17,stroke-width:2px
classDef petsard fill:#e1f5fe,stroke:#0277bd,stroke-width:2px
classDef complete fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
class Split,Subset1,Subset2,Subset3,Merge external
class Synth1,Synth2,Synth3,Eval petsard
class End complete圖例說明:
- 淡黃色框:外部操作(使用 SQL/Python 進行拆分與合併)
- 淡藍色框:PETsARD 操作(合成與評測)
- 淡綠色框:流程完成
判斷是否需要拆分合成
當資料符合以下特徵時,應考慮使用拆分合成。若資料存在明顯的內在異質性,即存在可區分資料特性的關鍵變數,且不同子群的統計分布顯著不同,這是最重要的判斷依據。若資料呈現高度不平衡,關鍵變數上的某類別樣本數極少,罕見類別容易被整體分布淹沒,拆分合成能確保這些罕見類別獲得充分關注。此外,當資料量過大,單次無法載入記憶體,或訓練時間過長(超過數小時),硬體資源不足時,拆分合成也是有效的解決方案。
理想的拆分變數應具有明確業務意義(如戶口類型、交易類型、客戶分群),且該變數的不同類別值對應的資料列(row)具有截然不同的特性。例如在人口資料中,單人戶與多人戶在家庭成員數、收入結構、消費模式等欄位上呈現完全不同的模式;在交易資料中,正常交易與詐欺交易在金額、時間、頻率等特徵上有明顯區別。關鍵是找到那個能將資料自然劃分為「內部相似、彼此相異」的群組變數,確保同一類別內的資料列具有相似特性,而不同類別間的資料列則展現明顯差異。
有必要的話可以考慮對候選變數進行 ANOVA 或卡方檢定,確認不同類別間統計差異顯著。並且建議子群數量控制在 3-10 個為佳,最小子群樣本數應大於 1000,且各子群大小不宜過度懸殊(最大/最小比例應小於 100)。
某些情況下不適合使用拆分合成。若找不到能代表異質性的關鍵變數,無明確的拆分變數可用,則不應使用此方法。若資料高度同質,沒有明確的內在分群結構,所有樣本特性相似,拆分反而會增加不必要的複雜度。若拆分後某子群樣本數過少(< 1000),群組過於細碎,合成模型的代表性不足,也不適合使用拆分合成。
實際應用範例
PETsARD 目前沒有內建拆分合成功能,使用者需要在使用 PETsARD 之前手動切分資料,合成完成後再手動合併結果。以下以人口統計資料為例,示範如何使用 SQL 進行拆分與合併。
步驟 1:拆分資料
-- 按戶口類型拆分為四個子集
SELECT * FROM population_data WHERE household_type = '單人戶'
INTO OUTFILE '/data/split/household_1_single.csv';
SELECT * FROM population_data WHERE household_type = '夫妻戶'
INTO OUTFILE '/data/split/household_2_couple.csv';
SELECT * FROM population_data WHERE household_type = '核心戶'
INTO OUTFILE '/data/split/household_3_nuclear.csv';
SELECT * FROM population_data WHERE household_type = '三代戶'
INTO OUTFILE '/data/split/household_4_multigenerational.csv';步驟 2:分別對各子集執行 PETsARD 合成
為每個子集建立設定檔並執行合成:
# 執行各子群的合成
petsard run config_household_1.yaml --output synthetic_household_1.csv
petsard run config_household_2.yaml --output synthetic_household_2.csv
# ... 依此類推步驟 3:合併合成結果
-- 建立合併表格
CREATE TABLE synthetic_population_merged AS
SELECT *, '單人戶' as household_type FROM synthetic_household_1
UNION ALL
SELECT *, '夫妻戶' as household_type FROM synthetic_household_2
UNION ALL
SELECT *, '核心戶' as household_type FROM synthetic_household_3
UNION ALL
SELECT *, '三代戶' as household_type FROM synthetic_household_4;
-- 驗證合併結果的戶別分布
SELECT household_type, COUNT(*) as count,
COUNT(*) * 100.0 / (SELECT COUNT(*) FROM synthetic_population_merged) as percentage
FROM synthetic_population_merged
GROUP BY household_type;此流程展示了完整的拆分合成工作流。在拆分階段,根據戶口類型這個具有明確業務意義的變數,將原始資料分為四個子集。每個子集內的資料具有相似的家庭結構特性,例如單人戶的收入、消費模式與多人戶顯著不同。在合成階段,分別針對各子集執行 PETsARD,每個子集可以使用相同或不同的合成器參數。最後在合併階段,使用 UNION ALL 將所有子集的合成結果整合,並驗證合併後的戶別分布是否符合預期比例。
注意事項與常見問題
拆分後子群樣本數太少怎麼辦?
當某些子群樣本數不足時,可考慮調整分群策略以確保每個子群都有足夠的樣本數。具體做法包括將樣本數過少的類別(< 1000)合併為「其他」類別,或從細緻分類改為粗略分類、即以領域知識合併某些類別做泛化。
拆分合成是否會影響隱私保護?
理論上拆分合成對隱私保護的影響是雙面的。潛在風險包括小群組更容易被識別,以及拆分變數本身可能洩漏資訊(例如若拆分變數是疾病類型等敏感屬性,合成資料可能會非常具有代表性而容易被推出)。
保護措施方面,可以使用差分隱私並設定適當的隱私預算;對每個子群單獨進行隱私風險評估(如使用 Anonymeter 的指認性攻擊測試),確保每個子群的風險都低於可接受閾值;若某群組隱私風險過高且樣本數少,考慮將其合併為「其他」類別。
如有必要,可記錄並報告每個子群的隱私指標,特別留意樣本數少於 1,000 的群組。
能否在拆分後使用不同的合成器?
可以,而且這正是拆分合成的優勢之一。不同子群可根據其特性選擇最適合的合成器。建議實施策略為先對所有子群使用相同合成器建立基準,識別品質不佳的子群後,針對問題子群嘗試不同合成器,最後比較結果並選擇最佳組合。
整體而言,拆分合成相比直接合成有什麼優缺點?
拆分合成的優點:能突破硬體限制將大型資料集分割處理、降低記憶體需求並可平行運算加速;針對異質資料能更精確地捕捉各子群特性,確保罕見子群獲得充分關注;提供靈活的參數調整空間,不同子群可使用不同策略和超參數設定。
拆分合成的缺點:增加操作複雜度,需要額外的資料處理步驟、多個設定檔和合成任務,合併階段也需要謹慎處理;可能遺失不同子群間的關聯性,整體模式的捕捉可能不如直接合成;管理成本上升,需要追蹤多個合成任務,品質評估更加複雜,除錯困難度也隨之增加。