![大数据分析与应用实战:统计机器学习之数据导向编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/44509943/b_44509943.jpg)
1.4.3 Python语言类别变量编码
1.3.6节R语言因子曾提及数据创建或导入Python后,在建模前通常须先进行类别变量编码,以下举例说明。首先通过原生数据结构嵌套列表(nested lists)建构pandas数据集df:
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P82_19900.jpg?sign=1739624843-r7JRJXgZeeA2cTPEc0J0v7ozGLSdDF8e-0-e4c14d43c09bd9a9522a02acbf7e73ba)
接着定义好数据集字段size三个类别值(或称水平)与整数值的对应关系字典size_mapping,再取出pandas一维序列对象df['size'],将编码规则字典传入序列的map()方法,更新df['size']后完成标签编码的工作。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P82_19902.jpg?sign=1739624843-GfUxpa9BGFMxkczbXnkuKDsaaTzygRuT-0-048de57ccaeb1a77ee1f5cc7ae20e9a2)
以上是手工类别变量标签编码的步骤,Python套件scikit-learn中的LabelEncoder类别也可方便地达成相同的目的。加载类别并创建LabelEncoder类别对象后,fit_transform()方法是循序调用fit()与transform()方法,对df['classlabel']进行拟合与转换(参见1.6.2节Python语言面向对象)。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P83_20093.jpg?sign=1739624843-TT1KuuGjkBuDZUg9oxRNtI58pxijwFFQ-0-20b5e289fc42921e454a701898e90da1)
LabelEncoder类别对象class_le还有inverse_transform()方法可将编码后的结果逆转换回原类别变量,此时传入逆转换方法的对象必须是一维的,而非二维的y.reshape(-1,1)。读者请注意numpy的ndarray对象,其reshape()方法的第一个参数值设为-1的含义是:根据给定的第二个参数值1,自动推断数据变形后的第一维长度。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P83_20094.jpg?sign=1739624843-WRMcC46InaEzWiCR5DF40hslkUhoShrQ-0-3be162b62446c7884e9c82f07bea3eb4)
OneHotEncoder是scikit-learn套件的单热编码类别,不过进行单热编码前,须先将数据表中所有类别变量都完成标签编码,不能有任何字段是object类别。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P84_20095.jpg?sign=1739624843-uXdmsFdDf77qxnQG2KzWexKXopLI2T1w-0-36974c6fdea46f24f841674290d29d99)
加载单热编码类别后,指定欲编码的类别属性为第一个([0])属性color,传入X拟合与转换后,所得为默认的稀疏矩阵(sparse matrix)格式,这是因为单热编码矩阵中0的个数经常多于1的个数,因此需要用toarray()方法转换为常规矩阵。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P84_19903.jpg?sign=1739624843-Z2v6aStcMzZcFTU8GW1znAPIjigFZ7GH-0-525b3d1b1e400f9384c90b7759748aac)
pandas套件的get_dummies()方法可能是最方便的单热编码方式,get_dummies()应用在DataFrame对象,仅将字符串字段进行虚拟编码,其他字段维持不变。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P85_19905.jpg?sign=1739624843-jATHY7iwaIj7WIVimESRhkXsGnrIu9HW-0-8c446a5cf4edbb5bc91d9ee1ace9fcf2)