Scikit学习中的一键式与虚拟编码


50

编码分类变量有两种不同的方法。假设一个分类变量具有n个值。一键编码将其转换为n个变量,而伪编码将其转换为n-1个变量。如果我们有k个分类变量,每个分类变量都有n个值。一种热编码以kn个变量结束,而伪编码以kn-k个变量结束。

我听说对于一键编码,拦截会导致共线性问题,这会使模型不可靠。有人称其为“ 虚拟变量陷阱 ”。

我的问题:

  1. Scikit-learn的线性回归模型允许用户禁用拦截。因此,对于一键编码,我应该始终设置fit_intercept = False吗?对于虚拟编码,fit_intercept应该始终设置为True吗?我在网站上没有看到任何“警告”。

  2. 由于一键编码会生成更多变量,因此它是否比伪编码具有更大的自由度?

Answers:


35

Scikit-learn的线性回归模型允许用户禁用拦截。因此,对于一键编码,我应该始终设置fit_intercept = False吗?对于虚拟编码,fit_intercept应该始终设置为True吗?我在网站上没有看到任何“警告”。

是的,对于具有一键编码的非正规线性模型,是的,您需要将截距设置为假,否则会产生完美的共线性。 sklearn还可以考虑减少脊缩,因此在这种情况下没有必要,实际上您应该同时包括截距和所有级别。对于伪编码,应包括一个截距,除非您已对所有变量进行了标准化,在这种情况下,截距为零。

由于一键编码会生成更多变量,因此它是否比伪编码具有更大的自由度?

截距是一个附加的自由度,因此,在明确指定的模型中,截距完全相等。

对于第二个,如果有k个分类变量,该怎么办?k个变量在伪编码中被删除。自由度还是一样吗?

您无法使用一个模型,在该模型中使用了两个类别变量的所有级别,无论是否拦截。因为,一旦您对模型中的一个变量进行了所有级别的一次热编码,例如使用二进制变量进行编码,那么您就有了与常数向量相等的线性预测变量组合x1,x2,,xn

x1+x2++xn=1

然后,如果您尝试将另一个类别所有水平输入模型,最终将得到一个等于常数向量的独特线性组合x

x1+x2++xk=1

这样就创建了线性依赖关系

x1+x2+xnx1x2xk=0

因此,您必须在第二个变量中省略一个级别,并且所有内容都正确排列。

说,我有3个分类变量,每个都有4个级别。在伪编码中,使用一个截距构建3 * 4-3 = 9个变量。在一键编码中,构建的3 * 4 = 12变量没有截距。我对么?

第二件事实际上不起作用。您创建的列设计矩阵将是单个的。您需要删除三列,从三种不同的分类编码中各删除一种,以恢复设计的非奇异性。3×4=12


谢谢。对于第二个,如果有k个分类变量,该怎么办?k个变量在伪编码中被删除。自由度还是一样吗?
慕尼黑农庄'16

@ChongWang我已将对您评论的回复编辑为我的答案。
马修·德鲁里

抱歉,我在这里有些迷路。说,我有3个分类变量,每个都有4个级别。在伪编码中,使用一个截距构建3 * 4-3 = 9个变量。在一键编码中,构建的3 * 4 = 12变量没有截距。我对么?因此,此处的虚拟编码DF为9-1,而一热编码DF为12。我正确吗?
慕尼黑农庄'16

@ChongWang再次编辑。
马修·德鲁里

@MatthewDrury我在sklearn中的linear_model有相同的问题。经过虚拟编码后,决策树和KNN可以正常工作,但线性回归的奇异性下降。我从您的回答中了解到,我应该删除“第二个变量的级别”,但是我不知道这实际上意味着什么?例如,我有3个数字功能和3个类别(制造商,型号和fuel_type)。模型自然取决于制造商,因为一个制造商可以拥有n个模型。那么,如果要使用线性回归,如何在这种常见情况下进行?
哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.