- 深度学习初学者指南
- (智)巴勃罗·里瓦斯
- 976字
- 2021-12-01 13:58:49
3.2.2 将分类转换成独热编码
在大多数情况下,将分类属性转换为独热编码会更好,因为分类或标签可能对彼此具有特殊的含义。在这种情况下,据报道独热编码的性能优于序数编码(Potdar,K.,et al.,2017)。
独热编码的思想在于将每个标签表示为具有独立列的布尔状态。例如,下面的一列数据:
可以使用独热编码方式将它们唯一地转换为以下新的数据形式:
如你所见,只有与标签相对应的特定行,其二元位才为hot(为1),其他的二元位均为零。还要注意,我们对列进行了重命名,以跟踪哪个标签对应哪个列,然而,这只是一个推荐的格式,并不是一个正式的规则。
在Python中有很多方法可以做到这一点。如果你的数据在pandas DataFrame中,那么可以简单地执行pd.get_dummies(df,prefix=['Gender']),假设你的列在df中,想使用Gender作为前缀。
要重现前述列表的准确结果,可以遵循以下步骤:
1)运行下列命令:
输出结果如下:
2)现在只需运行下列命令进行编码:
输出结果如下:
这种编码的一个有趣且可能很明显的特性是,对所有已编码列的行上的OR和XOR操作将得到分量恒为1的向量,使用AND操作将生成分量恒为0的向量。
对于数据不是pandas DataFrame的情形,例如,MNIST目标数据,可以使用scikit-learn的OneHotEncoder.transform()方法。
OneHotEncoder对象有一个构造函数,它会根据合理的假设自动初始化所有的东西,并使用fit()方法确定大部分参数。它可以确定数据的大小和数据中存在的不同标签,然后创建一个可以与transform()方法一起使用的动态映射。
要对MNIST目标数据进行独热编码,可以这样做:
输出结果如下:
这段代码包括了经典的完整性检查。在该检查中,我们验证标签'5'实际上已经转换为一个具有10列的行向量,其中第6列是hot的。它像预期的那样有效。y的新维数是n行10列。
这是在MNIST数据集上使用深度学习方法的目标数据首选格式。对于每个类别只有一个神经元的神经网络来说,使用独热编码方法表示目标数据是比较好的。在这个例子中,每个数字都对应一个神经元。每个神经元都需要学会预测“独热编码”的行为,也就是说,只有一个神经元应该被激活("hot"),而其他的神经元都应该被抑制。
可以重复上述过程,将任何其他列转换为独热编码,前提是它们要包含类别数据。
当我们希望将输入数据分类为这些类别、标签或映射时,将类别、标签变换到整数或位的特定映射就非常有用。但是,如果想要将输入数据映射到连续数据,那该怎么办呢?例如,通过观察一个人的反应来预测其智商,或者根据有关天气和季节的输入数据来预测电价。这就是所谓的回归数据,将在下一节中对此进行讨论。