刘辉玲 陶 洁 邱 磊
(武汉船舶职业技术学院,湖北武汉 430050)
在数据处理过程中,诸多的类别型数据常采用文本数据的形式,除了决策树等少量模型之外,其他模型如逻辑回归、支持向量机等一般都无法直接使用,其处理方式是将文本数据转换成数值数据。形如{"男","女"}、{"计算机系","数学系","物理系"……,"经济系","管理系"}等集合形式的类别值,在表征为数值数据时,其常用方式采用标签编码(Label encoding)方式,是按类别值在集合中的位置顺序赋予相应的值,一个含N个类别的集合,采用[0, N-1]区间内连续整数予以编号。如0表示计算机系,1表示数学系,2表示物理系,依次类推。类别值数据经过序号编码之后,其本质依然是非连续数据。若直接使用,较容易被当作为连续数值型数据进行处理,除非编码得到的数据连续性有实际意义。 One-hot编码是解决这个问题的有效方式之一, 对于类别值数据采用One-hot编码作数据预处理之后,其在相似度或距离计算之间更为合理,对相关的机器模型适用性更好,可用度增强[1-2]。
对于有N种类别值的集合,One-hot编码(独热编码)采用长度为N位的状态寄存器来对每一个类别值进行编码,每个类别值对应一个独立的寄存器位,在任意时刻只有一个寄存器位为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]。若类别值集合长度为N,则每种类别值的One-hot编码是一个长度为N的向量。在任何情况下,每个向量中只有1个分量为1,其他分量为0,从而保证了唯一性。
对于{"中","俄","美","英","法"}的各类别值,若采用表2所示的标签编码方式,在计算两者之间的距离时,其结果为 ("中","俄")=1, ("中","美")=2,("中","英")=3,("中","法")=4。上述结果表明,中和俄两国之间的相似度是1,而中法两国之间的相似度为4,而事实上作为类别取值的这些国家之间的相似度都同。故采用标签编码来计算这两者之间距离不大合理。
表2 标签编码示例
在常见逻辑回归模型[5]中,对于连续变量的而言,其可表示为式(1)。
(1)
其中,w为连续变量x的权值。
而采用One-hot编码后,其逻辑回归模型可以表示为式(2)。
(2)
其中,x1,x2,…,xn是使用One-hot编码后的分量,w1,w2, …,wn是对应分量的权值。
式(1)采用1个权值管理连续变量x,而式(2)采用了n个权值管理x采用One-hot编码后的n个分量x1,x2,…,xn,使得类别值的管理更加精细,可有效地加速权值参数迭代和更新,可有效地降低类别值对模型的稳定性的影响,从而可有效地拓展逻辑回归模型的非线性能力。
scikit-learn是用Python实现的机器学习算法库,简记为sklearn,对One-hot编码的实现提供了支持。实现One-hot编码的过程可分为以下三个步骤。首先,One-hot编码属于变量预处理,在实现时需要import sklearn.preprocessing包。另外,还需导入numpy包完成一些相关处理。其次,对类别值进行编号。该过程可使用LabelEncoder类的fit_transform()实现,该方法的作用将离散型的数据转换成0到n-1之间的数,这里n是类别的所有不同取值的个数。最后,使用OneHotEncoder类提供的fit_transform()实现One-hot编码。其将前一步转换得到的每个整数值被表示为一个长度为n的二进制向量。这些二进制向量互不相同,每个向量中只有1个分量为1,其它分量为0,这些分量互斥,每次只有一个激活。其代码如图1所示:
图1 One-hot编码的实现
从上例的结果中可以看出,'中'、'俄'、'美'、'英'和'法'对应的标签编码分别是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,]。
对于来自多个类别集的多类别值的组合,例如["中国","兵乓球","女"]中的类别值分别来自{"中国","美国","巴西","加拿大"}、{"兵乓球","篮球","足球","冰球"}和{"男","女"}等三个类别集,其实现过程可分为以下四步。首先,依次采用LabelEncoder类的fit_transform()对每一类别值进行编号。其次,类别值组合转换为相应的标签编码的组合。第三、创建并初始化preprocessing.OneHotEncoder类的实例。在初始化时,可指定每一个类别集中的类别总个数。最后,使用OneHotEncoder类提供的fit_transform()实现One-hot编码。其实现代码如图2所示。
图2 多值组合的One-hot编码的实现
[0,0,0,1]对应第一个分量的标签编码3,紧跟的[0,0,1,0]对应的第二个分量的标签编码2,最后的两个数[0,1,]对应最后一个分量的标签编码1。从上例的结果中可以看出,对于多类别值组合的One-hot编码,其结果是由若干单个类别值的One-hot编码组合而成。
在图1所示的集合{"中","俄","美","英","法"}中的每个国家的One-hot编码是一个5维向量,当集合包含全球所有的N个国家时,其One-hot编码的维度也为N。其编码结果异常稀疏,少量有用的1零散地分布在大量的0之中。从表1中可以看出,每一行的各分量之和为1,即"中","俄","美","英"和"法"之和为1,每个分量都可用其它分量进行表示和预测,产生了虚拟变量陷阱,此时可采用哑变量编码或使用L2正则化手段予以约束。
在实际应用中,需对类别的取值予以区分,区分该类别是属于定序类型(ordinal feature)还是定类类型(categorical feature)。定类类型的取值没有先后逻辑关系。诸如男,女等形式的取值,适合采用One-hot编码。而对于定序类型的取值,诸如小学、初中和高中等形式的取值,在逻辑上存在一定的排序关系,适合采用标签编码,标签编码中的数字顺序不破坏原有的逻辑关系。数据应用所采用的模型也是数据编码的依据。对数值大小敏感的模型,适合采用One-hot编码。如逻辑回归模型和支持向量机模型的损失函数对数值大小敏感,并且变量间的数值大小是有比较意义的。对数值大小不敏感的模型,如树模型,不适合采用One-hot编码。
One-hot编码会增加数据的维度,尤其是当类别取值很多时,将大幅增加维度。此时可采用按类别特征的意义合并或类别的频次合并,特征哈希、主成分分析(PCA)降维、低维嵌入等手段进行预处理,从而增强One-hot编码的应用。