我有一个标称和数字特征的数据集。如果可能的话,我希望能够完全用数字表示这个数据集。
理想情况下,我将能够为 n 元名义特征执行此操作。我意识到在二进制情况下,可以用整数表示两个标称值。然而,当一个名义特征可以有许多排列时,如果有的话,这怎么可能呢?
我有一个标称和数字特征的数据集。如果可能的话,我希望能够完全用数字表示这个数据集。
理想情况下,我将能够为 n 元名义特征执行此操作。我意识到在二进制情况下,可以用整数表示两个标称值。然而,当一个名义特征可以有许多排列时,如果有的话,这怎么可能呢?
有许多技术可以将分类属性“嵌入”为数字。
例如,给定一个可以取值和的分类变量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。
相反,对每个标称属性的每个值使用单独的二元特征。因此,您的问题的答案是:这是不可能的/明智的。
.get_dummies()
如果您使用 pandas,您可以使用在名义价值列上调用的函数。这会将N
唯一值列转换为N
(或者如果需要N-1
,称为)新列,用 a或 adrop_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