Scikit-learn的线性回归模型允许用户禁用拦截。因此,对于一键编码,我应该始终设置fit_intercept = False吗?对于虚拟编码,fit_intercept应该始终设置为True吗?我在网站上没有看到任何“警告”。
是的,对于具有一键编码的非正规线性模型,是的,您需要将截距设置为假,否则会产生完美的共线性。 sklearn
还可以考虑减少脊缩,因此在这种情况下没有必要,实际上您应该同时包括截距和所有级别。对于伪编码,应包括一个截距,除非您已对所有变量进行了标准化,在这种情况下,截距为零。
由于一键编码会生成更多变量,因此它是否比伪编码具有更大的自由度?
截距是一个附加的自由度,因此,在明确指定的模型中,截距完全相等。
对于第二个,如果有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个变量。在一键编码中,构建的3 * 4 = 12变量没有截距。我对么?
第二件事实际上不起作用。您创建的列设计矩阵将是单个的。您需要删除三列,从三种不同的分类编码中各删除一种,以恢复设计的非奇异性。3×4=12