原文地址:http://www.kdnuggets.com/2015/12/beyond-one-hot-exploration-categorical-variables.html
通過給機(jī)器學(xué)習(xí)算法的每一個類別分配一個整數(shù)豌汇,將類別變量編碼為數(shù)值變量悴了。在這里馁龟,我們探索轉(zhuǎn)換類別變量的不同方式及其對多維數(shù)據(jù)的影響。
在機(jī)器學(xué)習(xí)中怠蹂,數(shù)據(jù)是國王。用來預(yù)測數(shù)據(jù)對算法和模型很重要,也很有趣侠鳄,但是機(jī)器學(xué)習(xí)仍然秉承著“garbage-in-garbage-out”乎莉∷徒玻考慮到這一點,讓我們看一小部分輸入數(shù)據(jù):類別變量惋啃。
類別變量是表示固定數(shù)量的可能性的變量哼鬓,而不是連續(xù)數(shù)字的變量。每個值代表那些有限組或類別的一個衡量標(biāo)準(zhǔn)边灭。它們不同于有序變量的地方在于不論類別有多少异希,從一個類別到另一個類別的距離始終是相等的,而有序變量則存在某種排序規(guī)則绒瘦。例如:
1. 有序變量:低称簿,中,高
2.類別變量:喬治亞惰帽,南卡羅來納憨降,……,紐約
我們后續(xù)使用的機(jī)器學(xué)習(xí)算法往往更傾向于使用數(shù)字作輸入该酗,而非字符串授药,因此我們需要編寫一些方法進(jìn)行轉(zhuǎn)換。
快速感知:本文反復(fù)出現(xiàn)的一個概念就是維度的概念垂涯。簡單來說烁焙,就是數(shù)據(jù)表中的列數(shù),但是它在最終模型中具有顯著的下游效應(yīng)耕赘。在極端情況下骄蝇,“維度的詛咒(curse of dimensionality)”概念認(rèn)為在高緯空間內(nèi)事物會停止正常工作。即使在相對低緯的問題中操骡,具有更多維度的數(shù)據(jù)集需要更多的參數(shù)供模型理解九火,這意味著需要更多數(shù)據(jù)才能學(xué)好這些參數(shù)。如果數(shù)據(jù)量固定册招,則只添加額外的維度而不增加數(shù)據(jù)量會對最終模型的精度造成不利影響岔激。
回到手頭的問題:我們想將類別別量編碼成數(shù)字變量,但是我們關(guān)心維度的問題是掰。最容易想到的答案就是給每個類別分配一個整數(shù)(假設(shè)我們知道所有可能的類別)虑鼎。這稱為順序編碼。它不會為問題增加維度,但是無形中增加了變量可能原本不存在的順序炫彩。
方法
為了進(jìn)行好壞評估匾七,我寫了一個用不同方法測試同一數(shù)據(jù)集的python腳本。首先概述整個過程:
(1)先收集一個有類別變量的分類問題的數(shù)據(jù)集
(2)使用一些編碼方法將X數(shù)據(jù)集轉(zhuǎn)換為數(shù)值
(3)用scikit-learn的交叉驗證分?jǐn)?shù)和BernouliNB()分類器生成數(shù)據(jù)集的分?jǐn)?shù)(譯者注:一種評估方式)江兢。每個數(shù)據(jù)集重復(fù)10x次昨忆,并使用所有分?jǐn)?shù)的平均集
(4)存儲數(shù)據(jù)集的維度,平均分?jǐn)?shù)和編碼時間杉允,然后生成分?jǐn)?shù)
對UCI數(shù)據(jù)庫的一些數(shù)據(jù)集邑贴,都重復(fù)以上過程。使用的數(shù)據(jù)集如下:
(2)Mushrooms
我嘗試了七種不同的編碼方式(4-7的描述來自statsmodel的文檔):
(1)Ordinal(序列化):如上所述叔磷。
(2)One-Hot:每個類別有一列拢驾,根據(jù)某條數(shù)據(jù)時候包含這一類別用1或0填充。
(3)Binary(二進(jìn)制):首先需要序列化類別世澜,然后將整數(shù)轉(zhuǎn)化為二進(jìn)制編碼独旷,再將二進(jìn)制字符串的數(shù)字拆分成單獨的列。這較one-hot而言使用更小的維度進(jìn)行編碼寥裂,但是有一些距離失真。
(4)Sum:比較給定級別的相關(guān)變量的平均值與所有級別上的相關(guān)變量的總平均值案疲。也就是說封恰,從第一個k-1級別比到k級別,在本例中褐啡,級別1與所有其他級別比較诺舔,級別2與所有其他級別比較,級別3與所有其他級別比較备畦。
(5)Polynomial:在類別變量中低飒,k=4級別多項式的系數(shù)的趨勢是線性、二次或三次的懂盐。這里的類別變量假設(shè)由基本的等間距的數(shù)字變量表示褥赊。因此,這種類型的編碼僅用于等間距的有序分類變量莉恼。
(6)Backward Difference:將一個級別變量的平均數(shù)與上一個級別相比較拌喉。這種類型的編碼適用于標(biāo)稱型變量或有序變量。
(7)Helmert:將一個級別變量的平均數(shù)與前面所有級別的平均數(shù)相比較俐银。因此尿背,“reverse”這一名稱用于對forward Helmert編碼加以區(qū)分。
結(jié)果
結(jié)論
這不是一個詳盡的研究捶惜,但是似乎二進(jìn)制編碼執(zhí)行更好些田藐,沒有明顯的維度增加。如預(yù)期的一樣,有序化執(zhí)行不理想汽久。
如想查看源代碼鹤竭,添加或建議新數(shù)據(jù)集或編碼方式,請見github回窘,歡迎貢獻(xiàn)诺擅、評論與建議。