特徵工程(四): 類別特徵

來源:https://mp.weixin.qq.com/s/Ub-bnil-DvMFNB4np3nOhQ

一個類別特徵,見名思義,就是用來表達一種類別或標籤。比如,一個類別特徵能夠表達世界上的主要城市,一年四季,或者說一個公司的產品(石油、路程、技術)。在真實世界的數據集中,類別值的數量總是無限的。同時這些值一般可以用數值來表示。但是,與其他數值變量不一樣的是,類別特徵的數值變量無法與其他數值變量進行比較大小。(作爲行業類型,石油與旅行無法進行比較)它們被稱之爲非序的。

 

一個簡單的問題可以作爲測試是否應該是一個分類變量的試金石測試:“兩個價值有多麼不同,或者只是它們不同?”500美元的股票價格比100美元的價格高5倍。 所以股票價格應該用一個連續的數字變量表示。 另一方面,公司的產業(石油,旅遊,技術等)應該無法被比較的,也就是類別特徵。

 

大的分類變量在交易記錄中特別常見。 對於實例中,許多Web服務使用id作爲分類變量來跟蹤用戶具有數百至數百萬的值,取決於唯一的數量服務的用戶。 互聯網交易的IP地址是另一個例子一個很大的分類變量。 它們是分類變量,因爲即使用戶ID和IP地址是數字,它們的大小通常與任務無關在眼前。 例如,在進行欺詐檢測時,IP地址可能是相關的個人交易。 某些IP地址或子網可能會產生更多欺騙性交易比其他人。 但是164.203.x.x的子網本質上並不多欺詐性比164.202.x.x; 子網的數值無關緊要。

 

文檔語料庫的詞彙可以被解釋爲一個大的分類變量,類別是唯一的單詞。 它可能在計算上很昂貴代表如此多的不同類別。 如果一個類別(例如,單詞)出現多個數據點(文檔)中的時間,然後我們可以將它表示爲一個計數並表示所有的類別通過他們的統計數字。 這被稱爲bin-counting。 我們用分類變量的共同表示開始討論,並且最終蜿蜒曲折地討論了大範圍的bin-counting問題變量,這在現代數據集中非常普遍。

 

對類別特徵進行編碼

分類變量的類別通常不是數字。例如,眼睛的顏色可以是“黑色”,“藍色”,“棕色”等。因此,需要使用編碼方法將這些非數字類別變爲數字。 簡單地將一個整數(比如1到k)分配給k個可能的類別中的每一個都是誘人的。 但是,由此產生的價值觀可以互相授權,這在類別中不應該被允許。

 

One-hot 編碼

將類別特徵進行表示一個最好的辦法就是使用一組比特位來表達。每一位代表一個可能的類別。 如果該變量不能一次成爲多個類別,那麼該組中只有一位可以是1。 這被稱爲單熱編碼,它在Scikit Learn中實現sklearn.preprocessing.OneHotEncoder。 每個位都是一個特徵。 因此是一個絕對的具有k個可能類別的變量被編碼爲長度爲k的特徵向量。

 

表5-1 對3個城市的類別進行獨熱編碼

 

 

單熱編碼非常易於理解。 但它使用的是比嚴格必要的更多的一點。 如果我們看到k-1位是零,那麼最後一位必須是1,因爲變量必須具有k個值中的一個。 在數學上,可以寫下這個約束條件爲“所有位的和必須等於1”。

等式 5-1. 獨熱編碼e1,e2,e3限制條件。

e1+e2+e3+...+ek=1

因此,我們有一個線性的依賴性。 線性相關特徵,就像我們一樣在tfidf中發現,有點煩人,因爲它意味着訓練線性模型不會是唯一的。 特徵的不同線性組合可以做出同樣的預測,所以我們需要跳過額外條件的來理解特徵對預測的影響。

 

dummy編碼

單熱編碼的問題是它允許k個自由度,其中變量本身只需要k-1。 虛擬編碼通過僅使用表示中的k-1個特徵來消除額外的自由度。 公共汽車下面有一個特徵,由全零矢量表示。 這被稱爲參考類別。 虛擬編碼和單熱編碼都是在Pandas中以pandas.get_dummies的形式實現的。

 

表5-2 對3個城市的類別進行dummy編碼

 

 

