在傳統程式設計中,著重於程式碼。在機器學習專案中,焦點會轉移至表示法。也就是說,開發人員調整模型的其中一種方式 就是新增及改善特徵
將原始資料對應至地圖項目
圖 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,在處理這些向量時,在儲存和計算時間方面都是非常有效率的呈現。在這種情況下,常見的做法是使用僅儲存非零值的
稀疏表示法。在稀疏表示法中,系統仍會針對每個特徵值學習獨立的模型權重,如上所述。