首頁>技術>

入門,所有值得了解的編碼-從OrdinalEncoder到CatBoostEncoder-在Python中從頭開始進行解釋和編碼

> [Image by Author]

"您知道哪個梯度提升?"

" Xgboost,LightGBM,Catboost,HistGradient。"

"您知道哪種分類編碼?"

"One Hot"

在資料科學採訪中聽到這樣的對話我不會感到驚訝。儘管如此,這還是很驚人的,因為只有一小部分資料科學專案涉及機器學習,而實際上所有這些專案都涉及一些分類資料。

分類編碼是將分類列轉換為一個(或多個)數字列的過程。

這是必要的,因為計算機更容易處理數字而不是字串。這是為什麼?因為使用數字很容易找到關聯(例如"更大","更小","兩倍","一半")。而給定字串時,計算機只能說"相等"還是"不同"。

但是,儘管有分類編碼,但資料科學從業人員很容易忽略分類編碼。

分類編碼是一個令人驚訝地被低估的話題。

這就是為什麼我決定加深對編碼演算法的瞭解。我從一個名為" category_encoders"的Python庫開始(這是Github連結)。使用它很容易:

!pip install category_encodersimport category_encoders as cece.OrdinalEncoder().fit_transform(x)

這篇文章是庫中包含的17種編碼演算法的演練。對於每種演算法,我用幾行程式碼提供了簡短的解釋和Python實現。這樣做的目的不是要重新發明輪子,而是要了解演算法是如何在後臺執行的。畢竟,

"您不瞭解它,直到您可以對其進行編碼"。

並非所有編碼均相等

我已經根據其一些特徵對17種編碼演算法進行了分類。由於資料科學家喜歡決策樹,因此讓他們感到高興:

> [Image by Author]

以下是拆分所指的內容:

· 有監督/無監督:當編碼僅基於分類列時,則為無監督。否則,如果編碼基於原始列和第二個(數字)列的某些功能,那麼它將受到監督。

· 輸出維:分類列的編碼可能會產生一個數字列(輸出維= 1)或許多數字列(輸出維> 1)。

· 對映:如果每個級別始終具有相同的輸出(無論是標量(例如OrdinalEncoder)還是陣列(例如OneHotEncoder)),則對映是唯一的。相反,如果"允許"同一級別具有不同的可能輸出,則對映不是唯一的。

10分鐘內17種分類編碼演算法1. OrdinalEncoder

每個級別都對映到一個從1到L的整數(其中L是級別數)。在這種情況下,我們使用字母順序,但是任何其他自定義順序也是可以接受的。

> [Image by Author]

您可能會認為序數編碼是無意義的,尤其是在級別沒有固有順序的情況下。你是對的!實際上,它只是方便的一種表示形式,通常用於節省記憶體或用作其他型別編碼的中間步驟。

2. CountEncoder

每個級別都對映到承載該級別的觀測數量。

> [Image by Author]

該編碼可以用作指示每個級別的"可信度"的指標。例如,機器學習演算法可以自動決定僅考慮其級別高於某個閾值的級別所帶來的資訊。

3. OneHotEncoder

卓越(最常用)的編碼演算法。每個級別都對映到一個虛擬列(即0/1列),指示該級別是否由該行承載。

> [Image by Author]

這意味著,儘管您的輸入是單個列,但是您的輸出卻包含L列(原始列的每一級一個)。這就是為什麼要謹慎處理一鍵編碼的原因:您最終可能會得到一個比原始資料幀大得多的資料幀。

一次性對資料進行熱編碼後,便可以使用任何預測演算法。為了讓您一眼就能理解,我們對每個級別進行一次觀察。假設我們已經觀察到一個目標變數y,其中包含每個人的收入(以千美元計)。讓我們在資料上擬合線性迴歸(OLS)。

為了使結果易於閱讀,我將OLS係數附加在桌子的側面。

> [Image by Author]

在單熱編碼的情況下,截距沒有特殊含義,並且將係數新增到截距中以獲得估計。在這種情況下,由於每個級別只有一個觀測值,因此透過將截距和係數相加,我們可以獲得y的精確值(沒有錯誤)。

4. SumEncoder

最初的程式碼看起來有些晦澀。但請放心:在這種情況下,瞭解編碼的獲取方式不是那麼重要,而是如何使用它。

> [Image by Author]