使用虛擬編碼進行建模的結果比單編碼更易解釋。這很容易在簡單的線性迴歸問題中看到。 假設我們有一些數據關於三個城市的公寓租賃價格:舊金山,紐約和西雅圖。

 

表5-3 三個不同城市的公寓價格數據集

 

 

 

圖5-1 公寓租金價格在one-hot編碼中的向量空間表示。點的大小表達了數據集中租金不同價格的平均數。

 

我們這時能夠僅僅依靠城市這一個變量來建立線性迴歸來預測租金的價格。

線性迴歸模型可以這樣寫

y=w1x1+w2x2+w3x3+...+wnxn

習慣上我們還添加一個常量來,這樣的話當x全部爲0,y不會爲0.

 

例5-1.在獨熱編碼上的線性迴歸

 

使用dummy code進行迴歸

 

 

通過獨熱編碼,截距項表示目標變量的全局均值租金價格,並且每個線性係數表示該城市的平均租金與全局平均值的差異。

 

通過虛擬編碼,偏差係數代表響應的平均值參考類別的變量y,在這個例子中是紐約市。該第i個特徵的係數等於平均響應之間的差異第i類別的值和參考類別的平均值。

 

表5-4:線性迴歸學得的係數

 

Effect編碼

分類變量編碼的另一種變體稱爲Effect編碼。 Effect編碼與虛擬編碼非常相似,區別在於參考類別現在由所有-1的向量表示。

表5-5: Effect編碼表示3個城市

 

Effect編碼與虛擬編碼非常相似,但是在線性迴歸中更容易被擬合。例子5-2表達了運行機理。截距項表示目標的全球平均值變量,單個係數表示各個類別的平均值與全球平均值有多少差異。 (這被稱爲類別或級別的主要效果,因此名稱爲“效果編碼”。)單熱編碼實際上具有相同的截距和係數,但在這種情況下,每個城市都有線性係數。 在效果編碼中,沒有單一特徵代表參考類別。 因此,參考類別的影響需要分別計算爲所有其他類別的係數的負和。(查看what is effect coding?)

 

例子5-2 Effect編碼的線性迴歸

 

類別變量的優點和缺點

單熱,虛擬和效果編碼非常相似。 他們每個人都有優點和缺點。 單熱編碼是多餘的,它允許多個有效模型一樣的問題。 非唯一性有時候對解釋有問題。該優點是每個特徵都明顯對應於一個類別。 此外,失蹤數據可以編碼爲全零矢量,輸出應該是整體目標變量的平均值。

 

虛擬編碼和效果編碼不是多餘的。 他們產生獨特和可解釋的模型。 虛擬編碼的缺點是它不能輕易處理缺少數據,因爲全零矢量已經映射到參考類別。它還編碼每個類別相對於參考類別的影響,其中看起來很奇怪。 效果編碼通過使用不同的代碼來避免此問題參考類別。 但是,所有-1的矢量都是一個密集的矢量,對於存儲和計算來說都很昂貴。 因此,Pandas和Scikit Learn等流行的ML軟件包選擇了虛擬編碼或單熱編碼,而不是效應編碼。當類別數量變得非常多時,所有三種編碼技術都會失效大。 需要不同的策略來處理非常大的分類變量。

 

處理大量的類別特徵

互聯網上的自動數據收集可以生成大量的分類變量。這在諸如定向廣告和欺詐檢測等應用中很常見。 在有針對性的廣告中,任務是根據用戶的搜索查詢或當前頁面將用戶與一組廣告進行匹配。 功能包括用戶ID,廣告的網站域,搜索查詢,當前頁面以及這些功能的所有可能的成對連詞。 (查詢是一個文本字符串,可以切分成常用的文本特徵,但查詢通常很短,通常由短語組成,因此在這種情況下最好的行爲通常是保持完整,或 通過哈希函數來簡化存儲和比較,我們將在下面更詳細地討論哈希。)其中每一個都是一個非常大的分類變量。 我們面臨的挑戰是如何找到一個能夠提高內存效率的優秀特徵表示,並生成訓練速度快的準確模型。

 

對於這種類別特徵處理的方案有:

  1. 對編碼不做任何事情。 使用便宜的訓練簡單模型。 在許多機器上將單熱編碼引入線性模型(邏輯迴歸或線性支持向量機)。

  2. 壓縮編碼,有兩種方式 a. 對特徵進行哈希--在線性迴歸中特別常見 b. bin-counting--在線性迴歸中與樹模型都常見

