背景音樂(lè):We Don't Talk Anymore
很多時(shí)候,在我們拿到的數(shù)據(jù)集里,特征不都是連續(xù)的值,而是由某些離散化取值的數(shù)據(jù)組成。例如,性別特征可以具有如下取值:["male", "female"],天氣特征有如下取值:["rainy", "sunny", "snowy"...]。
1. 數(shù)字化編碼LabelEncoder
這樣的特征是無(wú)法直接被模型識(shí)別的,因此需要將這些特征轉(zhuǎn)換為數(shù)學(xué)模型能動(dòng)的語(yǔ)言,一個(gè)很容易想到的方法就是,對(duì)這些特征進(jìn)行數(shù)字化,也就是編號(hào),比如,["male", "female"]可以用[0, 1]表示,["rainy", "sunny", "snowy"...]可以用[0,1, 2, ...]表示??傊?,對(duì)于一個(gè)有N個(gè)類別的特征,總是可以用[0, N-1]之間的連續(xù)整數(shù)進(jìn)行編號(hào)。
# 用sklearn實(shí)現(xiàn)
from sklearn.preprocessing import LabelEncoder
Le = LabelEncoder() # 構(gòu)造編碼器
Le.fit(['sunny','rainy','snowy']) # 訓(xùn)練編碼器
Le.classes_ # 等于array(['rainy', 'snowy', 'sunny'])
Le.transform(['sunny']) # 等于array([2])
2. 獨(dú)熱編碼OneHotEncoder
上述的編碼方式,歸根結(jié)底,只是把離散型數(shù)據(jù)換了個(gè)表達(dá)方式,本質(zhì)上還是不連續(xù)的。而且如果直接用的話,容易被當(dāng)成是連續(xù)的數(shù)值型數(shù)據(jù)進(jìn)行處理,造成錯(cuò)誤,除非編碼后得到的數(shù)據(jù)連續(xù)性是有實(shí)際意義的。
對(duì)此,我們可以選擇用獨(dú)熱編碼來(lái)解決。通俗地講,對(duì)于一個(gè)有N個(gè)類別的特征,總是可以構(gòu)造N個(gè)新特征來(lái)唯一表示,比如,對(duì)于性別特征可以構(gòu)造兩個(gè)新特征,兩個(gè)新特征的取值分別為:"male"→[1, 0],"female"→[0, 1]??傊@N個(gè)新特征,在任何情況下,均只有1個(gè)特征取值為1,其他特征取值為0,從而保證了唯一性。
# 用sklearn實(shí)現(xiàn)
from sklearn.preprocessing import OneHotEncoder
Ohe = OneHotEncoder() # 構(gòu)造編碼器
Ohe.fit([[1],[2],[3],[1],[3]]) # 訓(xùn)練編碼器,輸入是LabelEncoder得到的整數(shù)型數(shù)據(jù)
Ohe.active_features_ # 等于array([1, 2, 3])
Ohe.transform([[2]]).toarray() # 等于array([[ 0., 1., 0.]])
3. 為什么要用獨(dú)熱編碼
可能你會(huì)感覺(jué)奇怪,特征取值為[0, 1],還是離散的呀,何以解決數(shù)據(jù)的離散問(wèn)題?那么我們要回到本質(zhì)上來(lái)看,為什么我們不喜歡離散型數(shù)據(jù)?歸根結(jié)底,是因?yàn)闆](méi)辦法對(duì)此類特征進(jìn)行任何計(jì)算。(那你算幫我算算“李雷”和“韓梅梅”的距離有多遠(yuǎn)?)
而我們將用OneHotEncoder編碼后的特征當(dāng)成是向量,相當(dāng)于將特征擴(kuò)展到了歐式空間,那么某個(gè)取值就對(duì)應(yīng)著空間里的某個(gè)點(diǎn)。在機(jī)器學(xué)習(xí)算法中,特征之間往往要進(jìn)行相似性的計(jì)算,或者距離的計(jì)算,這些計(jì)算都是在歐式空間里完成的。實(shí)際上,大部分機(jī)器學(xué)習(xí)算法是基于向量空間中的度量來(lái)進(jìn)行計(jì)算的。所以,OneHotEncoder編碼滿足了我們對(duì)于計(jì)算的要求。(為了通俗一點(diǎn)就這么解釋啦)
4. 獨(dú)熱編碼的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
解決了分類器不好處理屬性數(shù)據(jù)的問(wèn)題,在一定程度上也起到了擴(kuò)充特征的作用。它的值只有0和1,不同的類型存儲(chǔ)在垂直的空間。 - 缺點(diǎn)
當(dāng)類別的數(shù)量很多時(shí),特征空間會(huì)變得非常大。在這種情況下,一般可以用PCA來(lái)減少維度。而且OneHotEncoder + PCA這種組合在實(shí)際中也非常有用。
5. 注意事項(xiàng)
上面也講到了,OneHotEncoder編碼的目的是擴(kuò)展到歐式空間,便于計(jì)算距離。但是對(duì)于某些算法,不需要計(jì)算特征的距離,特征是離散的也OK,那么我們就沒(méi)必要多此一舉。比如決策樹算法,以及以決策樹為基學(xué)習(xí)器的各類算法。