SumEncoder(作為接下來的3個編碼器)屬於一個稱為"對比度編碼"的類。這些編碼設計用於迴歸問題時具有特定的行為。換句話說,如果希望迴歸係數具有某些特定屬性,則可以使用這些編碼之一。

特別是,當您希望迴歸係數具有零和時,將使用SumEncoder。如果我們採用與上段相同的資料並適合OLS,則可以得到以下結果:

> [Image by Author]

這次,截距對應於y的平均值。此外,透過取最後一級的y並將其從截距(68-50)中減去,我們得到18,這與其餘係數的總和(-15-5 + 2 = -18)正好相反。這正是我上面提到的求和編碼的屬性。

5. BackwardDifferenceEncoder

另一種對比編碼(如SumEncoder)。

該編碼器對於序數變數(即,其級別可以以有意義的方式進行排序的變數)很有用。BackwardDifferenceEncoder旨在比較相鄰級別。

> [Image by Author]

假設您有一個普通變數(例如學歷),並且想知道它與數字變數(例如收入)之間的關係。比較目標變數的每兩個連續級別(例如,學士與高中,碩士與學士)可能很有趣。這就是BackwardDifferenceEncoder設計的目的。讓我們來看一個示例,上面的段落中的資料相同。

> [Image by Author]

截距與y的平均值重合。單身漢的係數為10,因為單身漢的y比高中的高10,而碩士的係數等於7,因為單身漢的y比高中的高7,依此類推。

6. HelmertEncoder

HelmertEncoder與BackwardDifferenceEncoder非常相似,但是不僅將其與上一個進行比較,還將每個級別與所有先前的級別進行比較。

> [Image by Author]

讓我們看看從OLS模型可以得到什麼:

> [Image by Author]

PhD的係數為24,因為PhD比先前水平68-((35 + 45 + 52)/ 3)= 24的平均值高24。相同的推理適用於所有級別。

7.多項式編碼器

另一種對比編碼。

顧名思義,PolynomialEncoder旨在量化目標變數相對於分類變數的線性,二次和三次行為。

> [Image by Author]

我知道你在想什麼數字變數如何與非數字變數具有線性(或二次或三次)關係?這是基於以下假設:基礎分類變數具有不僅可觀的而且均等間隔的級別。

因此,建議您僅在確信假設合理的情況下謹慎使用它。

8. BinaryEncoder

BinaryEncoder與OrdinalEncoder基本相同,唯一的區別是將整數轉換為二進位制數,然後每個位置數字都進行一次熱編碼。

> [Image by Author]

輸出由偽列組成(就像OneHotEncoder一樣),但是它導致單熱點的尺寸減少。

9. BaseNEncoder

BaseNEncoder只是BinaryEncoder的概括。實際上,在BinaryEncoder中,數字以2為底,而在BaseNEncoder中,數字以n為底,n大於1。

讓我們看一個以base = 3為例的例子。

> [Image by Author]

10. HashingEncoder

在HashingEncoder中,使用某種雜湊演算法(例如SHA-256)對每個原始級別進行雜湊處理。然後,將結果轉換為整數,並採用該整數相對於某個(大)除數的模組。這樣,我們將每個原始字串對映到1到divisor-1之間的整數。最後,透過此過程獲得的整數是一熱編碼的。

我們來看一個output_dimension = 10的示例。

> [Image by Author]

雜湊的基本屬性是所得整數均勻分佈。因此,如果將除數足夠大,則不可能將兩個不同的字串對映到相同的整數。為什麼這樣有用?實際上,這有一個非常實用的應用程式,稱為"雜湊技巧"。

想象一下,您想使用Logistic迴歸進行電子郵件垃圾郵件分類。您可以透過對資料集中的所有單詞進行一次熱編碼來做到這一點。主要缺點是您需要將對映儲存在單獨的字典中,並且模型尺寸會在出現新字串時隨時更改。

使用雜湊技巧可以輕鬆解決這些問題,因為透過對輸入進行雜湊處理,您不再需要字典,並且輸出尺寸是固定的(僅取決於您最初選擇的除數)。而且,對於雜湊的屬性,您可以肯定的是,新字串的編碼可能會與現有字串不同。

11. TargetEncoder

假設您有兩個變數:一個類別(x)和一個數字(y)。假設您要將x轉換為數字變數。您可能希望使用y"攜帶"的資訊。一個明顯的想法是對x的每個級別取y的平均值。在公式中:

這是合理的,但是這種方法存在一個大問題:某些小組可能太小或太不穩定而無法可靠。許多監督編碼透過選擇y的組均值和全域性均值之間的中間方法來克服此問題:

