深度学习初学者指南
上QQ阅读APP看书,第一时间看更新

3.2.1 将字符串标签转换成数字

我们再次处理MNIST数据集,使用该数据集的字符串标签0,1,…,9,并将它们转换成数字。可以通过许多不同的方式来实现这一点:

·可以用一个简单的命令y=list(map(int,mnist.target))来将所有字符串映射到整数,然后就完成了。变量y现在只包含一个整数列表,如[8,7,1,2,...]。但是,这样做只能解决属于这种特殊情况的问题,需要学习适用于所有情况的方法。所以,我们不会这样做。

·也可以通过艰苦地迭代10次来完成这项工作,针对每个数字迭代一次,mnist.target=[0 if v=='0'else v for v in mnist.target]。但是同样,这(和其他类似的事情)也只对这一种情况有效。我们也不会这样做。

·还可以使用scikit-learn的LabelEncoder()方法。该方法可以接受任何标签列表并将它们映射到一个数字。这种方法对所有的情况都适用。

让我们按照下列步骤使用scikit方法:

1)运行下列代码:

输出结果如下:

sorted(list(set(mnist.target)))命令做了三件事:

·set(mnist.target)在数据中检索一组唯一的值,例如,{'8','2',…'9'}。

·list(set(mnist.target))只是将集合转换为列表,因为LabelEncoder()方法需要列表或数组。

·sorted(list(set(mnist.target)))在这里很重要,以便将0映射到0,而不是将8映射到0,以此类推。它对列表进行排序,结果如下:['0','1',…,'9']。

le.fit()方法接受一个列表(或数组),并生成一个映射(字典),以便可以在前向传播计算中使用(如果需要的话,也可以在反向传播计算中使用),将标签或字符串编码为数字,将它存储在一个名为LabelEncoder的对象中。

2)接下来,我们可以对上述编码进行如下测试:

输出结果如下:

transform()方法将基于字符串的标签转换为数字标签,而inverse_transform()方法接受数字标签并返回相应的字符串标签或类型属性。

任何试图映射到缺失类型或数字,或者对缺失类型或数字进行映射的尝试都将导致LabelEncoder对象产生错误。请竭尽所能地提供所有可能类型的名单,从而使得你的知识得到最好的表达。

3)一旦安装并测试了LabelEncoder对象,就可以简单地运行以下指令对数据进行编码:

输出结果如下:

新的编码标签现在保存在y中,可供使用。

这种将标签编码为整数的方法也称为序数编码

这种方法应该适用于所有编码为字符串的标签,对于这些标签,可以简单地将它们映射为数字形式,而且不会丢失上下文信息。对于MNIST数据集,可以映射0到0和7到7,而且不会丢失它们的上下文信息。其他可以这样做的例子包括:

·年龄段:['18-21','22-35','36+']到[0,1,2]

·性别:['male','female']到[0,1]

·颜色:['red','black','blue',…]到[0,1,2,…]

·学业:['primary','secondary','high school','university']到[0,1,2,3]

然而,我们在这里做一个很大的假设:标签本身并没有某些特殊的含义。如前所述,邮政编码可以简单地编码成更小的数字,然而,它们具有一定的地理含义,这样做就有可能会对我们的深度学习算法性能产生一些负面影响。同样地,对于前述列表中的数据,如果需要针对一些特殊的含义进行研究,例如要表明大学学位比中学学位具有更高的等级或者更加重要,那么我们也许应该考虑使用不同的数字映射。或者让我们的机器学习算法自己学习这些复杂的东西!在这种情况下,我们应该使用众所周知的独热编码策略。