類別資料:詞彙和 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:每個類別的獨特功能。

練習:檢查你的直覺

是非題:機器學習模型可以直接根據原始字串值 (例如 "Red""Black") 進行訓練,不需要將這些值轉換成數值向量。
在訓練期間,模型只能操作浮點數。字串 "Red" 不是浮點數。您必須將 "Red" 等字串轉換為浮點數。
機器學習模型只能針對含有浮點值的特徵進行訓練,因此您必須先將這些字串轉換為浮點值,才能進行訓練。

索引編號

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

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

練習:檢查你的直覺

您的模型是否應直接以圖 2 所示的索引號碼進行訓練?
如果模型以索引號訓練,就會錯誤地將每個索引號視為數值,並認為 "Black" (索引號 5) 對模型的意義是 "Orange" (索引號 1) 的 5 倍。
模型不應以索引號碼訓練。如果是這樣,模型會將每個索引編號視為數值,並認為 "Black" (索引編號 5) 對模型的意義是 "Orange" (索引編號 1) 的 5 倍。

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
「棕色」 0 0 0 0 0 0 0 1

這是傳遞給特徵向量的 one-hot 向量,不是字串或索引號碼。模型會為特徵向量的每個元素學習個別權重。

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

圖 3. 將類別對應至特徵向量的端對端程序圖表。在此圖表中,輸入特徵再次為「黃色」、「橘色」、「藍色」和「藍色」。系統會使用已儲存的字彙表 (「紅色」為 0、「橘色」為 1、「藍色」為 2、「黃色」為 3 等等),將輸入值對應至 ID。因此,系統會將「黃色」、「橘色」、「藍色」和「藍色」對應至 3、1、2、2。系統會將這些值轉換為 one-hot 特徵向量。舉例來說,如果系統有 8 種可能顏色,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」、「步行」
US_postal_codes ~42,000 「02114」、「90301」
last_names_in_Germany ~850,000 「Schmidt」、「Schneider」

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

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

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