使用one-hot編碼是可行的。在微軟搜索廣告研究中,Graepel等人 [2010]報告在貝葉斯概率迴歸模型中使用這種二值特徵,可以使用簡單更新在線進行培訓。 與此同時,其他組織則爭論壓縮方法。 來自雅虎的研究人員 通過特徵散列發誓[Weinberger et al。2009年]。 儘管McMahan等人[2013]在谷歌的廣告引擎上嘗試了功能哈希,並沒有找到顯着的改進。 然而,微軟的其他人則被認爲是計數[Bilenko,2015]。

我們將會看到,所有這些想法都有利有弊。 我們將首先描述解決方案本身,然後討論他們的權衡。

 

 

 

特徵哈希

散列函數是一個確定性函數,它映射一個潛在的無界整數到有限整數範圍[1,m]。 由於輸入域可能大於輸出範圍,多個數字可能會映射到相同的輸出。 這被稱爲a碰撞。 統一的散列函數可確保大致相同數量的數字被映射到每個m箱。 在視覺上,我們可以將散列函數視爲一臺機器可以吸入編號的球並將它們傳送到一個m箱。 球與相同的號碼將始終被路由到同一個bin。

 

散列函數可以爲任何可以用數字表示的對象構造(對於可以存儲在計算機上的任何數據都是如此):數字,字符串,複雜的結構等。

 

 

哈希編碼

當有很多特徵時,存儲特徵向量可能佔用很多空間。 特徵散列將原始特徵向量壓縮爲m維通過對特徵ID應用散列函數來創建矢量。 例如,如果原件特徵是文檔中的單詞,那麼散列版本將具有固定的詞彙大小爲m,無論輸入中有多少獨特詞彙。

 

例5-3 對單詞的特徵哈希

 

功能散列的另一個變體添加了一個符號組件,因此計數也是從哈希箱中增加或減少。 這確保了內部產品之間散列特徵與原始特徵的期望值相同。

 

 

哈希後內積的值在時間複雜度在O(1/(m**0.5)).所以哈希表m的大小可以根據可接受的錯誤來選擇。在實踐中,選擇合適的m可能需要一些試驗和錯誤。特徵哈希可以用於涉及特徵內積的模型矢量和係數,例如線性模型和核心方法。 它一直證明在垃圾郵件過濾任務中取得成功[Weinberger等,2009]。在有針對性的廣告案例中,McMahan et al。 [2013年]報告不能將預測誤差降低到可接受的水平,除非m的數量級爲數十億。散列特徵的一個缺點是散列特徵是聚合的原始特徵,不再可解釋。

 

在這個例子中,我們將使用Yelp評論數據集來演示存儲和,解釋性使用的爲sklearn的庫FeatureHasher。在有針對性的廣告案例中,McMahan

 

 

我們看看特徵的存儲

 

我們可以清楚地看到如何使用特徵散列會以計算方式使我們受益,犧牲直接的用戶解釋能力。 這是一個容易的權衡來接受何時從數據探索和可視化發展到機器學習管道對於大型數據集。

 

bin-counting

Bin-counting是機器學習中常見的重新發現之一。 從廣告點擊率預測到硬件分支預測,它已經被重新創建並用於各種應用[Yeh and Patt,1991; Lee等人,1998; Pavlov等,2009; 李等人,2010]。 然而,因爲它是一種特徵工程技術,而不是一種建模或優化方法,所以沒有關於該主題的研究論文。 關於該技術最詳細的描述可以在Misha Bilenko的博客文章“Big Learning Made with Easy”以及相關的幻燈片中找到。

 

bin-counting的想法非常簡單:而不是使用分類變量作爲特徵,而不是使用條件概率的目標在該價值下。 換句話說,而不是編碼的身份分類值,計算該值和該值之間的關聯統計量我們希望預測的目標。 對於那些熟悉Na?veBayes分類器的人來說,這個統計學應該敲響一下鍾,因爲它是該類的條件概率假設所有功能都是獨立的。 最好用一個例。

 

表5-6. bin-counting的例子

 

