類別資料:詞彙和 one-hot 編碼

「維度」一詞是「特徵向量」中的元素數量的同義詞。部分類別特徵的維度較低。例如:

功能名稱 類別數量 範例類別
snowed_today 2 True、False
skill_level 3 初學者、從業人員、專家
season 4 冬季、春季、夏季、秋季
day_of_week 7 週一、週二、週三
行星 8 水星、金星、地球

如果類別特徵的可能類別數量偏低,您可以將其編碼為字彙表。使用詞彙編碼時,模型會將每個可能的類別值視為個別特徵。在訓練期間,模型會學習各個類別的不同權重。

舉例來說,假設您要建立模型,以便根據部分名為 car_color 的分類特徵預測汽車價格。紅色汽車的價值可能高於綠色汽車。由於製造商提供的外觀顏色有限,car_color 是低維類別特徵。以下插圖為 car_color 的字彙 (可能值) 建議:

圖 1. 色版中的每個顏色都會以個別功能表示。也就是說,每個顏色都是特徵向量中的個別特徵。舉例來說,'Red' 是功能,'Orange' 是另一個功能,以此類推。
圖 1:每個類別的專屬功能。

練習:檢查您的理解程度

是或否:機器學習模型可以直接訓練原始字串值,例如「紅色」和「黑色」,而無須將這些值轉換為數值向量。

索引編號

機器學習模型只能操作浮點數。因此,您必須將每個字串轉換為不重複的索引編號,如以下插圖所示:

圖 2:每種顏色都會與一個不重複的整數值相關聯。例如,'Red' 與整數 0 相關聯,'Orange' 與整數 1 相關聯,以此類推。
圖 2 已編入索引的特徵。

將字串轉換為不重複的索引號碼後,您需要進一步處理資料,以便模型瞭解值之間的相關性。如果類別型特徵資料保留為索引整數,並載入模型,模型會將索引值視為連續浮點數。此時模型會認為「紫色」比「橘色」更有可能出現,比率是前者的六倍。

one-hot 編碼

建立詞彙表的下一個步驟,是將每個索引編號轉換為one-hot 編碼。在 one-hot 編碼中:

  • 每個類別都由 N 個元素的向量 (陣列) 代表,其中 N 是類別數量。舉例來說,如果 car_color 有八個可能類別,則代表性的單熱向量就會有八個元素。
  • one-hot 向量中只有 一個元素的值為 1.0;所有其他元素的值為 0.0。

例如,下表顯示 car_color 中每個項目的一對多編碼:

功能 紅色 Orange 藍色 黃色 綠色 Black 紫色 棕色
"Red" 1 0 0 0 0 0 0 0
「Orange」 0 1 0 0 0 0 0 0
"Blue" 0 0 1 0 0 0 0 0
"黃色" 0 0 0 1 0 0 0 0
"綠色" 0 0 0 0 1 0 0 0
"Black" 0 0 0 0 0 1 0 0
"紫色" 0 0 0 0 0 0 1 0
"Brown" 0 0 0 0 0 0 0 1

系統會將獨熱向量傳遞至特徵向量,而非字串或索引編號。模型會為特徵向量的每個元素學習個別權重。

下圖顯示詞彙表表示法中的各種轉換:

圖 3. 將類別對應至特徵向量的端對端程序圖表。在圖表中,輸入特徵為「黃色」、「橘色」、「藍色」和第二次出現的「藍色」。系統會使用已儲存的字彙表 (「紅色」為 0、「橘色」為 1、「藍色」為 2、「黃色」為 3 等等),將輸入值對應至 ID。因此,系統會將「黃色」、「橘色」、「藍色」和「藍色」對應至 3、1、2、2。系統會將這些值轉換為 one-hot 特徵向量。舉例來說,如果系統有八種可能的顏色,3 就會變成 0, 0, 0, 1, 0, 0, 0, 0。
圖 3. 將類別對應至特徵向量的端對端程序。

稀疏表示法

值主要為零 (或空白) 的特徵稱為稀疏特徵。許多類別特徵 (例如 car_color) 通常是稀疏特徵。稀疏表示法是指在稀疏向量中儲存 1.0 的位置。例如,"Blue" 的 one-hot 向量如下:

[0, 0, 1, 0, 0, 0, 0, 0]

由於 1 位於第 2 個位置 (從 0 開始計算),因此前一個 one-hot 向量的稀疏表示法為:

2

請注意,稀疏表示法比八元素單熱向量耗用得少得多。重要的是,模型必須訓練單熱向量,而非稀疏表示法。

類別型資料中的離群值

和數值資料一樣,類別資料也會包含離群值。假設 car_color 不僅包含熱門顏色,也包含一些鮮少使用的異常顏色,例如 "Mauve""Avocado"。您可以將這些異常顏色歸入單一「統一」類別,稱為字彙表外 (OOV)。換句話說,所有異常顏色都會歸入單一異常值分組。系統會為該異常值值區學習單一權重。

為高維類別特徵編碼

某些類別特徵的維度數量相當多,例如下表中的維度:

功能名稱 類別數量 範例類別
words_in_english ~500,000 「happy」、「walking」
US_postal_codes ~42,000 「02114」和「90301」
last_names_in_Germany ~850,000 「Schmidt」、「Schneider」

如果類別數量很多,通常不建議使用 one-hot 編碼。嵌入 (請參閱專屬的嵌入模組) 通常是更好的選擇。嵌入可大幅減少維度數量,為模型帶來兩項重要優勢:

  • 模型通常會訓練得更快。
  • 建構的模型通常會更快地推斷預測結果。也就是說,模型的延遲時間較短。

Hashing (也稱為 Hashing 技巧) 是較不常見的縮減維度數量方法。

簡而言之,雜湊會將類別 (例如顏色) 對應至小整數,也就是用來儲存該類別的「桶」數量。

具體來說,您可以實作雜湊演算法,如下所示:

  1. 將類別向量中的區塊數設為 N,其中 N 小於剩餘類別的總數。舉例來說,假設 N = 100。
  2. 選擇雜湊函式。(通常您也會選擇雜湊值的範圍)。
  3. 將每個類別 (例如特定顏色) 傳遞至該雜湊函式,產生雜湊值,例如 89237。
  4. 為每個區塊指派輸出雜湊值除以 N 的索引編號。在本例中,N 為 100,雜湊值為 89237,模數結果為 37,因為 89237 % 100 為 37。
  5. 使用這些新索引編號,為每個區塊建立單熱編碼。

如要進一步瞭解雜湊資料,請參閱「實際機器學習系統」模組的「隨機化」一節。