如何在Python sklearn中添加交互项

时间:2017-08-23 00:47:29

标签: python scikit-learn regression linear-regression

如果我有自变量[x1,x2,x3] 如果我在sklearn中拟合线性回归 它会给我这样的东西:

y = a*x1 + b*x2 + c*x3 + intercept

poly = 2的多项式回归 会给我一些像

的东西
y = a*x1^2 + b*x1*x2 ......

我不想要像x1 ^ 2那样拥有二等学位的学期。

我怎样才能获得

y = a*x1 + b*x2 + c*x3 + d*x1*x2

如果x1和x2具有大于某个阈值j的高相关性。

3 个答案:

答案 0 :(得分:14)

为了生成多项式特征,我假设您正在使用sklearn.preprocessing.PolynomialFeatures

在方法中只考虑了相互作用的论点。所以,你可以这样写:

poly = PolynomialFeatures(interaction_only=True,include_bias = False)
poly.fit_transform(X)

现在只考虑您的互动条款,省略更高的学位。您的新要素空间变为[x1,x2,x3,x1 * x2,x1 * x3,x2 * x3]

您可以将回归模型放在

之上
clf = linear_model.LinearRegression()
clf.fit(X, y)

制作结果等式y = a*x1 + b*x2 + c*x3 + d*x1*x + e*x2*x3 + f*x3*x1

注意:如果你有高维特征空间,那么这将导致curse of dimensionality,这可能会导致过度拟合/高差异等问题

答案 1 :(得分:4)

如果您使用线性回归进行scikit-learn y = a*x1 + b*x2 + c*x3 + intercept,我假设你做了类似的事情:

# x = array with shape (n_samples, n_features)
# y = array with shape (n_samples)

from sklearn.linear_model import LinearRegression

model = LinearRegression().fit(x, y)

自变量 x1 x2 x3 是特征矩阵x的列,系数 b c 包含在model.coef_中。

如果您需要交互术语,请将其添加到要素矩阵中:

x = np.c_[x, x[:, 0] * x[:, 1]]

现在前三列包含变量,以下列包含交互 x1 * x2 。在拟合模型后,您会发现model.coef_包含四个系数 a b c d

请注意,无论 x1 x2 之间的相关性如何,这都会为您提供具有交互的模型。当然,您可以预先测量相关性并使用它来决定适合哪种模型。

答案 2 :(得分:4)

使用{{3}}构建设计矩阵,如下所示:

X, y = dmatrices('y ~ x1 + x2 + x3 + x1:x2', your_data)

your_data例如包含响应列y和输入列x1x2x3的DataFrame。

然后只需调用估算工具的fit方法,例如LinearRegression().fit(X,y)