Bin-counting假定歷史數據可用於計算統計。 表5-6包含分類變量每個可能值的彙總歷史計數。 根據用戶點擊任何廣告的次數以及未點擊的次數,我們可以計算用戶“Alice”點擊任何廣告的概率。 同樣,我們可以計算任何查詢 - 廣告 - 域組合的點擊概率。 在訓練時,每當我們看到“愛麗絲”時,都使用她的點擊概率作爲模型的輸入特徵。 QueryHash-AdDomain對也是如此,例如“0x437a45e1,qux.net”。

假設有10,000個用戶。 單熱編碼會生成一個稀疏矢量長度爲10,000,在列中對應於值的單個1當前數據點。 Bin-counting將所有10,000個二進制列編碼爲一個功能的真實值介於0和1之間。

 

除了歷史點擊概率外,我們還可以包含其他功能:原始計數本身(點擊次數和非點擊次數),對數比率或任何其他概率的衍生物。 我們的例子是預測廣告點擊率,通過率。 但該技術很容易應用於一般的二元分類。 它也可以使用通常的技術容易地擴展到多級分類將二元分類器擴展到多個類,即通過一對多優勢比或其他多類標籤編碼。

 

Bin-counting的優勢比和對數比

比值比通常定義在兩個二元變量之間。 它通過提出這樣一個問題來看待他們的聯想強度:“當X爲真時,Y有多大可能是真的”。例如,我們可能會問,“Alice點擊廣告的可能性大於 一般人口?“在這裏,X是二進制變量”是Alice是當前用戶“,而Y是變量”點擊廣告與否“。 該計算使用所謂的雙向列聯表(基本上,四個數字對應於X和Y的四種可能組合)。

 

表5-7. 偶然發生的用戶點擊事件

 

 

 

分類變量的單熱編碼與二進制計數統計的說明。

在實施方面,垃圾箱計數需要在每個類別之間存儲地圖及其相關計數。 (其餘的統計數據可以從中得到原始計數)。因此它需要O(k)空間,其中k是唯一值的數量的分類變量。

 

我們採用Kaggle的比賽Avazu舉個例子.

https://www.kaggle.com/c/avazu-ctr-prediction

Avazu Click數據集

  • 有24個變量,包括'點擊',一個二進制點擊/不點擊計數器和'device_id',用於跟蹤顯示廣告的設備。

  • 完整的數據集包含4,0428,967個觀測值,其中有2,686,408個獨特的設備。

Avazu競賽使用廣告數據來預測點擊率,但我們將使用它來演示如何bin計數可以大大減少大的特徵空間流數據量。

 

例子5-6 Bin-counting例子

 

 

關於稀有類別

就像罕見的詞,罕見的類別需要特殊的處理。 想想一個用戶每年登錄一次:幾乎沒有數據可以可靠估計她廣告的點擊率。 而且,稀有類別會在計數表中浪費空間。解決這個問題的一種方法是通過補償,一種積累的簡單技術一個特殊垃圾箱中所有稀有類別的數量。 如果計數大於a一定的門檻,那麼這個類別就有自己的統計數字。 否則,使用來自回退箱的統計數據。 這基本上會恢復單個的統計信息罕見類別與所有罕見類別的統計數據進行比較。 當使用back-off方法,它有助於爲統計信息添加二進制指標來自後退箱。

 

 

如果罕見類別獲得收益,它可以使用自己的統計數據進行建模,從而超過回退庫的閾值。

 

還有另一種方法來處理這個問題,稱爲count-min sketch [Cormode和Muthukrishnan,2005]。 在這種方法中,所有類別,罕見或頻繁類似通過多個散列函數進行映射,輸出範圍爲m,遠小於類別的數量,k。 當檢索一個統計量時,計算所有的哈希值該類別,並返回最小的統計量。 擁有多個散列函數減輕單個散列函數內碰撞的可能性。 該計劃有效因爲可以做出散列函數次數m,散列表大小小於k,類別的數量,仍然保持較低的整體碰撞可能性。

 

由於二進制計數依賴於歷史數據來生成必要的統計數據需要通過數據收集期等待,導致了數據收集時間的輕微延遲學習管道。 這也意味着當數據分佈發生變化時,計數需要更新。 數據變化越快,計數需要的次數越多重新計算。 這對於目標應用程序尤其重要廣告,用戶偏好和熱門查詢變化非常快,而且缺乏適應當前的分佈可能意味着廣告的巨大損失平臺。

