【发布时间】:2013-12-14 21:17:11
【问题描述】:
我有一个名义特征和数字特征的数据集。如果可能的话,我希望能够完全用数字来表示这个数据集。
理想情况下,我可以为 n 元名义特征执行此操作。我意识到在二进制情况下,可以用整数表示两个标称值。然而,当一个名义特征可以有许多排列时,如果有的话,这怎么可能呢?
【问题讨论】:
标签: machine-learning data-mining data-representation
我有一个名义特征和数字特征的数据集。如果可能的话,我希望能够完全用数字来表示这个数据集。
理想情况下,我可以为 n 元名义特征执行此操作。我意识到在二进制情况下,可以用整数表示两个标称值。然而,当一个名义特征可以有许多排列时,如果有的话,这怎么可能呢?
【问题讨论】:
标签: machine-learning data-mining data-representation
有许多技术可以将分类属性“嵌入”为数字。
例如,给定一个可以取值 red、green 和 blue 的分类变量,我们可以简单地将其编码为 三个 属性 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。
相反,为每个标称属性的每个值使用单独的二元特征。因此,您的问题的答案是:这是不可能/明智的。
【讨论】:
如果您使用 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
【讨论】: