劉輝玲 陶 潔 邱 磊
(武漢船舶職業(yè)技術(shù)學(xué)院,湖北武漢 430050)
在數(shù)據(jù)處理過程中,諸多的類別型數(shù)據(jù)常采用文本數(shù)據(jù)的形式,除了決策樹等少量模型之外,其他模型如邏輯回歸、支持向量機(jī)等一般都無法直接使用,其處理方式是將文本數(shù)據(jù)轉(zhuǎn)換成數(shù)值數(shù)據(jù)。形如{"男","女"}、{"計(jì)算機(jī)系","數(shù)學(xué)系","物理系"……,"經(jīng)濟(jì)系","管理系"}等集合形式的類別值,在表征為數(shù)值數(shù)據(jù)時(shí),其常用方式采用標(biāo)簽編碼(Label encoding)方式,是按類別值在集合中的位置順序賦予相應(yīng)的值,一個(gè)含N個(gè)類別的集合,采用[0, N-1]區(qū)間內(nèi)連續(xù)整數(shù)予以編號(hào)。如0表示計(jì)算機(jī)系,1表示數(shù)學(xué)系,2表示物理系,依次類推。類別值數(shù)據(jù)經(jīng)過序號(hào)編碼之后,其本質(zhì)依然是非連續(xù)數(shù)據(jù)。若直接使用,較容易被當(dāng)作為連續(xù)數(shù)值型數(shù)據(jù)進(jìn)行處理,除非編碼得到的數(shù)據(jù)連續(xù)性有實(shí)際意義。 One-hot編碼是解決這個(gè)問題的有效方式之一, 對(duì)于類別值數(shù)據(jù)采用One-hot編碼作數(shù)據(jù)預(yù)處理之后,其在相似度或距離計(jì)算之間更為合理,對(duì)相關(guān)的機(jī)器模型適用性更好,可用度增強(qiáng)[1-2]。
對(duì)于有N種類別值的集合,One-hot編碼(獨(dú)熱編碼)采用長(zhǎng)度為N位的狀態(tài)寄存器來對(duì)每一個(gè)類別值進(jìn)行編碼,每個(gè)類別值對(duì)應(yīng)一個(gè)獨(dú)立的寄存器位,在任意時(shí)刻只有一個(gè)寄存器位為1,其余為0[3-4]。故One-hot編碼又稱一位有效編碼。以{"中","俄","美","英","法"}為例,其編碼如表1所示。
表1 One-hot編碼示例
這5種類別值的編碼分別是[1,0,0,0,0], [0,1,0,0,0], [0,0,0,1,0], [0,0,0,0,1], [0,0,1,0,0]。若類別值集合長(zhǎng)度為N,則每種類別值的One-hot編碼是一個(gè)長(zhǎng)度為N的向量。在任何情況下,每個(gè)向量中只有1個(gè)分量為1,其他分量為0,從而保證了唯一性。
對(duì)于{"中","俄","美","英","法"}的各類別值,若采用表2所示的標(biāo)簽編碼方式,在計(jì)算兩者之間的距離時(shí),其結(jié)果為 ("中","俄")=1, ("中","美")=2,("中","英")=3,("中","法")=4。上述結(jié)果表明,中和俄兩國(guó)之間的相似度是1,而中法兩國(guó)之間的相似度為4,而事實(shí)上作為類別取值的這些國(guó)家之間的相似度都同。故采用標(biāo)簽編碼來計(jì)算這兩者之間距離不大合理。
表2 標(biāo)簽編碼示例
在常見邏輯回歸模型[5]中,對(duì)于連續(xù)變量的而言,其可表示為式(1)。
(1)
其中,w為連續(xù)變量x的權(quán)值。
而采用One-hot編碼后,其邏輯回歸模型可以表示為式(2)。
(2)
其中,x1,x2,…,xn是使用One-hot編碼后的分量,w1,w2, …,wn是對(duì)應(yīng)分量的權(quán)值。
式(1)采用1個(gè)權(quán)值管理連續(xù)變量x,而式(2)采用了n個(gè)權(quán)值管理x采用One-hot編碼后的n個(gè)分量x1,x2,…,xn,使得類別值的管理更加精細(xì),可有效地加速權(quán)值參數(shù)迭代和更新,可有效地降低類別值對(duì)模型的穩(wěn)定性的影響,從而可有效地拓展邏輯回歸模型的非線性能力。
scikit-learn是用Python實(shí)現(xiàn)的機(jī)器學(xué)習(xí)算法庫,簡(jiǎn)記為sklearn,對(duì)One-hot編碼的實(shí)現(xiàn)提供了支持。實(shí)現(xiàn)One-hot編碼的過程可分為以下三個(gè)步驟。首先,One-hot編碼屬于變量預(yù)處理,在實(shí)現(xiàn)時(shí)需要import sklearn.preprocessing包。另外,還需導(dǎo)入numpy包完成一些相關(guān)處理。其次,對(duì)類別值進(jìn)行編號(hào)。該過程可使用LabelEncoder類的fit_transform()實(shí)現(xiàn),該方法的作用將離散型的數(shù)據(jù)轉(zhuǎn)換成0到n-1之間的數(shù),這里n是類別的所有不同取值的個(gè)數(shù)。最后,使用OneHotEncoder類提供的fit_transform()實(shí)現(xiàn)One-hot編碼。其將前一步轉(zhuǎn)換得到的每個(gè)整數(shù)值被表示為一個(gè)長(zhǎng)度為n的二進(jìn)制向量。這些二進(jìn)制向量互不相同,每個(gè)向量中只有1個(gè)分量為1,其它分量為0,這些分量互斥,每次只有一個(gè)激活。其代碼如圖1所示:
圖1 One-hot編碼的實(shí)現(xiàn)
從上例的結(jié)果中可以看出,'中'、'俄'、'美'、'英'和'法'對(duì)應(yīng)的標(biāo)簽編碼分別是0,1,3,4,2,其One-hot編碼向量為[1,0,0,0,0,],[0,1,0,0,0,],[0,0,0,1,0,],[0,0,0,0,1,]和[0,0,1,0,0,]。
對(duì)于來自多個(gè)類別集的多類別值的組合,例如["中國(guó)","兵乓球","女"]中的類別值分別來自{"中國(guó)","美國(guó)","巴西","加拿大"}、{"兵乓球","籃球","足球","冰球"}和{"男","女"}等三個(gè)類別集,其實(shí)現(xiàn)過程可分為以下四步。首先,依次采用LabelEncoder類的fit_transform()對(duì)每一類別值進(jìn)行編號(hào)。其次,類別值組合轉(zhuǎn)換為相應(yīng)的標(biāo)簽編碼的組合。第三、創(chuàng)建并初始化preprocessing.OneHotEncoder類的實(shí)例。在初始化時(shí),可指定每一個(gè)類別集中的類別總個(gè)數(shù)。最后,使用OneHotEncoder類提供的fit_transform()實(shí)現(xiàn)One-hot編碼。其實(shí)現(xiàn)代碼如圖2所示。
圖2 多值組合的One-hot編碼的實(shí)現(xiàn)
[0,0,0,1]對(duì)應(yīng)第一個(gè)分量的標(biāo)簽編碼3,緊跟的[0,0,1,0]對(duì)應(yīng)的第二個(gè)分量的標(biāo)簽編碼2,最后的兩個(gè)數(shù)[0,1,]對(duì)應(yīng)最后一個(gè)分量的標(biāo)簽編碼1。從上例的結(jié)果中可以看出,對(duì)于多類別值組合的One-hot編碼,其結(jié)果是由若干單個(gè)類別值的One-hot編碼組合而成。
在圖1所示的集合{"中","俄","美","英","法"}中的每個(gè)國(guó)家的One-hot編碼是一個(gè)5維向量,當(dāng)集合包含全球所有的N個(gè)國(guó)家時(shí),其One-hot編碼的維度也為N。其編碼結(jié)果異常稀疏,少量有用的1零散地分布在大量的0之中。從表1中可以看出,每一行的各分量之和為1,即"中","俄","美","英"和"法"之和為1,每個(gè)分量都可用其它分量進(jìn)行表示和預(yù)測(cè),產(chǎn)生了虛擬變量陷阱,此時(shí)可采用啞變量編碼或使用L2正則化手段予以約束。
在實(shí)際應(yīng)用中,需對(duì)類別的取值予以區(qū)分,區(qū)分該類別是屬于定序類型(ordinal feature)還是定類類型(categorical feature)。定類類型的取值沒有先后邏輯關(guān)系。諸如男,女等形式的取值,適合采用One-hot編碼。而對(duì)于定序類型的取值,諸如小學(xué)、初中和高中等形式的取值,在邏輯上存在一定的排序關(guān)系,適合采用標(biāo)簽編碼,標(biāo)簽編碼中的數(shù)字順序不破壞原有的邏輯關(guān)系。數(shù)據(jù)應(yīng)用所采用的模型也是數(shù)據(jù)編碼的依據(jù)。對(duì)數(shù)值大小敏感的模型,適合采用One-hot編碼。如邏輯回歸模型和支持向量機(jī)模型的損失函數(shù)對(duì)數(shù)值大小敏感,并且變量間的數(shù)值大小是有比較意義的。對(duì)數(shù)值大小不敏感的模型,如樹模型,不適合采用One-hot編碼。
One-hot編碼會(huì)增加數(shù)據(jù)的維度,尤其是當(dāng)類別取值很多時(shí),將大幅增加維度。此時(shí)可采用按類別特征的意義合并或類別的頻次合并,特征哈希、主成分分析(PCA)降維、低維嵌入等手段進(jìn)行預(yù)處理,從而增強(qiáng)One-hot編碼的應(yīng)用。