傳統程式設計的關注點是程式碼. 在機器學習專案中, 關注點變成了特徵表示.也就是說, 開發者透過新增和改善特徵來調整模型.
將原始資料對映到特徵
圖 1 左側表示來自輸入資料來源的原始資料, 右側表示特徵向量, 也就是組成資料集中樣本的浮點值集.特徵工程指的是將原始資料轉換為特徵向量.進行特徵工程預計需要大量時間.
許多機器學習模型都必須將特徵表示為實數向量, 因為特徵值必須與模型權重相乘.
圖 1. 特徵工程將原始資料對映到機器學習特徵
對映數值
整數和浮點數不需要特殊編碼, 因為它們可以與數字權重相乘.如圖 2 所示, 將原始整數值 6 轉化為特徵值 6.0 並沒有多大的意義:
圖 2. 將整數值對映到浮點值
對映分類值
分類特徵具有一組離散的可能值.例如, 可能有一個名為 street_name 的特徵, 其中的選項包括:
{ 'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue' }
由於模型不能將字串與學到的權重相乘, 因此我們使用特徵工程將字串轉換為數字值.
要實現這一點, 我們可以定義一個從特徵值 ( 我們將其稱為可能值的詞彙表 ) 到整數的對映.世界上的每條街道並非都會出現在我們的資料集中, 因此我們可以將所有其他街道分組為一個全部包羅的 “其他”類別, 稱為 OOV ( 詞彙表外 ) 分桶
透過這種方法, 我們可以按照以下方式將街道名對映到數字:
- 將 Charleston Road 對映到 0
- 將 North Shoreline Boulevard 對映到 1
- 將 Shorebird Way 對映到 2
- 將 Rengstorff Avenue 對映到 3
- 將所有其他街道 ( OOV ) 對映到 4
不過, 如果我們將這些索引數字直接納入到模型中, 將會造成一些可能存在問題的限制: - 我們將學習適用於所有街道的單一權重.例如, 如果我們學習到 street_name 的權重為 6 , 那麼對於 Charleston Road , 我們會將其乘以 0 , 對於 North Shoreline Boulevard 則乘以 1 , 對於 Shorebird Way 則乘以 2 , 依次類推.以某個使用 street_name 作為特徵來預測房價的模型為例.根據街道名稱對房價進行線性調整的可能性不大, 此外, 這會假設您已根據平均房價對街道進行排序.我們的模型需要靈活地為每條街道學習不同的權重, 這些權重將新增到利用其他特徵估算的房價中.
- 我們沒有將 Street_name 可能有多個值的情況考慮在內.例如, 許多房屋位於兩條接到的拐角處, 因此如果模型包括單個索引, 則無法在 street_name 值中對該資訊進行編碼.
要去除這兩個限制, 我們可以為模型中的每個分類特徵建立一個二元向量來表示這些值, 如下所述: - 對於適用於樣本的值, 將相應的向量元素設為 1
- 將所有其他元素設為 0
該向量的長度等於詞彙表中的元素數. 當只有一個值為 1 時, 這種表示法稱為獨熱編碼; 當有多個值為 1 時, 這種表示方法稱為多熱編碼
圖 3 所示為街道 Shorebird Way 的獨熱編碼.在此二元向量中, 代表 Shorebird Way 的元素的值為 0圖 3. 透過獨熱編碼對映街道地址
該方法能夠有效地為每個特徵值 ( 例如, 街道名稱 ) 建立布林變數.採用這種方法時, 如果房屋位於 Shorebird Way 街道上, 則只有 Shorebird Way 的二元值為 1.因此, 該模型僅使用 Shorebird Way 的權重.
同樣, 如果房屋位於兩條街道的拐角處, 則將兩個二元值設為 1 ,並且模型將使用他們各自的權重.
注:獨熱編碼會擴充套件到您不希望直接與權重相乘的數字資料, 例如郵政編碼.稀疏表示法
假設資料集中有 100 萬個不同的街道名稱, 您希望將其包含為 street_name 的值.如果直接建立一個包含 100 萬個元素的二元向量, 其中只有 1 或 2 個元素為 true , 則是一種非常低效的表示法, 在處理向量時會佔用大量的儲存空間並耗費很長的計算時間.在這種情況下, 一種常用的方法是使用稀疏表示法, 其中僅儲存非零值. 在稀疏表示法中, 仍然為每個特徵值學習獨立的模型權重, 如上所述.
本作品採用《CC 協議》,轉載必須註明作者和本文連結