使用 one-hot 编码时删除其中一列

机器算法验证 回归 机器学习 分类数据 离散数据 分类编码
2022-01-28 19:48:42

我的理解是,在机器学习中,如果您的数据集具有高度相关的特征,则可能会出现问题,因为它们有效地编码了相同的信息。

最近有人指出,当你对一个分类变量进行 one-hot 编码时,你最终会得到相关的特征,所以你应该放弃其中一个作为“参考”。

例如,将性别编码为两个变量,is_maleis_female,产生两个完全负相关的特征,所以他们建议只使用其中一个,有效地将基线设置为男性,然后查看 is_female 列在预测算法中是否重要.

这对我来说是有道理的,但我没有在网上找到任何暗示可能是这种情况的东西,所以这是错误的还是我遗漏了什么?

可能(未回答)重复:one-hot 编码特征的共线性对 SVM 和 LogReg 是否重要?

2个回答

这取决于您要使用的模型(甚至可能是软件)。使用线性回归或通过最大似然(或最小二乘)估计的广义线性模型(在 R 中这意味着使用函数lmglm),您需要省略一列。否则,您将收到有关“由于奇点而遗漏”的某些列的消息.

但是,如果您使用正则化估计此类模型,例如 ridge、lasso er the elastic net,那么您不应遗漏任何列。正则化处理奇点,更重要的是,获得的预测可能取决于您遗漏了哪些列。当您不使用正则化时,不会发生这种情况. 请参阅如何解释 支持此观点的多项弹性网络 (glmnet) 回归的系数(直接引用 的作者之一glmnet)的答案。

对于其他模型,使用相同的原则。如果获得的预测取决于您遗漏了哪些列,则不要这样做。否则没关系。

到目前为止,这个答案只提到了线性(和一些轻微的非线性)模型。但是非常非线性的模型,比如树和随机森林呢?关于分类编码的想法,如 one-hot,主要源于线性模型和扩展。几乎没有理由认为源自该背景的想法应该不加修改地应用于树木和森林!对于一些想法,请参阅Python 中稀疏数据的随机森林回归

但是,使用因子变量,R 会为您解决这个问题。

试图在评论中回答额外的问题:当使用正则化时,大多数情况下使用不需要矩阵求逆的迭代方法(如套索或弹性网络),因此设计矩阵没有满秩不是问题。使用岭正则化,可以使用矩阵求逆,但在这种情况下,在求逆之前添加到矩阵的正则化项使其可逆。那是技术原因,更深刻的原因是去掉一列会改变优化问题,改变参数的含义,实际上会导致不同的最优解作为一个具体的例子,假设你有一个具有三个级别的分类变量,1,2 和 3。对应的参数是β,β2,β3. 省略第 1 列会导致β1=0,而其他两个参数的含义更改β2β1,β3β1. 所以这两个差异会缩小。如果省略另一列,则原始参数中的其他对比将缩小。所以这改变了被优化的标准函数,没有理由期待等效的解决方案!如果这还不够清楚,我可以添加一个模拟示例(但不是今天)。

在本书的第 5 章中,机器学习的特征工程有一个例子可以说明 kjetil 的答案。

城市租金
0 SF 3999
1 SF 4000
2 SF 4001
3 NYC 3499
4 NYC 3500
5 NYC 3501
6 西雅图 2499
7 西雅图 2500
8 西雅图 2501

一键编码:

旧金山 1 0 0
纽约 0 1 0
西雅图 0 0 1

虚拟编码(删除一列):

旧金山 1 0 0
纽约 0 1 0
西雅图 0 0 1
结果:
                                    NYC SF SE b
One-hot 编码 166.67 666.67 –833.33 3333.33
虚拟编码 0 500 –1000 3500