Scikit-learn 的线性回归模型允许用户禁用拦截。所以对于 one-hot 编码,我应该总是设置 fit_intercept=False 吗?对于虚拟编码,fit_intercept 应始终设置为 True?我在网站上没有看到任何“警告”。
对于具有 one-hot 编码的非正则化线性模型,是的,您需要将截距设置为 false,否则会产生完美的共线性。 sklearn
还允许脊收缩惩罚,在这种情况下没有必要,事实上你应该包括截距和所有水平。对于虚拟编码,您应该包含一个截距,除非您已经标准化了所有变量,在这种情况下截距为零。
既然 one-hot 编码会产生更多的变量,那么它是否比虚拟编码具有更大的自由度?
截距是一个额外的自由度,因此在一个明确指定的模型中,它都等于。
对于第二个,如果有k个分类变量怎么办?k 变量在虚拟编码中被删除。自由度还是一样吗?
您无法拟合使用两个分类变量的所有级别的模型,无论是否截距。因为,一旦您对模型中一个变量中的所有级别进行单热编码,例如使用二进制变量,那么您就有一个等于常数向量的预测变量的线性组合x1,x2,…,xn
x1+x2+⋯+xn=1
如果您然后尝试将另一个分类的所有级别输入到模型中,您最终会得到一个不同的线性组合,该组合等于一个常数向量x′
x′1+x′2+⋯+x′k=1
所以你创建了一个线性依赖
x1+x2+⋯xn−x′1−x′2−⋯−x′k=0
因此,您必须在第二个变量中省略一个级别,并且所有内容都正确排列。
比如说,我有 3 个分类变量,每个变量有 4 个级别。在虚拟编码中,3*4-3=9 个变量由一个截距构建。在 one-hot 编码中,3*4=12 个变量是在没有截距的情况下构建的。我对么?
第二件事实际上不起作用。您创建的列设计矩阵将是单数的。您需要从三个不同的分类编码中删除三列,以恢复设计的非奇异性。3×4=12