搜尋意圖: 如果你在找「目標編碼 是什麼」或「目標編碼 和相近概念差在哪」,先看這頁的短定義、完整說明與延伸比較。
TL;DR: 將類別特徵替換為該類別對應的目標變數統計量(通常是條件平均值)的特徵工程技術。
實用情境: 適合用在閱讀 AI 文章、產品文件或和同事討論時,先用一頁快速對齊概念。
下一步: 先讀完定義,再往下看延伸比較與對應工具,把概念轉成實際應用。
將類別特徵替換為該類別對應的目標變數統計量(通常是條件平均值)的特徵工程技術。
目標編碼(Target Encoding),又稱均值編碼(Mean Encoding)或似然編碼(Likelihood Encoding),是特徵工程中處理類別變數的重要技術,尤其在處理高基數(high-cardinality)類別特徵時(如城市名稱、商品 ID、使用者 ID 等),相較於獨熱編碼(One-Hot Encoding)具有顯著優勢。
基本原理
對於一個類別特徵 X 和目標變數 y,目標編碼將類別 c 的編碼值定義為: 編碼(c) = P(y | X = c)
在實作上,通常以訓練集中類別 c 的樣本對應的目標變數均值來估計這個條件機率: 編碼(c) = mean(y_i for all i where X_i = c)
以二元分類(y = 0 或 1)為例,如果訓練集中「台北市」這個類別對應的樣本有 60% 的 y = 1,則「台北市」的目標編碼值為 0.6。
高基數問題與獨熱編碼的比較
獨熱編碼(One-Hot Encoding)將 k 個不同類別值展開為 k 個二元特徵欄,當 k 很大時(如城市數千個、商品 ID 百萬個)會產生極高維稀疏矩陣,不僅占用記憶體,也讓許多模型難以有效學習。目標編碼將每個類別壓縮為單一數值,完整保留了類別與目標的統計關係,維度不隨類別數量膨脹。
目標洩漏與過擬合風險
目標編碼最大的陷阱是「目標洩漏」(target leakage):若直接用全部訓練集的目標均值來編碼,等於把「每個樣本的 y 值」間接洩漏進了特徵中(樣本自己的 y 值也參與了自己類別的均值計算),導致模型在訓練集上表現極好,但在測試集大幅下滑。
防範措施:平滑化(Smoothing)與 K-Fold 編碼
平滑化(Smoothing/Regularization):將類別均值與全局均值做加權平均,類別樣本數越少,越依賴全局均值: 編碼(c) = (n_c × mean_c + α × global_mean) / (n_c + α) 其中 α 是平滑參數,n_c 是類別 c 的樣本數。樣本數少的類別(如罕見城市)會被拉向全局均值,降低過擬合。
K-Fold 目標編碼:類似交叉驗證的做法,將訓練集分為 K 折,對第 k 折的樣本用其餘 K-1 折計算類別均值,確保編碼時不使用該樣本自身的 y 值。這是 Kaggle 競賽中最常用的目標編碼策略。
Leave-One-Out 編碼(LOO):計算類別均值時排除當前樣本自身,是 K-Fold 的極限情況(K = 訓練集大小)。
適用場景
- 高基數類別特徵:城市、郵遞區號、商品類別、使用者分組等。
- 樹模型(XGBoost、LightGBM、CatBoost):目標編碼能直接提供有意義的數值信號,CatBoost 內建了目標編碼機制。
- 線性模型:需搭配平滑化,否則過擬合風險更高。
限制
- 測試集中若出現訓練集未見過的類別(unseen category),需要一個後備策略(通常用全局均值)。
- 對目標變數的分布敏感:若目標分布不均衡,均值未必是最好的統計量,有時用中位數或其他分位數更合適。
- 在 K-Fold 編碼中,超參數 K 的選擇會影響結果,需要透過驗證集評估。
實作注意事項與工具
Python 中,scikit-learn 的 TargetEncoder(0.24 版後加入)提供了帶平滑化的目標編碼實作,並支援在交叉驗證管線中正確應用。Category Encoders 套件提供了更多變種(LeaveOneOutEncoder、WOEEncoder 等)。使用時需注意:在 Pipeline 中,TargetEncoder 必須放在 fit/transform 管線中以確保只用訓練折的資訊;在特徵重要性分析時,目標編碼後的特徵重要性可能偏高,需搭配其他方法交叉驗證。
常見問題
目標編碼和獨熱編碼,什麼時候應該選哪個?
主要判斷標準是類別的基數(cardinality,不同值的數量)。基數低(< 10-20 個)的類別特徵,獨熱編碼簡單可靠,不引入洩漏風險;基數高(> 50 個,特別是 > 1000 個)時,獨熱編碼產生的稀疏矩陣會讓許多模型效率低落,目標編碼通常是更好的選擇。使用目標編碼時必須搭配 K-Fold 策略或平滑化,並在測試集評估時確保編碼只用訓練集的統計量,避免洩漏。
CatBoost 宣稱能自動處理類別特徵,它用的是目標編碼嗎?
是的,CatBoost 內部使用了一種有序目標編碼(ordered target encoding),其做法類似於 K-Fold 目標編碼,但更精細:在建立每棵樹時,對每個樣本計算類別均值時都只使用「在隨機排列中排在該樣本前面」的訓練樣本,確保沒有資訊洩漏。這讓 CatBoost 可以直接輸入類別特徵而不需要手動前處理,這也是 CatBoost 在處理含大量類別特徵的表格資料時常有良好表現的原因之一。
目標編碼在時間序列場景下有什麼特別需要注意的地方?
在時間序列場景中,目標洩漏的風險更需要謹慎處理。正確做法是使用「時間點感知」的目標編碼:計算某個時間點 t 的類別編碼值時,只能使用 t 之前的歷史資料,絕對不能使用 t 之後的資料。一般 K-Fold 目標編碼若不考慮時間順序,可能會讓「未來」的目標值洩漏進特徵中,在驗證集上表現虛高但實際部署後效能大幅下滑。建議在時間序列情境下使用時間序列交叉驗證(Time Series CV)搭配擴展窗口(expanding window)策略計算目標編碼。