原文地址:http://www.kdnuggets.com/2015/12/beyond-one-hot-exploration-categorical-variables.html
通過(guò)給機(jī)器學(xué)習(xí)算法的每一個(gè)類(lèi)別分配一個(gè)整數(shù),將類(lèi)別變量編碼為數(shù)值變量。在這里,我們探索轉(zhuǎn)換類(lèi)別變量的不同方式及其對(duì)多維數(shù)據(jù)的影響。
在機(jī)器學(xué)習(xí)中,數(shù)據(jù)是國(guó)王。用來(lái)預(yù)測(cè)數(shù)據(jù)對(duì)算法和模型很重要,也很有趣,但是機(jī)器學(xué)習(xí)仍然秉承著“garbage-in-garbage-out”。考慮到這一點(diǎn),讓我們看一小部分輸入數(shù)據(jù):類(lèi)別變量。
類(lèi)別變量是表示固定數(shù)量的可能性的變量,而不是連續(xù)數(shù)字的變量。每個(gè)值代表那些有限組或類(lèi)別的一個(gè)衡量標(biāo)準(zhǔn)。它們不同于有序變量的地方在于不論類(lèi)別有多少,從一個(gè)類(lèi)別到另一個(gè)類(lèi)別的距離始終是相等的,而有序變量則存在某種排序規(guī)則。例如:
1. 有序變量:低,中,高
2.類(lèi)別變量:?jiǎn)讨蝸啠峡_來(lái)納,……,紐約
我們后續(xù)使用的機(jī)器學(xué)習(xí)算法往往更傾向于使用數(shù)字作輸入,而非字符串,因此我們需要編寫(xiě)一些方法進(jìn)行轉(zhuǎn)換。
快速感知:本文反復(fù)出現(xiàn)的一個(gè)概念就是維度的概念。簡(jiǎn)單來(lái)說(shuō),就是數(shù)據(jù)表中的列數(shù),但是它在最終模型中具有顯著的下游效應(yīng)。在極端情況下,“維度的詛咒(curse of dimensionality)”概念認(rèn)為在高緯空間內(nèi)事物會(huì)停止正常工作。即使在相對(duì)低緯的問(wèn)題中,具有更多維度的數(shù)據(jù)集需要更多的參數(shù)供模型理解,這意味著需要更多數(shù)據(jù)才能學(xué)好這些參數(shù)。如果數(shù)據(jù)量固定,則只添加額外的維度而不增加數(shù)據(jù)量會(huì)對(duì)最終模型的精度造成不利影響。
回到手頭的問(wèn)題:我們想將類(lèi)別別量編碼成數(shù)字變量,但是我們關(guān)心維度的問(wèn)題。最容易想到的答案就是給每個(gè)類(lèi)別分配一個(gè)整數(shù)(假設(shè)我們知道所有可能的類(lèi)別)。這稱(chēng)為順序編碼。它不會(huì)為問(wèn)題增加維度,但是無(wú)形中增加了變量可能原本不存在的順序。
方法
為了進(jìn)行好壞評(píng)估,我寫(xiě)了一個(gè)用不同方法測(cè)試同一數(shù)據(jù)集的python腳本。首先概述整個(gè)過(guò)程:
(1)先收集一個(gè)有類(lèi)別變量的分類(lèi)問(wèn)題的數(shù)據(jù)集
(2)使用一些編碼方法將X數(shù)據(jù)集轉(zhuǎn)換為數(shù)值
(3)用scikit-learn的交叉驗(yàn)證分?jǐn)?shù)和BernouliNB()分類(lèi)器生成數(shù)據(jù)集的分?jǐn)?shù)(譯者注:一種評(píng)估方式)。每個(gè)數(shù)據(jù)集重復(fù)10x次,并使用所有分?jǐn)?shù)的平均集
(4)存儲(chǔ)數(shù)據(jù)集的維度,平均分?jǐn)?shù)和編碼時(shí)間,然后生成分?jǐn)?shù)
對(duì)UCI數(shù)據(jù)庫(kù)的一些數(shù)據(jù)集,都重復(fù)以上過(guò)程。使用的數(shù)據(jù)集如下:
(2)Mushrooms
我嘗試了七種不同的編碼方式(4-7的描述來(lái)自statsmodel的文檔):
(1)Ordinal(序列化):如上所述。
(2)One-Hot:每個(gè)類(lèi)別有一列,根據(jù)某條數(shù)據(jù)時(shí)候包含這一類(lèi)別用1或0填充。
(3)Binary(二進(jìn)制):首先需要序列化類(lèi)別,然后將整數(shù)轉(zhuǎn)化為二進(jìn)制編碼,再將二進(jìn)制字符串的數(shù)字拆分成單獨(dú)的列。這較one-hot而言使用更小的維度進(jìn)行編碼,但是有一些距離失真。
(4)Sum:比較給定級(jí)別的相關(guān)變量的平均值與所有級(jí)別上的相關(guān)變量的總平均值。也就是說(shuō),從第一個(gè)k-1級(jí)別比到k級(jí)別,在本例中,級(jí)別1與所有其他級(jí)別比較,級(jí)別2與所有其他級(jí)別比較,級(jí)別3與所有其他級(jí)別比較。
(5)Polynomial:在類(lèi)別變量中,k=4級(jí)別多項(xiàng)式的系數(shù)的趨勢(shì)是線性、二次或三次的。這里的類(lèi)別變量假設(shè)由基本的等間距的數(shù)字變量表示。因此,這種類(lèi)型的編碼僅用于等間距的有序分類(lèi)變量。
(6)Backward Difference:將一個(gè)級(jí)別變量的平均數(shù)與上一個(gè)級(jí)別相比較。這種類(lèi)型的編碼適用于標(biāo)稱(chēng)型變量或有序變量。
(7)Helmert:將一個(gè)級(jí)別變量的平均數(shù)與前面所有級(jí)別的平均數(shù)相比較。因此,“reverse”這一名稱(chēng)用于對(duì)forward Helmert編碼加以區(qū)分。
結(jié)果

結(jié)論
這不是一個(gè)詳盡的研究,但是似乎二進(jìn)制編碼執(zhí)行更好些,沒(méi)有明顯的維度增加。如預(yù)期的一樣,有序化執(zhí)行不理想。
如想查看源代碼,添加或建議新數(shù)據(jù)集或編碼方式,請(qǐng)見(jiàn)github,歡迎貢獻(xiàn)、評(píng)論與建議。