- 大数据分析与应用实战:统计机器学习之数据导向编程
- 邹庆士编著
- 570字
- 2022-07-28 20:15:39
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=1739405794-JnZwJN2lRqlOleIbwFB4tjCzN8ECDVak-0-d17f3a7545b738aedbfb9430a9d2fe33)
接着定义好数据集字段size三个类别值(或称水平)与整数值的对应关系字典size_mapping,再取出pandas一维序列对象df['size'],将编码规则字典传入序列的map()方法,更新df['size']后完成标签编码的工作。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P82_19902.jpg?sign=1739405794-KrVRiiXCbRD2mJQIfK48MgGQ3UP5oHeg-0-a11cc12ec172506c29feb23368a87f7c)
以上是手工类别变量标签编码的步骤,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=1739405794-GlrubgUxY56ShEqbrIfrWLrNgBqHpZWS-0-6ea7bfb7bdec95d6a8d92a86d261cf7f)
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=1739405794-J1nWAdG4HCR0PkoObUk6PTDa3OO2IUNH-0-42eb8b470bf424ffe863bd1309981662)
OneHotEncoder是scikit-learn套件的单热编码类别,不过进行单热编码前,须先将数据表中所有类别变量都完成标签编码,不能有任何字段是object类别。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P84_20095.jpg?sign=1739405794-6aB5S99uS54zqflEF4Q5d7L1OKx0acca-0-85995129814e6b75c2aee2faf23f9b27)
加载单热编码类别后,指定欲编码的类别属性为第一个([0])属性color,传入X拟合与转换后,所得为默认的稀疏矩阵(sparse matrix)格式,这是因为单热编码矩阵中0的个数经常多于1的个数,因此需要用toarray()方法转换为常规矩阵。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P84_19903.jpg?sign=1739405794-KnHNNVo28d5w4LkNdCzk5aYjEXIKrZ0t-0-d7463913db457c1c579e7a9fe487526b)
pandas套件的get_dummies()方法可能是最方便的单热编码方式,get_dummies()应用在DataFrame对象,仅将字符串字段进行虚拟编码,其他字段维持不变。
![](https://epubservercos.yuewen.com/027AFF/23721555909466506/epubprivate/OEBPS/Images/Figure-P85_19905.jpg?sign=1739405794-xaWqBczx9k2ORrbhGUsnQSlSOZFAEHl3-0-c9966811b3fbdddb3bf5ea35469bb4a7)