为什么我们需要对分类变量进行虚拟编码?

机器算法验证 分类数据 分类编码
2022-01-27 10:05:50

我不确定为什么我们需要对分类变量进行虚拟编码。例如,如果我有一个具有四个可能值 0、1、2、3 的分类变量,我可以将其替换为二维:如果变量的值为 0,则它在二维中将具有 0、0;如果它有 3,它将在二维中具有 1、1;等等。

我不确定为什么我们需要这样做?

4个回答

假设您的四个类别是眼睛颜色(代码):棕色(1)、蓝色(2)、绿色(3)、淡褐色(4)——暂时忽略异色、紫罗兰色、红色、灰色等。

绝不(我目前可以想象的)我们的意思是绿色=3×棕色,或者那个榛子=2×正如我们的代码所暗示的那样,蓝色,即使3=3×14=2×2.

因此(除非我们出于某种原因确实希望将这种含义纳入我们的分析),我们需要使用某种编码。虚拟编码就是一个例子,它从我们想要讲述的关于眼睛颜色的统计故事中消除了这种关系。效果编码和赫克曼编码是其他示例。

更新:您对四个类别的两个变量的示例与我对通常需要替换的术语“虚拟代码”的理解不符k类别(比如4)k1虚拟变量(按类别分类观察):

id  category  dummy1 dummy2 dummy3
 1         1       1      0      0
 2         1       1      0      0
 3         2       0      1      0
 4         2       0      1      0
 5         3       0      0      1
 6         3       0      0      1
 7         4       0      0      0
 8         4       0      0      0

这里的类别4是参考类别,假设你的模型中有一个常数,例如:

y=β0+β1d1+β2d2+β3d3+ε

在哪里β0是平均值y当类别 = 4,并且β与每个假人相关的术语表示数量y从变化β0对于那个类别。

如果你没有常数 (β0) 模型中的术语,那么您需要一个更多的“虚拟”预测变量(也许不太经常称为“指标变量”),实际上虚拟然后每个都表现为每个类别的模型常数:

y=β1d1+β2d2+β3d3+β4d4+ε

因此,这将解决我首先提到的类别代码之间创建无意义的定量关系的问题,但是为什么不按照您的建议使用user12331-coding呢?user12331-编码候选A:

id  category   code1  code2
 1         1       0      ?
 2         1       0      ?
 3         2       1      ?
 4         2       1      ?
 5         3       ?      0
 6         3       ?      0
 7         4       ?      1
 8         4       ?      1

您非常正确地指出,一个可以使用 2 个二进制变量(即两位)来表示 4 个值。不幸的是,一种解决方法(code1 用于类别 1 和 2,code2 用于类别 3 和 4)留下问号表示的歧义:那里会有什么值?!

那么,第二种方法呢,称之为 user12331-coding 候选 B:

id  category   code1  code2
 1         1       0      0
 2         1       0      0
 3         2       0      1
 4         2       0      1
 5         3       1      0
 6         3       1      0
 7         4       1      1
 8         4       1      1

那里!没有歧义,对吧?对!不幸的是,这种编码所做的只是用二进制表示法表示数字量 1-4(或 0-3),这使得将那些不希望的数量关系赋予类别的问题完好无损。

因此,需要另一种编码方案。

我将警告说,各种编码方案或多或少是一个问题或风格(即,一个人想要一个特定的β意思是) 除非还包括与模型中的类别的交互项。然后虚拟编码会引起人为的异方差性并偏向标准误差,因此在这种情况下您会想要坚持使用效果编码(在这种情况下可能有其他编码系统可以保证安全,但我不熟悉它们)。

我对这个问题的看法是,在某些机器学习算法中,仅使用两个变量对四种可能的状态进行编码比使用 4 个变量更具表现力。

例如,假设您要进行线性回归,并且您的真实映射将值 0,1 和 2 映射到 0,将值 3 映射到 1。您可以快速检查在编码时无法使用线性回归学习此映射您的分类变量只有两个二进制变量(只需尝试将相应的平面放在您的脑海中)。另一方面,当您使用 1-Of-K 编码时,这将不是问题。

如果要将示例编码为:

颜色 类别 二进制1 二进制2
0 0 0
蓝色的 1 0 1
绿 2 1 0
棕色的 3 1 1

如果您的问题是我们为什么要使用编码,让我们考虑上面的示例,如果根据@Alexis 的建议您有 4 种眼睛颜色类别,我们需要将这些类别转换为数字,因为计算机可以更好地处理数字。所以本质上我们将这四个颜色类别转换为各自的整数类别,如上所示。现在,如果您要将这些整数原样提供给计算机,那么根据整数值,计算机将得出如下关系:

棕色被赋予了一个值 3,因此它必须大于用 0 表示的淡褐色,就颜色对您必须预测的标签的重要性而言。这是错误的,因为为文本提供整数的目的只是为了使计算机易于计算和评估。所以为了防止学习特征和输出之间的错误关系,我们需要编码

编码本质上意味着创建与每种颜色对应的新虚拟特征,即如果我们有“m”个标签,我们可能有“m”个特征列或“m-1”个特征列,具体取决于所使用的编码算法。因此,如果我们用编码值来表示上表,它将是:

颜色 类别 蓝色的 绿 棕色的
0 1 0 0 0
蓝色的 1 0 1 0 0
绿 2 0 0 1 0
棕色的 3 0 0 0 1

在上表中,我们所做的是通过称为虚拟特征的新列来表示类别,并对应于颜色,其各自的虚拟列收到值 1,其余设置为 0。在训练时,我们不需要类别和颜色列因为我们将它们编码为虚拟特征。

注意:如果你在训练集上进行转换和编码,那么在测试集上也必须进行转换和编码。

回到问题。如果它被框定为,如果我们可以用它们的二进制 couterparts 来表示整数的类别,那么答案将是否定的,因为基本上你所做的就是用它们的二进制数替换整数。这并不能验证或显示各个类别之间的关系,并且训练的输出将与整数值相同,甚至可能更糟。

有关更多信息,请参阅下面的链接: 分类数据的特征工程

您的替代方案也是一个虚拟代码。您选择最能表达与因变量的关系的虚拟代码。例如,颜色可以表示为 n 的 1,或者您可以转换为数字 rgb 组件,或者您可以分类:girly/muddy/...n of n 基本上意味着每个实例都是单独学习的,如果没有关系,这很好。..但是在存在关系的地方,您正在浪费您的数据..您必须单独估计该类别每个实例的系数...将工作视为分类变量。您可能会重新归类为市场部门和资历。