均勻編碼
類別變數(Categorical Variable)是指那些可分為不同類別或群組的變數,其值代表某種分類而非測量數值。這些值通常是離散的、非數值性質的標籤,如性別(男、女)、血型(A、B、AB、O)、城市名稱或教育程度等。類別變數可以是名義尺度(無序的類別,如顏色)或順序尺度(具有自然排序,如教育程度)。
由於大多數合成資料模型、乃至統計與機器學習算法都僅能接受數值型欄位輸入,需要透過編碼(encoding)來處理名目或順序尺度的類別變項,使得資料能被模型理解與運算。
均勻編碼的原理與優勢
均勻編碼是一種由 Datacebo 提出的類別變數處理方法,專為提升生成模型效果而設計。其核心理念是將離散的類別值映射到連續的 [0,1] 區間上,且每個類別對應的區間大小由其在原始資料中的出現頻率決定。這種方法能有效地將類別資訊轉換為連續值,同時保留類別分布的統計特性。
在實際操作中,若某類別變數包含出現比例為 1:3:1 的三個類別 ‘a’、‘b’、‘c’,則編碼時會將 ‘a’ 映射到 [0.0, 0.2) 區間、‘b’ 映射到 [0.2, 0.8) 區間、‘c’ 映射到 [0.8, 1.0] 區間,並在各自區間內隨機取值。還原時則根據數值落入的區間來對應回原始類別。這種雙向轉換機制確保了資料在建模與還原過程中的完整性。
均勻編碼同時解決了多個資料處理難題。根據 Datacebo 的研究,首先,它將離散分布轉換為連續分布以便於建模,並提供固定的值域範圍 [0,1] 便於還原。更重要的是,這種方法保留了原始分布資訊,使常見類別擁有較大的取樣機率,同時不會像標籤編碼那樣引入不存在的順序關係。相較於獨熱編碼,均勻編碼也不會造成維度爆炸的問題,大幅提升了處理效率。這種編碼方式特別適用於類別數量較少的特徵以及不平衡的類別分布情境,可與其他前處理方法靈活組合使用,在合成模型應用中展現出色的效能。
判斷是否適合使用均勻編碼
當資料符合以下特徵時,應考慮使用均勻編碼。若資料存在類別變數,包含名義或順序尺度的類別欄位,需要將離散值轉換為連續值以供合成器學習,均勻編碼是理想的選擇。當類別數量適中,每個類別平均樣本數 ≥ 10(即總樣本數 / 類別數 ≥ 10)時,能確保編碼的穩定性,例如 10,000 筆資料中有 100 個類別、或 100,000 筆資料中有 1,000 個類別都屬適中範圍。若類別間的分布不均勻,出現頻率存在明顯差異,均勻編碼能透過區間大小保留原始分布資訊。
在使用深度學習合成器(如 CTGAN、TVAE)時,均勻編碼相較於獨熱編碼更高效,能避免維度爆炸問題。當資料包含多個類別變數,若使用獨熱編碼會導致特徵數量急遽增加,大幅提升計算成本與記憶體需求時,均勻編碼是更好的選擇。
某些情況下可能需要考慮其他編碼方法,或是移除欄位、事先合併類別等方式。若遇到高基數類別,每個類別平均樣本數 < 10(如個人 ID、詳細地址),過少的樣本使每個區間難以學習穩定的模式。此時建議搭配約束條件、使用特徵哈希,或考慮是否需要拆分合成。
實際應用範例
以下範例展示如何在大學學生資料中使用均勻編碼處理多個類別變數:
Preprocessor:
encoding_uniform:
sequence:
- 'encoder' # 以正面宣告來關閉其他預設前處理
encoder:
zodiac: 'encoding_uniform' # 星座
department_name: 'encoding_uniform' # 系所名稱
admission_type: 'encoding_uniform' # 入學方式
disabled_type: 'encoding_uniform' # 身心障礙狀況
nationality: 'encoding_uniform' # 國籍
identity: 'encoding_uniform' # 身分別
sex: 'encoding_uniform' # 性別此設定針對學生資料中的七個類別變數應用均勻編碼。這些變數包括星座(zodiac)、系所名稱(department_name)、入學方式(admission_type)、身心障礙狀況(disabled_type)、國籍(nationality)、身分別(identity)和性別(sex)。透過在 sequence 中僅宣告 encoder,可以關閉其他預設的前處理步驟,確保只進行編碼處理。這種設定特別適合當這些類別變數的類別數量適中、且分布可能不均勻的情況。
注意事項與常見問題
均勻編碼和標籤編碼有什麼差異?
標籤編碼(Label Encoding)將類別簡單映射為整數序列(0, 1, 2, …),主要問題是引入了不存在的順序關係,模型可能誤認為類別 2 比類別 1「大」,且類別間的「距離」沒有實際意義。
均勻編碼將類別映射到連續區間,避免隱含的順序關係,且區間大小反映類別頻率,保留統計分布資訊,更適合合成模型學習。
為什麼不使用獨熱編碼?
獨熱編碼(One-Hot Encoding)的優點是編碼後的結果完全可解釋、也不會引入順序關係,適合傳統機器學習模型。
但缺點是高基數時會造成維度爆炸(如 100 個類別產生 100 個新欄位),增加記憶體需求和計算成本,也可能導致稀疏性問題。無論高維資料或稀疏性資料都會降低表格式合成模型的表現。
如果類別中包含缺失值怎麼辦?
PETsARD 預設的前處理流程,會在遺失值處理時自動將類別欄位中遺失值的行刪除,故進到編碼時不會有遺失值。
但如果遺失值具有特定意義,使用者可以像範例一樣將遺失值關閉(不宣告 missing 即可),接著 PETsARD 有特殊處理,在均勻編碼前會先將缺失值視為一個獨立的類別。因此缺失值也會獲得自己的區間,也會在合成完後被後處理還原。
時間資料應該當作類別還是數值?
無論時間欄位是單一欄位或分離儲存,也無論其原始資料型別為何,本團隊都建議將時間資料正確的宣告為時間欄位,PETsARD 將會以連續欄位處理,以保留時間的連續性。
唯一例外是當您擁有明確的領域知識,確認分離的時間元件(如月份、星期)與資料趨勢的週期性存在已知關聯時,才適合將這些時間元件當作類別變數處理,才適合作為均勻編碼的對象。