編碼

將類別變數轉換為數值格式,以便機器學習演算法處理。

背景說明

多數合成演算法僅支援數值型欄位的合成,即使直接支援類別欄位合成,也通常涉及合成器本身內建的前處理與後處理還原轉換。而 CAPE 團隊正是希望控制這些第三方套件不可預期的行為而設計了 PETsARD。

PETsARD 建議對於任何包含類別變項的欄位,都應主動進行編碼處理

  • 類別變項:預設使用均勻編碼(Uniform Encoding)
  • 技術細節參見 Datacebo 官方文件中的均勻編碼

使用範例

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

Open In Colab

使用預設編碼

Preprocessor:
  demo:
    method: 'default'
    # 類別型欄位:使用均勻編碼
    # 數值型欄位:不編碼

自訂特定欄位的編碼

Preprocessor:
  custom:
    method: 'default'
    config:
      encoder:
        gender: 'encoder_onehot'       # One-Hot 編碼
        education: 'encoder_label'     # 標籤編碼
        country: 'encoder_uniform'     # 均勻編碼
        age: None                      # 數值欄位不編碼

日期編碼

Preprocessor:
  date_encoding:
    method: 'default'
    config:
      encoder:
        created_at: 'encoder_date'
        doc_date:
          method: 'encoder_date'
          input_format: '%MinguoY-%m-%d'  # 民國年格式
          date_type: 'date'

可用的處理器

處理器說明適用類型輸出
encoder_uniform均勻編碼類別型連續值
encoder_label標籤編碼類別型整數
encoder_onehotOne-Hot 編碼類別型多欄位(0/1)
encoder_date日期格式轉換日期時間型datetime

處理器詳細說明

encoder_uniform

均勻編碼:依照類別出現頻率分配數值範圍。

特性

  • 保留類別的頻率資訊
  • 輸出為連續值(0.0 到 1.0 之間)
  • 高頻類別獲得較大的數值範圍

範例

config:
  encoder:
    education: 'encoder_uniform'

編碼示例

原始資料:['high', 'low', 'medium', 'low', 'low']
頻率:low(60%), medium(20%), high(20%)

編碼結果:
- low → 0.0-0.6 的隨機值
- medium → 0.6-0.8 的隨機值
- high → 0.8-1.0 的隨機值

encoder_label

標籤編碼:將類別映射到連續整數。

特性

  • 簡單直接的映射
  • 輸出為整數(0, 1, 2, …)
  • 不保留類別間的順序關係

範例

config:
  encoder:
    gender: 'encoder_label'

編碼示例

原始資料:['Male', 'Female', 'Male', 'Other']

編碼結果:
- Male → 0
- Female → 1
- Other → 2

encoder_onehot

One-Hot 編碼:為每個類別創建獨立的二元欄位。

特性

  • 每個類別變成一個新欄位
  • 輸出為多個欄位(0 或 1)
  • 不假設類別間有順序關係

範例

config:
  encoder:
    color: 'encoder_onehot'

編碼示例

原始資料:['Red', 'Blue', 'Red', 'Green']

編碼結果(3個新欄位):
| color_Red | color_Blue | color_Green |
|-----------|------------|-------------|
|     1     |      0     |      0      |
|     0     |      1     |      0      |
|     1     |      0     |      0      |
|     0     |      0     |      1      |

encoder_date

日期格式轉換:解析並標準化日期時間資料。

參數

  • input_format (str, 選用):輸入日期格式

    • 預設:自動偵測
    • 支援民國年:%MinguoY
  • date_type (str, 選用):輸出類型

    • 'date':僅日期
    • 'datetime':日期和時間(預設)
    • 'datetime_tz':含時區
  • tz (str, 選用):時區

    • 範例:'Asia/Taipei'
  • numeric_convert (bool, 選用):是否轉換數值時間戳

    • 預設:False
  • invalid_handling (str, 選用):無效日期處理

    • 'error':拋出錯誤(預設)
    • 'erase':設為 NA
    • 'replace':使用替換規則

範例

config:
  encoder:
    # 基本使用
    created_at: 'encoder_date'
    
    # 民國年格式
    doc_date:
      method: 'encoder_date'
      input_format: '%MinguoY-%m-%d'
      date_type: 'date'
    
    # 含時區
    event_time:
      method: 'encoder_date'
      date_type: 'datetime_tz'
      tz: 'Asia/Taipei'
      invalid_handling: 'erase'

處理邏輯

類別編碼(Uniform/Label/OneHot)

訓練階段(fit):
  學習類別映射規則

轉換階段(transform):
  依映射規則將類別轉為數值

還原階段(inverse_transform):
  依映射規則將數值還原為類別

日期編碼(Date)

訓練階段(fit):
  無需訓練

轉換階段(transform):
  解析並轉換為標準日期格式

還原階段(inverse_transform):
  保持日期格式或轉為日期字串

預設行為

不同資料類型的預設編碼:

資料類型預設處理器說明
數值型不編碼
類別型encoder_uniform均勻編碼
日期時間型不編碼

編碼方法比較

方法優點缺點適用場景
Uniform保留頻率資訊
連續值利於合成
需要足夠樣本數預設選擇
合成資料
Label簡單高效
節省空間
暗示順序關係有序類別
離散化前處理
OneHot不假設順序
清晰表達
高基數時產生大量欄位低基數類別
獨立類別
Date標準化日期格式
支援多種輸入
需要正確格式設定日期時間資料

完整範例

Loader:
  load_data:
    filepath: 'data.csv'
    schema: 'schema.yaml'

Preprocessor:
  encode_data:
    method: 'default'
    sequence:
      - missing
      - outlier
      - encoder
      - scaler
    config:
      encoder:
        # 使用不同編碼方法
        gender: 'encoder_onehot'           # 二元類別:One-Hot
        education: 'encoder_label'         # 有序類別:Label
        occupation: 'encoder_uniform'      # 多類別:Uniform
        
        # 日期處理
        birth_date:
          method: 'encoder_date'
          input_format: '%MinguoY/%m/%d'
          date_type: 'date'
        
        # 數值欄位不編碼
        age: None
        income: None

注意事項

  • OneHot 欄位數量:會依類別數量產生多個新欄位
  • 高基數問題:類別數量過多時避免使用 OneHot
  • 編碼順序:建議在離群值處理之後、縮放之前執行
  • 民國年支援:使用 %MinguoY 格式標記
  • 時區處理:datetime_tz 類型會保留時區資訊
  • 還原精確度:Uniform 編碼還原時可能有輕微誤差
  • 與 discretizing 互斥:不能同時使用 encoder 和 discretizing

相關文件