
1.4.3 Python语言类别变量编码
1.3.6节R语言因子曾提及数据创建或导入Python后,在建模前通常须先进行类别变量编码,以下举例说明。首先通过原生数据结构嵌套列表(nested lists)建构pandas数据集df:

接着定义好数据集字段size三个类别值(或称水平)与整数值的对应关系字典size_mapping,再取出pandas一维序列对象df['size'],将编码规则字典传入序列的map()方法,更新df['size']后完成标签编码的工作。

以上是手工类别变量标签编码的步骤,Python套件scikit-learn中的LabelEncoder类别也可方便地达成相同的目的。加载类别并创建LabelEncoder类别对象后,fit_transform()方法是循序调用fit()与transform()方法,对df['classlabel']进行拟合与转换(参见1.6.2节Python语言面向对象)。

LabelEncoder类别对象class_le还有inverse_transform()方法可将编码后的结果逆转换回原类别变量,此时传入逆转换方法的对象必须是一维的,而非二维的y.reshape(-1,1)。读者请注意numpy的ndarray对象,其reshape()方法的第一个参数值设为-1的含义是:根据给定的第二个参数值1,自动推断数据变形后的第一维长度。

OneHotEncoder是scikit-learn套件的单热编码类别,不过进行单热编码前,须先将数据表中所有类别变量都完成标签编码,不能有任何字段是object类别。

加载单热编码类别后,指定欲编码的类别属性为第一个([0])属性color,传入X拟合与转换后,所得为默认的稀疏矩阵(sparse matrix)格式,这是因为单热编码矩阵中0的个数经常多于1的个数,因此需要用toarray()方法转换为常规矩阵。

pandas套件的get_dummies()方法可能是最方便的单热编码方式,get_dummies()应用在DataFrame对象,仅将字符串字段进行虚拟编码,其他字段维持不变。
