在前面小节中,我们曾使用字典映射的方法将有序的尺寸特征转换为整数。由于scikit-learn的预估器将类标作为无序数据进行处理,可以使用scikit-learn中的LabelEncoder类将字符串类标转换为整数。同样,也可以用此方法处理数据集中标称数据格式的color列,代码如下:
执行上述代码,NumPy数组X的第一列现在被赋予新的color值,具体编码结果如下:
·blue→0
·green→1
·red→2
如果我们就此打住,直接将得到的数组导入分类器,那么就会犯处理类别数据时最常见的错误。读者发现问题所在了吗?虽然颜色的值并没有特定的顺序,但是学习算法将假定green大于blue、red大于green。虽然算法的这一假定不太合理,但最终还是能够生成有用的结果。然而,这个结果可能不是最优的。
解决此问题最常用的方法就是独热编码(one-hot encoding)技术。这种方法的理念就是创建一个新的虚拟特征(dummy feature),虚拟特征的每一列各代表标称数据的一个值。在此,我们将color特征转换为三个新的特征:blue、green以及red。此时可以使用二进制值来标识样本的颜色。例如,蓝色样本可以标识为:blue=1,green=0,以及red=0。此编码转换操作可以使用scikit-learn.proprocessing模块中的OneHotEncoder来实现:
当我们初始化OneHotEncoder对象时,需要通过categorical_features参数来选定我们要转换的特征所在的位置(如color是特征矩阵X的第1列)。默认情况下,当我们调用OneHotEncoder的transform方法时,它会返回一个稀疏矩阵。出于可视化的考虑,我们可以通过toarray方法将其转换为一个常规的NumPy数组。稀疏矩阵是存储大型数据集的一个有效方法,被许多scikit-learn函数所支持,特别是在数据包含很多零值时非常有用。为了略过toarry的使用步骤,我们也可以通过在初始化阶段使用OneHotEncoder(…,sparse=False)来返回一个常规的Numpy数组。
另外,我们可以通过pandas中的get_dummies方法,更加方便地实现独热编码技术中的虚拟特征。当应用于DataFrame数据时,get_dummies方法只对字符串列进行转换,而其他的列保持不变。