表示法:特徵工程

在傳統程式設計中,著重於程式碼。在機器學習專案中,焦點會轉移至表示法。也就是說,開發人員調整模型的其中一種方式 就是新增及改善特徵

將原始資料對應至地圖項目

圖 1 的左側說明來自輸入資料來源的原始資料,右側則說明「特徵向量」,這是構成資料集範例的一組浮點值。特徵工程是指將原始資料轉換為特徵向量。請預期要花大量時間進行特徵工程。

許多機器學習模型必須將特徵以實數向量表示,因為特徵值必須乘以模型權重。

原始資料會透過稱為特徵工程的程序對應至特徵向量。

圖 1. 特徵工程會將原始資料對應至機器學習功能。

對應數值

整數和浮點資料不需要特殊編碼,因為這些資料可以乘以數值權重。如圖 2 所示,將原始整數值 6 轉換為特徵值 6.0 相當複雜:

直接從原始資料複製的功能示例

圖 2. 將整數值對應至浮點值。

對應類別值

類別特徵具有一組獨立的可能值。舉例來說,可能會有一個名為 street_name 的功能,其中的選項包括:

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

由於模型無法將字串乘以已知的權重,因此我們透過特徵工程將字串轉換為數值。

為了達成這個目的,我們為特徵值定義對應 (我們將特徵值稱為可能值的「詞彙」) 為整數。由於世界上並非所有街道都會出現在我們的資料集中,因此我們可以將所有其他街道歸入通用的「其他」類別,稱為 OOV (非-詞彙) 值區

使用這種方法時,我們應該如何將街道名稱對應至數字:

  • 地圖 Charleston Road to 0
  • 繪製北海岸大道到 1 號地圖
  • 繪製 Shorebird Way 的 2
  • 將 Rengstorff Avenue 繪製至 3 個路程
  • 將其他 (OOV) 對應至 4

不過,如果將這些索引數字直接納入模型,就會產生一些可能有問題的限制:

  • 我們學習的是一種適用於所有街道的權重。舉例來說,如果 street_name 的權重是 6,我們會將 Charleston Road 的權重乘以 0,然後乘以 1 代表北海岸大道 (North Shoreline Boulevard),2 是 Shorebird Way,則以 2 表示。假設有一個模型使用 street_name 做為特徵來預測房價。依街道名稱而定,價格不太可能會呈現線性調整,更進一步地假設您已根據這些街道的平均房價來訂下車子。我們的模型需要有彈性,才能學習每條街道的不同重量,以便使用其他功能估算價格。

  • 我們並未考量 street_name 可能有多個值的情況。舉例來說,許多房子都位於兩條街道的角落,但如果該資訊包含單一索引,就無法在 street_name 值中編碼。

如要同時移除這些限制,我們可以改為在模型中,為每個類別特徵建立二進位向量,表示值,如下所示:

  • 如果是適用於範例的值,請將對應的向量元素設為 1
  • 將所有其他元素設為 0

這個向量的長度等於詞彙中的元素數量。當單一值為 1 時,這個表示法稱為「one-hot 編碼」;多個值為 1 時則稱為「multi-hot 編碼」

圖 3 說明特定街道的單樣本編碼:Shorebird Way。Shorebird Way 的二進位向量元素的值為 1,而所有其他街道的元素值則為 0

對應字串值 (

圖 3. 透過 one-hot 編碼繪製街道地址。

這個方法可以有效為每個特徵值 (例如街道名稱) 建立布林值變數。在這裡,如果房子位於 Shorebird Way,則二進位值僅適用於 Shorebird Way。因此,模型只會使用 Shorebird Way 的權重。

同樣地,如果房子位於兩條街道的角落,則兩個二進位值會設為 1,且模型會同時使用兩者各自的權重。

稀疏表示法

假設您在資料集裡有 1,000,000 個不同的街道名稱,您想要加入做為 street_name 的值。明確建立 1,000,000 個元素的二進位向量,其中只有 1 或 2 個元素為 true,在處理這些向量時,在儲存和計算時間方面都是非常有效率的呈現。在這種情況下,常見的做法是使用僅儲存非零值的 稀疏表示法。在稀疏表示法中,系統仍會針對每個特徵值學習獨立的模型權重,如上所述。