数字表示名义数据,同时保留数据语义



我有一个标称和数值特征的数据集。如果可能的话,我希望能够完全用数字表示这个数据集。

理想情况下,我可以为一个n元标称特征做这件事。我意识到,在二进制的情况下,可以用整数表示两个标称值。然而,当一个标称特征可以有很多排列时,如果可能的话,这怎么可能呢?

有许多技术可以将分类属性"嵌入"为数字。

例如,给定一个可以取值redgreenblue的分类变量,我们可以简单地将其编码为三个属性isRed={0,1}isGreen={0,1}isBlue={0,1}

虽然这很受欢迎,而且显然会"奏效",但许多人认为事后数字处理技术会产生合理的结果。

如果在以这种方式编码的数据集上运行例如k-means,那么之后的结果可能不会太有意义。特别是,如果得到isRed=.3 isGreen=.2 isBlue=.5这样的平均值,则无法合理地将其映射回原始数据。更糟糕的是,使用某些算法,您甚至可能得到isRed=0 isGreen=0 isBlue=0

我建议您尝试处理实际数据,并尽可能避免编码。如果您有一个好的工具,它将允许您使用混合数据类型不要试图把所有东西都变成一个数字向量。这种数据的数学视图非常有限,数据不会为您提供从这种视图中受益所需的所有数学假设(例如度量空间)。

不要这样做:我正在尝试将某些标称属性编码为整数。

除非一个标称特征只有两个排列。可以使用任何不同的整数(例如1和3)。

但是,如果有两个以上的排列,则不能使用整数。假设我们将1、2和3分配给三个排列。正如我们所看到的,由于差异,1-2和2-3之间的关系比1-3之间的关系更高。

相反,对每个标称属性的每个值使用单独的二进制特征。因此,你的问题的答案是:这是不可能的/明智的。

如果使用panda,则可以在标称值列上使用名为.get_dummies()的函数。这将把N唯一值的列变成N(或者,如果您想要N-1,则称为drop_first)新列,如果存在值,则用10指示。

示例:

s = pd.Series(list('abca'))
get_dummies(s)
   a  b  c
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0

最新更新