二进制特征应该进行独热编码吗?

18

我正在处理有关人的几十个二进制特征的数据,基本上可以归结为“人具有特征x” [True/False]。

根据网上的资料,分类数据应该进行独热编码,而不是为每一类分配任意值,因为你不能说“类别1小于类别2”。因此,解决方案是为每个类别创建一个虚拟变量:

Cat || dummy 1 | dummy 2 | dummy 3
____||_________|_________|________
 1  ||   1     |   0     |   0
 2  ||   0     |   1     |   0
 3  ||   0     |   0     |   1

现在针对二进制特征,可以选择直接使用变量(1代表真,0代表假)或者使用两个虚拟变量((1,0)代表真,(0,1)代表假)。但是我找不到任何显示/解释哪种方法最好的来源。

我自己感到矛盾,因为一方面,虚拟变量会降低每个单独变量的重要性,在某些情况下模型准确度有所降低,来源。但另一方面,这也可以编码缺失的数据(以(0, 0)的形式)。此外,"False是否小于True"也可能成立吗?

我实际上正在使用Python中的随机森林(Random Forest),我知道基于树的分类器如随机森林支持类别数据,但Scikit-Learn包尚未实现它。

我在Scikit-Learn数字数据集上进行了一个小测试。该数据集具有数字(0-9)的多个8 x 8图像,每个像素的值都在0到16之间,简单的模型可以使用它来学习识别数字。

对于我的测试,我将> 8的值更改为True,将<= 8的值更改为False。当与原始数据进行比较时,准确性当然有所下降,但是当我实现独热编码,因此将True更改为(1,0),将False更改为(0,1)时,我找不到与二进制编码相比显著的差异。

非常感谢您提供推荐方法的解释!


8
不,它们应该作为单个特征保留。实际上,在某种意义上,它们已经进行了一次独热编码。请记住,在独热编码中,建议删除最后一个特征,因为它可以通过所有其他特征推断出来。引入始终与第一个特征相反的第二个特征只会增加特征之间的相关性(因为它可以由第一个特征推导出来)。无论如何,这个问题不适合在Stack Overflow上发布。也许可以在stats.stackexchange.com上发布。 - Vivek Kumar
谢谢。我没有考虑到可以通过使用其他所有特征来推断最后一个特征。抱歉在这里提出问题而不是在stats.SE上。 - Jurgy
@vivek 这可能对某些模型适用,但并非所有模型都可以访问所有变量(例如随机森林中只有一部分特征的单个树)。在这种情况下,模型将无法从独热编码中推断潜在信息,因此不是这样吗? - Jinglesting
1个回答

18
将取值为[0,1]的二进制变量转换为[(0,1),(1,0)]的独热编码是多余且不推荐的,原因如下(一些原因已在上面的评论中提到,但以下内容进行扩展):
  1. 由于二进制变量已经类似于独热编码的形式,因此这种转换是多余的。在二进制变量的情况下,最后一列被舍弃,因为它与有或无没有任何区别,因为可以从第一列推断出它的补充列:如果我给你 [(0, ), (1,)], 你就能知道补充的列是 [(, 1), (, 0)]。

  2. 假设您有多个二进制变量,例如4个。如果将它们转换为独热编码形式,则维度将从4增加到8。以下是不推荐使用后者的原因:

    • 维数灾难:高维数据可能很麻烦。这是因为许多算法(例如聚类算法)使用欧几里得距离,由于平方项的存在,对噪音非常敏感。实际上,随着维数增加,数据点变得太稀疏,使得数据极为嘈杂。此外,邻域的概念变得无意义,基于查找数据点之间距离相对对比的方法变得不可靠。

    • 时间复杂度和空间复杂度: 增加特征数量会增加算法的执行时间和内存使用需求是直觉的。例如,使用协方差矩阵计算的算法将受到影响,多项式算法将有太多术语...等等。一般来说,学习通常比较快,特别是当额外的特征是冗余时。

    • 多重共线性:由于二元变量的独热编码形式中的最后一列是冗余的,并且与第一列100%相关,这会给基于线性回归的算法带来麻烦。例如,由于普通最小二乘估计涉及矩阵求逆,如果许多特征之间存在关联,则计算机算法可能无法获得近似逆矩阵,因此逆矩阵可能在数值上不准确。此外,线性模型通过观察因变量 y 随一个自变量的单位变化而发生变化,同时将所有其他自变量保持不变,然而如果自变量高度相关,则该方法失败 (多重共线性还有其他后果) (尽管某些其他算法可能对此不太敏感,如决策树)。

    • 过拟合风险:通常情况下,过多的特征 (无论它们是否相关) 可能会导致模型过度拟合,并且无法推广到新的示例中,因为给定特征可以完全标识数据集中的每个数据点 (查看Andrew NG的讲座,他详细解释了这一点)。

摘要

简而言之,将二进制变量转换为独热编码是多余的,可能会导致不必要和未经请求的问题。虽然相关特征不一定会使模型变得更差,但它们也不总是会使模型变得更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接