機器學習--分類變數編碼方法
前言
最近在Medium上看到一篇關於分類變數編碼的方法概述,記錄一下,主要講述了除了One-Hot encoding 編碼外,根據不同應用場景,也許會有更好的選擇。
one-hot 編碼(one-hot encoding)類似於虛擬變數(dummy variables),是一種將分類變數轉換為幾個二進位制列的方法。其中 1 代表某個輸入屬於該類別。
從機器學習的角度來看,one-hot 編碼並不是一種良好的分類變數編碼方法。
因為one-hot 編碼增加了大量的維度,要列舉該特徵下的所有取值情況。例如,如果用一個序列來表示美國的各個州,那麼 one-hot 編碼會帶來 50 多個維度。
one-hot 編碼不僅會為資料集增加大量維度,而且實際上並沒有太多資訊,很多時候 1 散落在眾多零之中,即有用的資訊零散地分佈在大量資料中。這會導致結果異常稀疏,使其難以進行優化,對於神經網路來說尤其如此。
更糟糕的情況是,每個資訊稀疏列之間都具有線性關係。這意味著一個變數可以很容易地使用其他變數進行預測,導致高維度中出現並行性和多重共線性的問題。
例如下面這種情況:
最優資料集由資訊具有獨立價值的特徵組成,但 one-hot 編碼建立了一個完全不同的環境。
當然,如果只有三、四個類,那麼 one-hot 編碼可能不是一個糟糕的選擇。但是隨著類別的增加,可能還有其他更合適的方案值得探索。Medium 專欄的作者列舉了幾個方案以供參考。
目標編碼
目標編碼(Target encoding)是表示分類列的一種非常有效的方法,並且僅佔用一個特徵空間,也稱為均值編碼。該列中的每個值都被該類別的平均目標值替代。這可以更直接地表示分類變數和目標變數之間的關係,並且也是一種很受歡迎的技術方法(尤其是在 Kaggle 比賽中)。
但這種編碼方法也有一些缺點。首先,它使模型更難學習均值編碼變數和另一個變數之間的關係,僅基於列與目標的關係就在列中繪製相似性。
而最主要的是,這種編碼方法對 y 變數非常敏感,這會影響模型提取編碼資訊的能力。
由於該類別的每個值都被相同的數值替換,因此模型可能會過擬合其見過的編碼值(例如將 0.8 與完全不同的值相關聯,而不是 0.79),這是把連續尺度上的值視為嚴重重複的類的結果。
因此,需要仔細監控 y 變數,以防出現異常值。要實現這個目的,就要使用 category_encoders 庫。由於目標編碼器是一種有監督方法,所以它同時需要 X 和 y 訓練集。
from category_encoders import TargetEncoder
enc = TargetEncoder(cols=['Name_of_col','Another_name'])
training_set = enc.fit_transform(X_train, y_train)
留一法編碼
留一法(Leave-one-out)編碼試圖通過計算平均值(不包括當前行值)來彌補對 y 變數的依賴以及值的多樣性。這使異常值的影響趨於平穩,並建立更多樣化的編碼值。
由於模型不僅要面對每個編碼類的相同值,還要面對一個範圍值,因此它可以更好地泛化。
在實現方面,可以使用 category_encoders 庫中的 LeaveOneOutEncoder
from category_encoders import LeaveOneOutEncoder
enc = LeaveOneOutEncoder(cols=['Name_of_col','Another_name'])
training_set = enc.fit_transform(X_train, y_train)
實現類似效果的另一種策略是將正態分佈的噪聲新增到編碼分數中,其中標準差是可以調整的引數。
貝葉斯目標編碼
貝葉斯目標編碼(Bayesian Target Encoding)是一種使用目標作為編碼方法的數學方法。僅使用均值可能是一種欺騙性度量標準,因此貝葉斯目標編碼試圖結合目標變數分佈的其他統計度量。例如其方差或偏度(稱為高階矩「higher moments」)。
然後通過貝葉斯模型合併這些分佈的屬性,從而產生一種編碼,該編碼更清楚類別目標分佈的各個方面,但是結果的可解釋性比較差
證據權重
證據權重(Weight of Evidence,簡稱 WoE)是另一種關於分類自變數和因變數之間關係的方案。WoE 源自信用評分領域,曾用於區分使用者是違約拖欠還是已經償還貸款。證據權重的數學定義是優勢比的自然對數,即:
ln (% of non events / % of events)
WoE 越高,事件發生的可能性就越大。「Non-events」是不屬於某個類的百分比。使用證據權重與因變數建立單調關係,並在邏輯尺度上確保類別,這對於邏輯迴歸來說很自然。WoE 是另一個衡量指標「Information Value」的關鍵組成部分。該指標用來衡量特徵如何為預測提供資訊。
from category_encoders import WOEEncoder
enc = WOEEncoder(cols=['Name_of_col','Another_name'])
training_set = enc.fit_transform(X_train, y_train)
這些方法都是有監督編碼器,或者是考慮目標變數的編碼方法,因此在預測任務中通常是更有效的編碼器。但是,當需要執行無監督分析時,這些方法並不一定適用。
非線性 PCA
非線性 PCA(Nonlinear PCA)是一種使用分類量化來處理分類變數的主成分分析(PCA)方法。它會找到對類別來說的最佳數值,從而使常規 PCA 的效能(可解釋方差)最大化。
相關文章
- 機器學習系列文章:引數方法(最大似然、分類)機器學習
- 【機器學習】支援向量機分類機器學習
- 人工智慧 (02) 機器學習 - 監督式學習分類方法人工智慧機器學習
- 【機器學習】--xgboost初始之程式碼實現分類機器學習
- 利用機器學習進行惡意程式碼分類機器學習
- 機器學習--有監督學習--分類演算法(預測分類)機器學習演算法
- 機器學習總結(2)—分類中的代數模型機器學習模型
- 機器學習常用的分類器比較機器學習
- VAE變分自編碼器
- 例項複習機器學習數學 - 2. 幾種典型離散隨機變數分佈機器學習隨機變數
- 從零開始學機器學習——初探分類器機器學習
- 如何用機器學習對文字分類機器學習文字分類
- 變分自編碼器VAE(上)
- 從零開始學機器學習——分類器詳解機器學習
- 【學習記錄】IDEA編輯器 - 類、方法模板配置Idea
- 機器學習3-分類演算法機器學習演算法
- 機器學習十講-第三講分類機器學習
- 【火爐煉AI】機器學習002-標記編碼方法AI機器學習
- 變分貝葉斯自編碼器
- Shell變數有哪些分類?linux運維實戰學習變數Linux運維
- 機器學習之樸素貝葉斯分類機器學習
- 機器學習4-分類演算法2機器學習演算法
- 變分自編碼器VAE:一步到位的聚類方案聚類
- 機器學習讀書筆記:貝葉斯分類器機器學習筆記
- 機器學習框架ML.NET學習筆記【4】多元分類之手寫數字識別機器學習框架筆記
- 《Python機器學習》作者科普長文:從頭構建類GPT文字分類器,程式碼開源Python機器學習GPT文字分類
- 快速瞭解 變分自編碼器 VAE
- 機器學習入門(六)——評價分類結果機器學習
- 文字分類:Keras+RNN vs傳統機器學習文字分類KerasRNN機器學習
- 【火爐煉AI】機器學習039-NLP文字分類器AI機器學習文字分類
- 機器學習(三):理解邏輯迴歸及二分類、多分類程式碼實踐機器學習邏輯迴歸
- 機器學習中的聚類演算法演變及學習筆記機器學習聚類演算法筆記
- 機器學習數學知識積累之高等數學微積分機器學習
- 機器學習系列之分類機器學習
- 機器學習框架ML.NET學習筆記【6】TensorFlow圖片分類機器學習框架筆記
- 漫談概率 PCA 和變分自編碼器PCA
- 《機器學習Python實現_10_02_整合學習_boosting_adaboost分類器實現》機器學習Python
- 從零開始學機器學習——瞭解分類演算法機器學習演算法