有人可能會問,爲什麼不使用相同的數據集來計算相關統計量並訓練模型?這個想法看起來很無辜。這裏最大的問題是統計涉及目標變量,這是模型試圖預測的。使用輸出來計算輸入特徵會導致一個稱爲泄漏的有害問題。簡而言之,泄漏意味着信息被揭示給模型,從而使它有更好的預測的不切實際的優勢。當測試數據泄露到訓練集中,或者未來的數據泄漏到過去時,可能會發生這種情況。任何時候都會向模型提供在生產中實時進行預測時應該無法訪問的信息,這會導致泄漏。 Kaggle的維基提供了更多泄漏示例以及爲什麼它對機器學習應用程序不利。 如果二進制計數程序使用當前數據點的標籤來計算輸入統計量的一部分,則這構成直接泄漏。防止這種情況的一種方法是在計數收集(用於計算箱計數統計)和訓練之間進行嚴格分離,即使用較早批次的數據點進行計數,將當前數據點用於訓練(將分類變量映射到歷史統計我們剛剛收集),並使用未來的數據點進行測試。這解決了泄漏問題,但引入了上述延遲(輸入統計信息,因此模型將跟蹤當前數據)。

事實證明,還有另一種基於差別隱私的解決方案。 如果統計數據的分佈保持大致相同或不存在任何一個數據點,則該統計近似是防漏的。 在實踐中,增加一個分佈拉普拉斯(0,1)的小隨機噪聲足以掩蓋單個數據點的任何潛在泄漏。 這個想法可以結合一次性計算來制定當前數據的統計數據。 Owen Zhang在他的“贏得數據科學競賽”的演講中詳細介紹了這個技巧。

 

Counts without bounds

如果在越來越多的歷史數據下統計數據不斷更新,原始數量將無限增長。這可能是模型的問題。訓練有素的模型“知道”輸入數據直至觀察到的比例。一個訓練有素的決策樹可能會說“當x大於3時,預測爲1”。一個經過訓練的線性模型可能會說“乘以0.7的多個x並查看結果是否大於全局平均值”。這些可能是x介於0和5之間。但是除此之外會發生什麼?沒有人知道。 當輸入計數增加時,模型將需要重新訓練以適應當前的比例。如果計數積累得相當緩慢,那麼有效量表不會變得太快,並且模型不需要過於頻繁地重新訓練。但是當計數增加很快時,頻繁的再培訓將是一個麻煩。 出於這個原因,使用標準化計數通常會更好 以已知的時間間隔爲界。例如,估計的點擊率是 有界[0,1]之間。另一種方法是採取對數變換,即施加一個 嚴格的限制,但是當數量非常大時,增加速度會很慢。 這兩種方法都不能防止轉移投入分佈,例如,去年的芭比娃娃現在已經過時,人們將不再點擊這些廣告。該模型需要重新訓練以適應輸入數據分佈中的這些更根本性的變化,否則整個流程將需要遷移到模型不斷適應輸入的在線學習環境。

 

總結

Plain one-hot encoding

空間使用:O(n) 時間複雜度:O(nk)

優點:

  • 容易實現

  • 更高的精度

  • 在線學習特別容易擴展

缺點

  • 計算不足

  • 如果類別增加則不能夠使用

  • 對線性模型以外的任何其他方法都不可行

  • 對於大數據集需要分佈式訓練

Feature hashing

空間使用:O(n) 時間複雜度:O(nm)

優點:

  • 容易實現

  • 容易訓練

  • 容易擴展到新類別

  • 容易處理稀有類別

  • 在線學習容易擴展

缺點

  • 只能夠使用線性或核模型

  • 哈希編碼很難解釋

  • 精度有爭議

 

Bin-counting

空間使用:O(n+k) 時間複雜度:O(n)

優點:

  • 訓練快

  • 能夠使用樹模型

  • 容易擴展到新列類別

  • 容易處理稀有類別

  • 可解釋

缺點

  • 需要利用歷史信息

  • 對於在線學習有困難

  • 會有數據泄露

正如我們所看到的,沒有任何方法是完美的。 選擇使用哪一個取決於所需的型號。 線性模型比較便宜,因此可以進行訓練處理非壓縮表示,例如單熱編碼。 基於樹的模型,另一方面,需要反覆搜索右側分割的所有特徵,並且是因此限於小型表示,如箱計數。 功能哈希處於在這兩個極端之間,但是由此產生的精確度有不同的報道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章