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

时间:2013-11-28 18:34:01

标签: machine-learning data-mining data-representation

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

理想情况下,我可以为n-ary标称功能执行此操作。我意识到在二进制的情况下,可以用整数表示两个名义值。但是,当名义特征可以有许多排列时,如果有的话,这怎么可能呢?

3 个答案:

答案 0 :(得分:2)

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

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

虽然这很受欢迎,并且显然会“起作用”,但很多人都认为随后的数字处理技术会产生合理的结果,这是谬论。

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

如果使用pandas,则可以在名义值列上使用名为.get_dummies()的函数。这会将N个唯一值的列转换为N(或者,如果您需要N-1,则称为drop_first)新列,指示1或如果存在值,则0

示例:

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