其中w_i在0到1之間,具體取決於組平均值的"可信度"。

接下來的三種演算法(TargetEncoder,MEstimateEncoder和JamesSteinEncoder)基於它們定義w_i的方式而有所不同。

在TargetEncoder中,權重取決於組的數字和稱為"平滑"的引數。當平滑為0時,我們僅依靠組均值。然後,隨著平滑度的增加,全域性平均權重越來越大,從而導致更強的正則化。

讓我們看看結果如何隨著一些不同的平滑值而變化。

> [Image by Author]

12. MEstimateEncoder

MEstimateEncoder與TargetEncoder相似,但w_i取決於一個稱為" m"的引數,該引數設定全域性平均值應按絕對值加權的大小。m很容易理解,因為它可以看作是多個觀察值:如果水平儀上有m個觀察儀,則水平儀的均值和總體平均權重相同。

讓我們看看不同m值的結果如何變化:

> [Image by Author]

13. JamesSteinEncoder

TargetEncoder和MEstimateEncoder既取決於組數字,也取決於使用者設定的引數值(分別是平滑和m)。這不方便,因為設定這些權重是一項手動任務。

下面是一個自然的問題:是否有一種方法可以在不需要任何人工干預的情況下設定最佳w_i?JamesSteinEncoder嘗試以統計為基礎的方式執行此操作。

我們來看一個數字示例:

> [Image by Author]

JamesSteinEncoder具有兩個顯著優點:與最大似然估計器相比,它提供了更好的估計,並且不需要任何引數設定。

14. GLMMEncoder

GLMMEncoder採用完全不同的方法。基本上,它適合y上的線性混合效應模型。這種方法利用了以下事實:線性混合效應模型是專為處理同類觀察組而設計的(在此也有詳細說明)。因此,該想法是使模型不具有迴歸變數(僅包含截距),並將級別用作組。

這樣,輸出就是截距和組的隨機效應之和。

> [Image by Author]

15. WOEEncoder

WOEEncoder(代表"證據權重"編碼器)只能用於二進位制目標變數,即級別為0/1的目標變數。

證據權重背後的想法是,您有兩種分佈:

· 1的分佈(每組1個的數量/所有y中1的數量)

· 0的分佈(每個組中的0個數/所有y中的0個數)

該演算法的核心是將1s的分佈除以0s的分佈(對於每個組)。當然,該值越高,我們越有信心該組"偏向" 1,反之亦然。然後,取該值的對數。

> [Image by Author]

如您所見,由於公式中存在對數,因此無法直接解釋輸出。但是,它可以很好地用作機器學習的預處理步驟。

16. LeaveOneOutEncoder

到目前為止,所有15個編碼器都具有唯一的對映。

但是,如果您打算將編碼用作預測模型的輸入(例如,梯度增強),則可能會出現問題。實際上,假設您使用TargetEncoder。這意味著您將在X_train中引入有關y_train的資訊,這可能會導致嚴重的過度擬合風險。

關鍵是:如何在限制過度擬合風險的同時保持監督編碼?LeaveOneOutEncoder提供了一個出色的解決方案。它執行原始目標編碼,但是對於每一行,它不考慮對該行觀察到的y值。這樣,避免了行洩漏。

> [Image by Author]

17. CatBoostEncoder

CatBoost是一種梯度增強演算法(例如XGBoost或LightGBM),在各種問題上都表現得非常出色。此處對編碼演算法進行了詳細說明(我們的實現略有簡化,但是對於掌握概念非常有用)。

CatboostEncoder的工作原理基本上與LeaveOneOutEncoder相似,但是遵循一種線上方法。

但是,如何在離線設定中模擬線上行為?假設您有一張桌子。然後,在桌子中間的某處劃一排。CatBoost的行為是假裝當前行上方的行先前已被及時觀察到,而下方行尚未被觀察到(即將來會被觀察到)。然後,該演算法僅根據已經觀察到的行進行留一法編碼。

> [Image by Author]

這似乎很荒謬。為什麼丟掉一些有用的資訊?您可以將其視為對輸出進行隨機化的更極端嘗試(即減少過度擬合)。

您可以在此Github筆記本中找到帖子(以及更多內容)中的所有程式碼。

我感謝反饋和建設性的批評。如果您想談論本文或其他相關主題,可以透過Linkedin聯絡人發簡訊給我。

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何團滅子集、排列、組合問題?