散列降低了維度,而單熱編碼通過將多分類變量轉換爲許多二進制變量實質上打破了特徵空間。所以看起來他們有相反的效果。我的問題是:在對基數高的數據進行預處理時,首先散列第一個還是一個熱點編碼?
對相同的數據集做這兩個有什麼好處?我讀了一些關於捕獲交互但不詳細的內容 - 有人可以詳細說明這一點嗎?
哪一個先來,爲什麼?
散列降低了維度,而單熱編碼通過將多分類變量轉換爲許多二進制變量實質上打破了特徵空間。所以看起來他們有相反的效果。我的問題是:在對基數高的數據進行預處理時,首先散列第一個還是一個熱點編碼?
對相同的數據集做這兩個有什麼好處?我讀了一些關於捕獲交互但不詳細的內容 - 有人可以詳細說明這一點嗎?
哪一個先來,爲什麼?
需要二進制單熱編碼用於將分類數據提供給具有標準內核的線性模型和SVM。
例如,您可能有一個星期幾的功能。然後你爲每個人創建一個熱點編碼。
1000000 Sunday
0100000 Monday
0010000 Tuesday
...
0000001 Saturday
特徵散列主要用於允許參數向量的顯着存儲壓縮:將高維輸入向量散列爲較低維特徵空間。現在,所得到的分類器的參數向量可以存在於低維空間中,而不是存在於原始輸入空間中。這可以用作降低維度的一種方法,因此通常您希望以較高的存儲收益來降低性能。
wikipedia的例子是一個很好的例子。假設你有三個文件:
使用書包模型,您首先創建以下文檔到單詞模型。 (每一行都是一個文檔,矩陣中的每個條目都表示文檔中是否出現一個單詞)。
在這個過程中的問題是,這樣的字典佔用大量的存儲空間,並擴大規模作爲訓練集增長。
使用散列技巧的特徵向量化器不是維護字典,而是通過將散列函數h應用於考慮中的項目中的特徵(例如單詞)來構建預定義長度的向量,然後使用散列值直接作爲特徵索引並在這些索引處更新結果向量。
假設您生成3個以下散列的散列特徵。 (您將k
不同的散列函數應用於原始功能並計算散列值撞擊存儲桶的次數)。
bucket1 bucket2 bucket3
doc1: 3 2 0
doc2: 2 2 0
doc3: 1 0 2
現在,您已成功將9維的要素轉換爲3維。
功能哈希的一個更有趣的應用是做個性化。原始文件feature hashing包含一個很好的例子。
想象一下,您要設計一個垃圾郵件過濾器,但需要爲每個用戶定製。這樣做的天真方法是爲每個用戶訓練一個單獨的分類器,這對於訓練(訓練和更新個性化模型)或服務(將所有分類器保存在內存中)是不可行的。下面一個聰明的方式說明:
現在回答你的問題:
是。一個熱點編碼應該是第一位的,因爲它將一個分類特徵轉換爲二進制特徵,使其可以通過線性模型消耗。 只要有利於使用壓縮的特徵空間,就可以將它們應用於相同的數據集。請注意,如果您可以容忍原始特徵維度,則不需要功能哈希。例如,在常見的數字識別問題中,例如,MINST,圖像由28×28個二進制像素表示。輸入維度只有784.對於這種情況來說,確保功能散列不會有任何好處。