AI基础:特征工程-类别特征
0.導(dǎo)語(yǔ)
特征工程到底是什么呢?顧名思義,其本質(zhì)是一項(xiàng)工程活動(dòng),目的是最大限度地從原始數(shù)據(jù)中提取特征以供算法和模型使用。
此之前,我已經(jīng)寫(xiě)了以下幾篇AI基礎(chǔ)的快速入門(mén),本篇文章講解特征工程基礎(chǔ)第一部分:(類(lèi)別特征)。
已發(fā)布:
AI 基礎(chǔ):Python?簡(jiǎn)易入門(mén)
AI 基礎(chǔ):Numpy 簡(jiǎn)易入門(mén)
AI 基礎(chǔ):Pandas 簡(jiǎn)易入門(mén)
AI 基礎(chǔ):Scipy(科學(xué)計(jì)算庫(kù)) 簡(jiǎn)易入門(mén)
AI基礎(chǔ):數(shù)據(jù)可視化簡(jiǎn)易入門(mén)(matplotlib和seaborn)
后續(xù)持續(xù)更新
參考資料:
[1]原版(英文)圖書(shū)地址:?
https://www.oreilly.com/library/view/feature-engineering-for/9781491953235/
[2]翻譯來(lái)源apachecn:?
https://github.com/apachecn
[3]翻譯作者@ZhenLeiXu:?
https://github.com/HadXu
代碼修改和整理:黃海廣,原文修改成jupyter notebook格式,并增加和修改了部分代碼,測(cè)試全部通過(guò),所有數(shù)據(jù)集已經(jīng)放在百度云下載。
本文代碼可以在github下載:
https://github.com/fengdu78/Data-Science-Notes/tree/master/9.feature-engineering
數(shù)據(jù)集的百度云:
鏈接:https://pan.baidu.com/s/1uDXt5jWUOfI0fS7hD91vBQ?提取碼:8p5d
一、特征工程:類(lèi)別特征
一個(gè)類(lèi)別特征,見(jiàn)名思義,就是用來(lái)表達(dá)一種類(lèi)別或標(biāo)簽。比如,一個(gè)類(lèi)別特征能夠表達(dá)世界上的主要城市,一年四季,或者說(shuō)一個(gè)公司的產(chǎn)品(石油、路程、技術(shù))。在真實(shí)世界的數(shù)據(jù)集中,類(lèi)別值的數(shù)量總是無(wú)限的。同時(shí)這些值一般可以用數(shù)值來(lái)表示。但是,與其他數(shù)值變量不一樣的是,類(lèi)別特征的數(shù)值變量無(wú)法與其他數(shù)值變量進(jìn)行比較大小。(作為行業(yè)類(lèi)型,石油與旅行無(wú)法進(jìn)行比較)它們被稱(chēng)之為非序的。
一個(gè)簡(jiǎn)單的問(wèn)題可以作為測(cè)試是否應(yīng)該是一個(gè)分類(lèi)變量的試金石測(cè)試:“兩個(gè)價(jià)值有多么不同,或者只是它們不同?”500美元的股票價(jià)格比100美元的價(jià)格高5倍。所以股票價(jià)格應(yīng)該用一個(gè)連續(xù)的數(shù)字變量表示。另一方面,公司的產(chǎn)業(yè)(石油,旅游,技術(shù)等)應(yīng)該無(wú)法被比較的,也就是類(lèi)別特征。
大的分類(lèi)變量在交易記錄中特別常見(jiàn)。對(duì)于實(shí)例中,許多Web服務(wù)使用id作為分類(lèi)變量來(lái)跟蹤用戶(hù)具有數(shù)百至數(shù)百萬(wàn)的值,取決于唯一的數(shù)量服務(wù)的用戶(hù)。互聯(lián)網(wǎng)交易的IP地址是另一個(gè)例子一個(gè)很大的分類(lèi)變量。它們是分類(lèi)變量,因?yàn)榧词褂脩?hù)ID和IP地址是數(shù)字,它們的大小通常與任務(wù)無(wú)關(guān)在眼前。例如,在進(jìn)行欺詐檢測(cè)時(shí),IP地址可能是相關(guān)的個(gè)人交易。某些IP地址或子網(wǎng)可能會(huì)產(chǎn)生更多欺騙性交易比其他人。但是164.203.x.x的子網(wǎng)本質(zhì)上并不多欺詐性比164.202.x.x; 子網(wǎng)的數(shù)值無(wú)關(guān)緊要。
文檔語(yǔ)料庫(kù)的詞匯可以被解釋為一個(gè)大的分類(lèi)變量,類(lèi)別是唯一的單詞。它可能在計(jì)算上很昂貴代表如此多的不同類(lèi)別。如果一個(gè)類(lèi)別(例如,單詞)出現(xiàn)多個(gè)數(shù)據(jù)點(diǎn)(文檔)中的時(shí)間,然后我們可以將它表示為一個(gè)計(jì)數(shù)并表示所有的類(lèi)別通過(guò)他們的統(tǒng)計(jì)數(shù)字。這被稱(chēng)為bin-counting。我們用分類(lèi)變量的共同表示開(kāi)始討論,并且最終蜿蜒曲折地討論了大范圍的bin-counting問(wèn)題變量,這在現(xiàn)代數(shù)據(jù)集中非常普遍。
對(duì)類(lèi)別特征進(jìn)行編碼
分類(lèi)變量的類(lèi)別通常不是數(shù)字。例如,眼睛的顏色可以是“黑色”,“藍(lán)色”,“棕色”等。因此,需要使用編碼方法將這些非數(shù)字類(lèi)別變?yōu)閿?shù)字。簡(jiǎn)單地將一個(gè)整數(shù)(比如1到k)分配給k個(gè)可能的類(lèi)別中的每一個(gè)都是誘人的。但是,由此產(chǎn)生的價(jià)值觀可以互相授權(quán),這在類(lèi)別中不應(yīng)該被允許。
One-hot 編碼
將類(lèi)別特征進(jìn)行表示一個(gè)最好的辦法就是使用一組比特位來(lái)表達(dá)。每一位代表一個(gè)可能的類(lèi)別。如果該變量不能一次成為多個(gè)類(lèi)別,那么該組中只有一位可以是1。這被稱(chēng)為獨(dú)熱編碼,它在Scikit Learn中實(shí)現(xiàn)sklearn.preprocessing.OneHotEncoder。每個(gè)位都是一個(gè)特征。因此是一個(gè)絕對(duì)的具有k個(gè)可能類(lèi)別的變量被編碼為長(zhǎng)度為k的特征向量。
表1-1 對(duì)3個(gè)城市的類(lèi)別進(jìn)行獨(dú)熱編碼
| San Francisco | 1 | 0 | 0 |
| New York | 0 | 1 | 0 |
| Seattle | 0 | 0 | 1 |
獨(dú)熱編碼非常易于理解。但它使用的是比嚴(yán)格必要的更多的一點(diǎn)。如果我們看到k-1位是零,那么最后一位必須是1,因?yàn)樽兞勘仨毦哂衚個(gè)值中的一個(gè)。在數(shù)學(xué)上,可以寫(xiě)下這個(gè)約束條件為“所有位的和必須等于1”。
等式 5-1. 獨(dú)熱編碼e1,e2,e3限制條件。
因此,我們有一個(gè)線(xiàn)性的依賴(lài)性。線(xiàn)性相關(guān)特征,就像我們一樣在tfidf中發(fā)現(xiàn),有點(diǎn)煩人,因?yàn)樗馕吨?xùn)練線(xiàn)性模型不會(huì)是唯一的。特征的不同線(xiàn)性組合可以做出同樣的預(yù)測(cè),所以我們需要跳過(guò)額外條件的來(lái)理解特征對(duì)預(yù)測(cè)的影響。
dummy編碼
獨(dú)熱編碼的問(wèn)題是它允許個(gè)自由度,其中變量本身只需要。虛擬編碼通過(guò)僅使用表示中的個(gè)特征來(lái)消除額外的自由度。
公共汽車(chē)下面有一個(gè)特征,由全零向量表示。這被稱(chēng)為參考類(lèi)別。虛擬編碼和獨(dú)熱編碼都是在Pandas中以pandas.get_dummies的形式實(shí)現(xiàn)的。
表1-2 對(duì)3個(gè)城市的類(lèi)別進(jìn)行dummy編碼
| San Francisco | 1 | 0 |
| New York | 0 | 1 |
| Seattle | 0 | 0 |
使用虛擬編碼進(jìn)行建模的結(jié)果比單編碼更易解釋。這很容易在簡(jiǎn)單的線(xiàn)性回歸問(wèn)題中看到。假設(shè)我們有一些數(shù)據(jù)關(guān)于三個(gè)城市的公寓租賃價(jià)格:舊金山,紐約和西雅圖。(見(jiàn)表1-3)
表1-3 三個(gè)不同城市的公寓價(jià)格數(shù)據(jù)集
| 0 | SF | 3999 |
| 1 | SF | 4000 |
| 2 | SF | 4001 |
| 3 | NYC | 3499 |
| 4 | NYC | 3500 |
| 5 | NYC | 3501 |
| 6 | Seattle | 2499 |
| 7 | Seattle | 2500 |
| 8 | Seattle | 2501 |
圖1-1 公寓租金價(jià)格在one-hot編碼中的向量空間表示。點(diǎn)的大小表達(dá)了數(shù)據(jù)集中租金不同價(jià)格的平均數(shù)。
我們這時(shí)能夠僅僅依靠城市這一個(gè)變量來(lái)建立線(xiàn)性回歸來(lái)預(yù)測(cè)租金的價(jià)格。
線(xiàn)性回歸模型可以這樣寫(xiě)
習(xí)慣上我們還添加一個(gè)常量來(lái),這樣的話(huà)當(dāng)全部為0,不會(huì)為0.
例1-1.在獨(dú)熱編碼上的線(xiàn)性回歸
import pandas as pd from sklearn import linear_model df = pd.DataFrame({'City':['SF', 'SF', 'SF', 'NYC', 'NYC', 'NYC', 'Seattle', 'Seattle', 'Seattle'],'Rent': [3999, 4000, 4001, 3499, 3500, 3501, 2499, 2500, 2501] }) df['Rent'].mean() 3333.3333333333335 one_hot_df = pd.get_dummies(df, prefix=['city']) one_hot_df| 3999 | 0 | 1 | 0 |
| 4000 | 0 | 1 | 0 |
| 4001 | 0 | 1 | 0 |
| 3499 | 1 | 0 | 0 |
| 3500 | 1 | 0 | 0 |
| 3501 | 1 | 0 | 0 |
| 2499 | 0 | 0 | 1 |
| 2500 | 0 | 0 | 1 |
| 2501 | 0 | 0 | 1 |
使用dummy code進(jìn)行回歸
dummy_df = pd.get_dummies(df, prefix=['city'], drop_first=True) dummy_df| 3999 | 1 | 0 |
| 4000 | 1 | 0 |
| 4001 | 1 | 0 |
| 3499 | 0 | 0 |
| 3500 | 0 | 0 |
| 3501 | 0 | 0 |
| 2499 | 0 | 1 |
| 2500 | 0 | 1 |
| 2501 | 0 | 1 |
通過(guò)獨(dú)熱編碼,截距項(xiàng)表示目標(biāo)變量的全局均值租金價(jià)格,并且每個(gè)線(xiàn)性系數(shù)表示該城市的平均租金與全局平均值的差異。
通過(guò)虛擬編碼,偏差系數(shù)代表響應(yīng)的平均值參考類(lèi)別的變量y,在這個(gè)例子中是紐約市。該第i個(gè)特征的系數(shù)等于平均響應(yīng)之間的差異第i類(lèi)別的值和參考類(lèi)別的平均值。
表1-4:線(xiàn)性回歸學(xué)得的系數(shù)
| one-hot | 166.67 | 666.67 | -833.33 | 3333.33 |
| dummy coding | 0 | 500 | -1000 | 3500 |
Effect編碼
分類(lèi)變量編碼的另一種變體稱(chēng)為Effect編碼。Effect編碼與虛擬編碼非常相似,區(qū)別在于參考類(lèi)別現(xiàn)在由所有-1的向量表示。
表1-5: Effect編碼表示3個(gè)城市
| San Francisco | 1 | 0 |
| New York | 0 | 1 |
| Seattle | -1 | -1 |
Effect編碼與虛擬編碼非常相似,但是在線(xiàn)性回歸中更容易被擬合。例1-2表達(dá)了運(yùn)行機(jī)理。截距項(xiàng)表示目標(biāo)的全球平均值變量,單個(gè)系數(shù)表示各個(gè)類(lèi)別的平均值與全球平均值有多少差異。(這被稱(chēng)為類(lèi)別或級(jí)別的主要效果,因此名稱(chēng)為“效果編碼”。)獨(dú)熱編碼實(shí)際上具有相同的截距和系數(shù),但在這種情況下,每個(gè)城市都有線(xiàn)性系數(shù)。在效果編碼中,沒(méi)有單一特征代表參考類(lèi)別。因此,參考類(lèi)別的影響需要分別計(jì)算為所有其他類(lèi)別的系數(shù)的負(fù)和。(查看what is effect coding?)
例1-2 Effect編碼的線(xiàn)性回歸
effect_df = dummy_df.copy() effect_df.loc[3:5, ['city_SF', 'city_Seattle']] = -1.0 effect_df| 3999 | 1.0 | 0.0 |
| 4000 | 1.0 | 0.0 |
| 4001 | 1.0 | 0.0 |
| 3499 | -1.0 | -1.0 |
| 3500 | -1.0 | -1.0 |
| 3501 | -1.0 | -1.0 |
| 2499 | 0.0 | 1.0 |
| 2500 | 0.0 | 1.0 |
| 2501 | 0.0 | 1.0 |
類(lèi)別變量的優(yōu)點(diǎn)和缺點(diǎn)
獨(dú)熱,虛擬和效果編碼非常相似。他們每個(gè)人都有優(yōu)點(diǎn)和缺點(diǎn)。獨(dú)熱編碼是多余的,它允許多個(gè)有效模型一樣的問(wèn)題。非唯一性有時(shí)候?qū)忉層袉?wèn)題。該優(yōu)點(diǎn)是每個(gè)特征都明顯對(duì)應(yīng)于一個(gè)類(lèi)別。此外,失蹤數(shù)據(jù)可以編碼為全零矢量,輸出應(yīng)該是整體目標(biāo)變量的平均值。
虛擬編碼和效果編碼不是多余的。他們產(chǎn)生獨(dú)特和可解釋的模型。虛擬編碼的缺點(diǎn)是它不能輕易處理缺少數(shù)據(jù),因?yàn)槿闶噶恳呀?jīng)映射到參考類(lèi)別。它還編碼每個(gè)類(lèi)別相對(duì)于參考類(lèi)別的影響,其中看起來(lái)很奇怪。效果編碼通過(guò)使用不同的代碼來(lái)避免此問(wèn)題參考類(lèi)別。但是,所有-1的矢量都是一個(gè)密集的矢量,對(duì)于存儲(chǔ)和計(jì)算來(lái)說(shuō)都很昂貴。因此,Pandas和Scikit Learn等流行的ML軟件包選擇了虛擬編碼或獨(dú)熱編碼,而不是效應(yīng)編碼。當(dāng)類(lèi)別數(shù)量變得非常多時(shí),所有三種編碼技術(shù)都會(huì)失效大。需要不同的策略來(lái)處理非常大的分類(lèi)變量。
處理大量的類(lèi)別特征
互聯(lián)網(wǎng)上的自動(dòng)數(shù)據(jù)收集可以生成大量的分類(lèi)變量。這在諸如定向廣告和欺詐檢測(cè)等應(yīng)用中很常見(jiàn)。在有針對(duì)性的廣告中,任務(wù)是根據(jù)用戶(hù)的搜索查詢(xún)或當(dāng)前頁(yè)面將用戶(hù)與一組廣告進(jìn)行匹配。功能包括用戶(hù)ID,廣告的網(wǎng)站域,搜索查詢(xún),當(dāng)前頁(yè)面以及這些功能的所有可能的成對(duì)連詞。(查詢(xún)是一個(gè)文本字符串,可以切分成常用的文本特征,但查詢(xún)通常很短,通常由短語(yǔ)組成,因此在這種情況下最好的行為通常是保持完整,或 通過(guò)哈希函數(shù)來(lái)簡(jiǎn)化存儲(chǔ)和比較,我們將在下面更詳細(xì)地討論哈希。)其中每一個(gè)都是一個(gè)非常大的分類(lèi)變量。我們面臨的挑戰(zhàn)是如何找到一個(gè)能夠提高內(nèi)存效率的優(yōu)秀特征表示,并生成訓(xùn)練速度快的準(zhǔn)確模型。
對(duì)于這種類(lèi)別特征處理的方案有:
對(duì)編碼不做任何事情。使用便宜的訓(xùn)練簡(jiǎn)單模型。在許多機(jī)器上將獨(dú)熱編碼引入線(xiàn)性模型(邏輯回歸或線(xiàn)性支持向量機(jī))。
壓縮編碼,有兩種方式
a. 對(duì)特征進(jìn)行哈希--在線(xiàn)性回歸中特別常見(jiàn)
b. bin-counting--在線(xiàn)性回歸中與樹(shù)模型都常見(jiàn)
使用one-hot編碼是可行的。在微軟搜索廣告研究中,Graepel等人 [2010]報(bào)告在貝葉斯概率回歸模型中使用這種二值特征,可以使用簡(jiǎn)單更新在線(xiàn)進(jìn)行培訓(xùn)。與此同時(shí),其他組織則爭(zhēng)論壓縮方法。來(lái)自雅虎的研究人員 通過(guò)特征散列方式[Weinberger et al.2009年]。盡管McMahan等人[2013]在谷歌的廣告引擎上嘗試了功能哈希,并沒(méi)有找到顯著的改進(jìn)。然而,微軟的其他人則被認(rèn)為是計(jì)數(shù)[Bilenko,2015]。
我們將會(huì)看到,所有這些想法都有利有弊。我們將首先描述解決方案本身,然后討論他們的權(quán)衡。
特征哈希
散列函數(shù)是一個(gè)確定性函數(shù),它映射一個(gè)潛在的無(wú)界整數(shù)到有限整數(shù)范圍,。由于輸入域可能大于輸出范圍,多個(gè)數(shù)字可能會(huì)映射到相同的輸出。這被稱(chēng)為a碰撞。統(tǒng)一的散列函數(shù)可確保大致相同數(shù)量的數(shù)字被映射到每個(gè)箱。在視覺(jué)上,我們可以將散列函數(shù)視為一臺(tái)機(jī)器可以吸入編號(hào)的球并將它們傳送到一個(gè)m箱。球與相同的號(hào)碼將始終被路由到同一個(gè)bin。
散列函數(shù)可以為任何可以用數(shù)字表示的對(duì)象構(gòu)造(對(duì)于可以存儲(chǔ)在計(jì)算機(jī)上的任何數(shù)據(jù)都是如此):數(shù)字,字符串,復(fù)雜的結(jié)構(gòu)等。
圖1-2 哈希編碼
當(dāng)有很多特征時(shí),存儲(chǔ)特征向量可能占用很多空間。特征散列將原始特征向量壓縮為m維通過(guò)對(duì)特征ID應(yīng)用散列函數(shù)來(lái)創(chuàng)建矢量。例如,如果原件特征是文檔中的單詞,那么散列版本將具有固定的詞匯大小為m,無(wú)論輸入中有多少獨(dú)特詞匯。
例1-3 對(duì)單詞的特征哈希
def hash_features(word_list, m):output = [0] * mfor word in word_list:index = hash_fcn(word) % moutput[index] += 1return output功能散列的另一個(gè)變體添加了一個(gè)符號(hào)組件,因此計(jì)數(shù)也是從哈希箱中增加或減少。這確保了內(nèi)部產(chǎn)品之間散列特征與原始特征的期望值相同。
def hash_features(word_list, m):output = [0] * mfor word in word_list:index = hash_fcn(word) % msign_bit = sign_hash(word) % 2if (sign_bit == 0):output[index] -= 1else:output[index] += 1return output哈希后內(nèi)積的值在時(shí)間復(fù)雜度在O(1/(m**0.5)).所以哈希表m的大小可以根據(jù)可接受的錯(cuò)誤來(lái)選擇。在實(shí)踐中,選擇合適的m可能需要一些試驗(yàn)和錯(cuò)誤。特征哈希可以用于涉及特征內(nèi)積的模型矢量和系數(shù),例如線(xiàn)性模型和核心方法。它一直證明在垃圾郵件過(guò)濾任務(wù)中取得成功[Weinberger等,2009]。在有針對(duì)性的廣告案例中,McMahan et al. [2013年]報(bào)告不能將預(yù)測(cè)誤差降低到可接受的水平,除非m的數(shù)量級(jí)為數(shù)十億。散列特征的一個(gè)缺點(diǎn)是散列特征是聚合的原始特征,不再可解釋。
在這個(gè)例子中,我們將使用Yelp評(píng)論數(shù)據(jù)集來(lái)演示存儲(chǔ)和,解釋性使用的為sklearn的庫(kù)FeatureHasher。
import pandas as pd import json js = [] with open('data/yelp_academic_dataset_review.json') as f:for i in range(10000):js.append(json.loads(f.readline()))review_df = pd.DataFrame(js)m = len(review_df.business_id.unique()) m 4174 from sklearn.feature_extraction import FeatureHasher h = FeatureHasher(n_features=m, input_type='string') f = h.transform(review_df['business_id']) review_df['business_id'].unique().tolist()[0:5] ['9yKzy9PApeiPPOUJEtnvkg','ZRJwVLyzEJq1VAihDhYiow','6oRAC4uyJCsJl1X0WZpVSA','_1QQZuf4zZOyFCvXc0o6Vg','6ozycU1RpktNG2-1BroVtw'] f.toarray() array([[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],...,[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.]])我們看看特征的存儲(chǔ)
from sys import getsizeof print('Our pandas Series, in bytes: ', getsizeof(review_df['business_id'])) print('Our hashed numpy array, in bytes: ', getsizeof(f)) Our pandas Series, in bytes: 790104 Our hashed numpy array, in bytes: 56我們可以清楚地看到如何使用特征散列會(huì)以計(jì)算方式使我們受益,犧牲直接的用戶(hù)解釋能力。這是一個(gè)容易的權(quán)衡來(lái)接受何時(shí)從數(shù)據(jù)探索和可視化發(fā)展到機(jī)器學(xué)習(xí)管道對(duì)于大型數(shù)據(jù)集。
bin-counting
Bin-counting是機(jī)器學(xué)習(xí)中常見(jiàn)的重新發(fā)現(xiàn)之一。從廣告點(diǎn)擊率預(yù)測(cè)到硬件分支預(yù)測(cè),它已經(jīng)被重新創(chuàng)建并用于各種應(yīng)用[Yeh and Patt,1991; Lee等人,1998; Pavlov等,2009; 李等人,2010]。然而,因?yàn)樗且环N特征工程技術(shù),而不是一種建模或優(yōu)化方法,所以沒(méi)有關(guān)于該主題的研究論文。關(guān)于該技術(shù)最詳細(xì)的描述可以在Misha Bilenko的博客文章“Big Learning Made with Easy”以及相關(guān)的幻燈片中找到。
bin-counting的想法非常簡(jiǎn)單:而不是使用分類(lèi)變量作為特征,而不是使用條件概率的目標(biāo)在該價(jià)值下。換句話(huà)說(shuō),而不是編碼的身份分類(lèi)值,計(jì)算該值和該值之間的關(guān)聯(lián)統(tǒng)計(jì)量我們希望預(yù)測(cè)的目標(biāo)。對(duì)于那些熟悉Na?veBayes分類(lèi)器的人來(lái)說(shuō),這個(gè)統(tǒng)計(jì)學(xué)應(yīng)該敲響一下鐘,因?yàn)樗窃擃?lèi)的條件概率假設(shè)所有功能都是獨(dú)立的。最好用一個(gè)例。
表1-6. bin-counting的例子
| Alice | 5 | 120 | 0.0400 | 0x598fd4fe,foo.com | 5000 | 30000 | 0.167 |
| bob | 20 | 230 | 0.0800 | 0x50fa3cc0,bar.org | 100,900,0.100 | ||
| ... | |||||||
| joe | 2 | 3 | 0.400 | 0x437a45e1,qux.net | 6,18,0.250 |
Bin-counting假定歷史數(shù)據(jù)可用于計(jì)算統(tǒng)計(jì)。表1-6包含分類(lèi)變量每個(gè)可能值的匯總歷史計(jì)數(shù)。根據(jù)用戶(hù)點(diǎn)擊任何廣告的次數(shù)以及未點(diǎn)擊的次數(shù),我們可以計(jì)算用戶(hù)“Alice”點(diǎn)擊任何廣告的概率。同樣,我們可以計(jì)算任何查詢(xún) - 廣告 - 域組合的點(diǎn)擊概率。在訓(xùn)練時(shí),每當(dāng)我們看到“愛(ài)麗絲”時(shí),都使用她的點(diǎn)擊概率作為模型的輸入特征。QueryHash-AdDomain對(duì)也是如此,例如“0x437a45e1,qux.net”。
假設(shè)有10,000個(gè)用戶(hù)。獨(dú)熱編碼會(huì)生成一個(gè)稀疏矢量長(zhǎng)度為10,000,在列中對(duì)應(yīng)于值的單個(gè)1當(dāng)前數(shù)據(jù)點(diǎn)。Bin-counting將所有10,000個(gè)二進(jìn)制列編碼為一個(gè)功能的真實(shí)值介于0和1之間。
除了歷史點(diǎn)擊概率外,我們還可以包含其他功能:原始計(jì)數(shù)本身(點(diǎn)擊次數(shù)和非點(diǎn)擊次數(shù)),對(duì)數(shù)比率或任何其他概率的衍生物。我們的例子是預(yù)測(cè)廣告點(diǎn)擊率,通過(guò)率。但該技術(shù)很容易應(yīng)用于一般的二元分類(lèi)。它也可以使用通常的技術(shù)容易地?cái)U(kuò)展到多級(jí)分類(lèi)將二元分類(lèi)器擴(kuò)展到多個(gè)類(lèi),即通過(guò)一對(duì)多優(yōu)勢(shì)比或其他多類(lèi)標(biāo)簽編碼。
Bin-counting的優(yōu)勢(shì)比和對(duì)數(shù)比
比值比通常定義在兩個(gè)二元變量之間。它通過(guò)提出這樣一個(gè)問(wèn)題來(lái)看待他們的聯(lián)想強(qiáng)度:“當(dāng)為真時(shí),有多大可能是真的”。例如,我們可能會(huì)問(wèn),“Alice點(diǎn)擊廣告的可能性大于一般人口?“在這里,是二進(jìn)制變量”是Alice是當(dāng)前用戶(hù)“,而是變量”點(diǎn)擊廣告與否“。該計(jì)算使用所謂的雙向列聯(lián)表(基本上,四個(gè)數(shù)字對(duì)應(yīng)于和的四種可能組合)。
表1-7. 偶然發(fā)生的用戶(hù)點(diǎn)擊事件
| Alice | 5 | 120 | 125 |
| Not Alice | 995 | 18880 | 19875 |
| Total | 1000 | 19000 | 20000 |
給定輸入變量和目標(biāo)變量,優(yōu)勢(shì)比定義為:
在我們的例子中,這意味著“愛(ài)麗絲點(diǎn)擊廣告而不是點(diǎn)擊的可能性”和“其他人點(diǎn)擊而非點(diǎn)擊的可能性有多大”之間的比率。在這種情況下,數(shù)字是
更簡(jiǎn)單地說(shuō),我們可以看看分子,它檢查多少可能性單個(gè)用戶(hù)(Alice)是否點(diǎn)擊廣告而不是點(diǎn)擊。這適合大型具有許多值的分類(lèi)變量,而不僅僅是兩個(gè)。
概率比率可能很容易變得非常小或非常大。(例如,將會(huì)有幾乎不會(huì)點(diǎn)擊廣告的用戶(hù),也可能是點(diǎn)擊廣告的用戶(hù)更頻繁得多)日志轉(zhuǎn)換再次來(lái)到我們的救援。另一個(gè)對(duì)數(shù)的有用特性是它將一個(gè)劃分變?yōu)橐粋€(gè)減法。
簡(jiǎn)而言之,bin-counting將分類(lèi)變量轉(zhuǎn)換為有關(guān)的統(tǒng)計(jì)信息值。它變成了一個(gè)大的,稀疏的分類(lèi)變量的二進(jìn)制表示變成一個(gè)非常小,密集的實(shí)值數(shù)值表示。
圖1-3 分類(lèi)變量的獨(dú)熱編碼與二進(jìn)制計(jì)數(shù)統(tǒng)計(jì)的說(shuō)明。
在實(shí)施方面,垃圾箱計(jì)數(shù)需要在每個(gè)類(lèi)別之間存儲(chǔ)地圖及其相關(guān)計(jì)數(shù)。(其余的統(tǒng)計(jì)數(shù)據(jù)可以從中得到原始計(jì)數(shù))。因此它需要空間,其中是唯一值的數(shù)量的分類(lèi)變量。
我們采用Kaggle的比賽Avazu舉個(gè)例子。
Avazu Click數(shù)據(jù)集
有24個(gè)變量,包括'點(diǎn)擊',一個(gè)二進(jìn)制點(diǎn)擊/不點(diǎn)擊計(jì)數(shù)器和'device_id',用于跟蹤顯示廣告的設(shè)備。
完整的數(shù)據(jù)集包含4,0428,967個(gè)觀測(cè)值,其中有2,686,408個(gè)獨(dú)特的設(shè)備。
mAvazu競(jìng)賽使用廣告數(shù)據(jù)來(lái)預(yù)測(cè)點(diǎn)擊率,但我們將使用它來(lái)演示如何bin計(jì)數(shù)可以大大減少大的特征空間流數(shù)據(jù)量。
編者注:這個(gè)數(shù)據(jù)集特別大,大概6g,我們讀取前10k行存儲(chǔ)為train_subset.csv,并傳到了百度云,可能跑出來(lái)的結(jié)果與原書(shū)不一致,但不影響學(xué)習(xí)。
例1-6 Bin-counting例子
import pandas as pd #讀取前面的10k行 df = pd.read_csv('data/train_subset.csv') #有多少獨(dú)立的特征 len(df['device_id'].unique()) 1075 df.head()5 rows × 24 columns
| 1561 | 7163 | 8724 | 0.178932 | 0.821068 | 0.217925 |
| 2 | 15 | 17 | 0.117647 | 0.882353 | 0.133333 |
| 0 | 9 | 9 | 0.000000 | 1.000000 | 0.000000 |
| 0 | 9 | 9 | 0.000000 | 1.000000 | 0.000000 |
關(guān)于稀有類(lèi)別
就像罕見(jiàn)的詞,罕見(jiàn)的類(lèi)別需要特殊的處理。想想一個(gè)用戶(hù)每年登錄一次:幾乎沒(méi)有數(shù)據(jù)可以可靠估計(jì)她廣告的點(diǎn)擊率。而且,稀有類(lèi)別會(huì)在計(jì)數(shù)表中浪費(fèi)空間。解決這個(gè)問(wèn)題的一種方法是通過(guò)補(bǔ)償,一種積累的簡(jiǎn)單技術(shù)一個(gè)特殊垃圾箱中所有稀有類(lèi)別的數(shù)量。如果計(jì)數(shù)大于一定的門(mén)檻,那么這個(gè)類(lèi)別就有自己的統(tǒng)計(jì)數(shù)字。否則,使用來(lái)自回退箱的統(tǒng)計(jì)數(shù)據(jù)。這基本上會(huì)恢復(fù)單個(gè)的統(tǒng)計(jì)信息罕見(jiàn)類(lèi)別與所有罕見(jiàn)類(lèi)別的統(tǒng)計(jì)數(shù)據(jù)進(jìn)行比較。當(dāng)使用back-off方法,它有助于為統(tǒng)計(jì)信息添加二進(jìn)制指標(biāo)來(lái)自后退箱。
圖1-4
如果罕見(jiàn)類(lèi)別獲得收益,它可以使用自己的統(tǒng)計(jì)數(shù)據(jù)進(jìn)行建模,從而超過(guò)回退庫(kù)的閾值。
還有另一種方法來(lái)處理這個(gè)問(wèn)題,稱(chēng)為count-min sketch [Cormode和Muthukrishnan,2005]。在這種方法中,所有類(lèi)別,罕見(jiàn)或頻繁類(lèi)似通過(guò)多個(gè)散列函數(shù)進(jìn)行映射,輸出范圍為,遠(yuǎn)小于類(lèi)別的數(shù)量。當(dāng)檢索一個(gè)統(tǒng)計(jì)量時(shí),計(jì)算所有的哈希值該類(lèi)別,并返回最小的統(tǒng)計(jì)量。擁有多個(gè)散列函數(shù)減輕單個(gè)散列函數(shù)內(nèi)碰撞的可能性。該計(jì)劃有效因?yàn)榭梢宰龀錾⒘泻瘮?shù)次數(shù),散列表大小小于,類(lèi)別的數(shù)量,仍然保持較低的整體碰撞可能性。
由于二進(jìn)制計(jì)數(shù)依賴(lài)于歷史數(shù)據(jù)來(lái)生成必要的統(tǒng)計(jì)數(shù)據(jù)需要通過(guò)數(shù)據(jù)收集期等待,導(dǎo)致了數(shù)據(jù)收集時(shí)間的輕微延遲學(xué)習(xí)管道。這也意味著當(dāng)數(shù)據(jù)分布發(fā)生變化時(shí),計(jì)數(shù)需要更新。數(shù)據(jù)變化越快,計(jì)數(shù)需要的次數(shù)越多重新計(jì)算。這對(duì)于目標(biāo)應(yīng)用程序尤其重要廣告,用戶(hù)偏好和熱門(mén)查詢(xún)變化非常快,而且缺乏適應(yīng)當(dāng)前的分布可能意味著廣告的巨大損失平臺(tái)。
有人可能會(huì)問(wèn),為什么不使用相同的數(shù)據(jù)集來(lái)計(jì)算相關(guān)統(tǒng)計(jì)量并訓(xùn)練模型?這個(gè)想法看起來(lái)很無(wú)辜。這里最大的問(wèn)題是統(tǒng)計(jì)涉及目標(biāo)變量,這是模型試圖預(yù)測(cè)的。使用輸出來(lái)計(jì)算輸入特征會(huì)導(dǎo)致一個(gè)稱(chēng)為泄漏的有害問(wèn)題。簡(jiǎn)而言之,泄漏意味著信息被揭示給模型,從而使它有更好的預(yù)測(cè)的不切實(shí)際的優(yōu)勢(shì)。當(dāng)測(cè)試數(shù)據(jù)泄露到訓(xùn)練集中,或者未來(lái)的數(shù)據(jù)泄漏到過(guò)去時(shí),可能會(huì)發(fā)生這種情況。任何時(shí)候都會(huì)向模型提供在生產(chǎn)中實(shí)時(shí)進(jìn)行預(yù)測(cè)時(shí)應(yīng)該無(wú)法訪問(wèn)的信息,這會(huì)導(dǎo)致泄漏。Kaggle的維基提供了更多泄漏示例以及為什么它對(duì)機(jī)器學(xué)習(xí)應(yīng)用程序不利。
如果二進(jìn)制計(jì)數(shù)程序使用當(dāng)前數(shù)據(jù)點(diǎn)的標(biāo)簽來(lái)計(jì)算輸入統(tǒng)計(jì)量的一部分,則這構(gòu)成直接泄漏。防止這種情況的一種方法是在計(jì)數(shù)收集(用于計(jì)算箱計(jì)數(shù)統(tǒng)計(jì))和訓(xùn)練之間進(jìn)行嚴(yán)格分離,即使用較早批次的數(shù)據(jù)點(diǎn)進(jìn)行計(jì)數(shù),將當(dāng)前數(shù)據(jù)點(diǎn)用于訓(xùn)練(將分類(lèi)變量映射到歷史統(tǒng)計(jì)我們剛剛收集),并使用未來(lái)的數(shù)據(jù)點(diǎn)進(jìn)行測(cè)試。這解決了泄漏問(wèn)題,但引入了上述延遲(輸入統(tǒng)計(jì)信息,因此模型將跟蹤當(dāng)前數(shù)據(jù))。
事實(shí)證明,還有另一種基于差別隱私的解決方案。如果統(tǒng)計(jì)數(shù)據(jù)的分布保持大致相同或不存在任何一個(gè)數(shù)據(jù)點(diǎn),則該統(tǒng)計(jì)近似是防漏的。在實(shí)踐中,增加一個(gè)分布拉普拉斯的小隨機(jī)噪聲足以掩蓋單個(gè)數(shù)據(jù)點(diǎn)的任何潛在泄漏。這個(gè)想法可以結(jié)合一次性計(jì)算來(lái)制定當(dāng)前數(shù)據(jù)的統(tǒng)計(jì)數(shù)據(jù)。
Owen Zhang在他的“贏得數(shù)據(jù)科學(xué)競(jìng)賽”的演講中詳細(xì)介紹了這個(gè)技巧。
Counts without bounds
如果在越來(lái)越多的歷史數(shù)據(jù)下統(tǒng)計(jì)數(shù)據(jù)不斷更新,原始數(shù)量將無(wú)限增長(zhǎng)。這可能是模型的問(wèn)題。訓(xùn)練有素的模型“知道”輸入數(shù)據(jù)直至觀察到的比例。一個(gè)訓(xùn)練有素的決策樹(shù)可能會(huì)說(shuō)“當(dāng)x大于3時(shí),預(yù)測(cè)為1”。一個(gè)經(jīng)過(guò)訓(xùn)練的線(xiàn)性模型可能會(huì)說(shuō)“乘以0.7的多個(gè)x并查看結(jié)果是否大于全局平均值”。這些可能是x介于0和5之間。但是除此之外會(huì)發(fā)生什么?沒(méi)有人知道。當(dāng)輸入計(jì)數(shù)增加時(shí),模型將需要重新訓(xùn)練以適應(yīng)當(dāng)前的比例。如果計(jì)數(shù)積累得相當(dāng)緩慢,那么有效量表不會(huì)變得太快,并且模型不需要過(guò)于頻繁地重新訓(xùn)練。但是當(dāng)計(jì)數(shù)增加很快時(shí),頻繁的再培訓(xùn)將是一個(gè)麻煩。
出于這個(gè)原因,使用標(biāo)準(zhǔn)化計(jì)數(shù)通常會(huì)更好。
以已知的時(shí)間間隔為界。例如,估計(jì)的點(diǎn)擊率是介于之間。另一種方法是采取對(duì)數(shù)變換,即施加一個(gè)嚴(yán)格的限制,但是當(dāng)數(shù)量非常大時(shí),增加速度會(huì)很慢。這兩種方法都不能防止轉(zhuǎn)移投入分布,例如,去年的芭比娃娃現(xiàn)在已經(jīng)過(guò)時(shí),人們將不再點(diǎn)擊這些廣告。該模型需要重新訓(xùn)練以適應(yīng)輸入數(shù)據(jù)分布中的這些更根本性的變化,否則整個(gè)流程將需要遷移到模型不斷適應(yīng)輸入的在線(xiàn)學(xué)習(xí)環(huán)境。
總結(jié)
Plain one-hot encoding
空間復(fù)雜度:
時(shí)間復(fù)雜度:
優(yōu)點(diǎn):
容易實(shí)現(xiàn)
更高的精度
在線(xiàn)學(xué)習(xí)特別容易擴(kuò)展
缺點(diǎn)
計(jì)算不足
如果類(lèi)別增加則不能夠使用
對(duì)線(xiàn)性模型以外的任何其他方法都不可行
對(duì)于大數(shù)據(jù)集需要分布式訓(xùn)練
Feature hashing
空間復(fù)雜度:
時(shí)間復(fù)雜度:
優(yōu)點(diǎn):
容易實(shí)現(xiàn)
容易訓(xùn)練
容易擴(kuò)展到新類(lèi)別
容易處理稀有類(lèi)別
在線(xiàn)學(xué)習(xí)容易擴(kuò)展
缺點(diǎn):
只能夠使用線(xiàn)性或核模型
哈希編碼很難解釋
精度有爭(zhēng)議
Bin-counting
空間復(fù)雜度:
時(shí)間復(fù)雜度:
優(yōu)點(diǎn):
訓(xùn)練快
能夠使用樹(shù)模型
容易擴(kuò)展到新列類(lèi)別
容易處理稀有類(lèi)別
可解釋
缺點(diǎn):
需要利用歷史信息
對(duì)于在線(xiàn)學(xué)習(xí)有困難
會(huì)有數(shù)據(jù)泄露
正如我們所看到的,沒(méi)有任何方法是完美的。選擇使用哪一個(gè)取決于所需的型號(hào)。
線(xiàn)性模型比較簡(jiǎn)單,因此可以進(jìn)行訓(xùn)練處理非壓縮表示,例如獨(dú)熱編碼。
基于樹(shù)的模型,另一方面,需要反復(fù)搜索右側(cè)分割的所有特征,并且是因此限于小型表示,如箱計(jì)數(shù)。
哈希函數(shù)處于在這兩個(gè)極端之間,但是由此產(chǎn)生的精確度各有不同。
相關(guān)資源
原版(英文)圖書(shū)地址:
https://www.oreilly.com/library/view/feature-engineering-for/9781491953235/
本文代碼可以在github下載:
https://github.com/fengdu78/Data-Science-Notes/tree/master/9.feature-engineering
數(shù)據(jù)集的百度云:
鏈接:https://pan.baidu.com/s/1uDXt5jWUOfI0fS7hD91vBQ 提取碼:8p5d
往期精彩回顧 那些年做的學(xué)術(shù)公益-你不是一個(gè)人在戰(zhàn)斗適合初學(xué)者入門(mén)人工智能的路線(xiàn)及資料下載機(jī)器學(xué)習(xí)在線(xiàn)手冊(cè)深度學(xué)習(xí)在線(xiàn)手冊(cè)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”加入知識(shí)星球(4500+用戶(hù),ID:92416895),請(qǐng)回復(fù)“知識(shí)星球”總結(jié)
以上是生活随笔為你收集整理的AI基础:特征工程-类别特征的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 推荐几款不错的写作利器
- 下一篇: AI基础:特征工程-数字特征处理