如何在Python sklearn中添加交互项

Dyl*_*lan 12 python regression linear-regression scikit-learn

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

y = a*x1 + b*x2 + c*x3 + intercept
Run Code Online (Sandbox Code Playgroud)

poly = 2的多项式回归会给我类似的东西

y = a*x1^2 + b*x1*x2 ......
Run Code Online (Sandbox Code Playgroud)

我不希望像x1 ^ 2那样拥有二度学位.

我怎样才能得到

y = a*x1 + b*x2 + c*x3 + d*x1*x2
Run Code Online (Sandbox Code Playgroud)

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

har*_*sha 17

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

在仅考虑相互作用的方法中存在一个论点.所以,你可以这样写:

poly = PolynomialFeatures(interaction_only=True,include_bias = False)
poly.fit_transform(X)
Run Code Online (Sandbox Code Playgroud)

现在只考虑您的交互条款,并省略更高的度数.您的新要素空间变为[x1,x2,x3,x1*x2,x1*x3,x2*x3]

您可以在此基础上使用回归模型

clf = linear_model.LinearRegression()
clf.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

制作你的结果方程式 y = a*x1 + b*x2 + c*x3 + d*x1*x + e*x2*x3 + f*x3*x1

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

  • 好的。我会进一步设置“include_bias=False”,因为偏差列可能会导致某些估计器出现简并问题,而“LinearRegression”无论如何都会添加自己的截距项。 (2认同)

kaz*_*ase 5

如果您y = a*x1 + b*x2 + c*x3 + intercept使用线性回归在scikit-learn中进行操作,那么我假设您执行以下操作:

# 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)
Run Code Online (Sandbox Code Playgroud)

自变量x1x2x3是特征矩阵的列,x系数abc包含在中model.coef_

如果需要交互项,请将其添加到特征矩阵中:

x = np.c_[x, x[:, 0] * x[:, 1]]
Run Code Online (Sandbox Code Playgroud)

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

请注意,这将始终为您提供具有交互作用的模型(尽管理论上它可以为0),而不管x1x2之间的相关性如何。当然,您可以预先测量相关性,然后使用它来确定适合的模型。


Don*_*ero 5

使用patsy构造设计矩阵,如下所示:

X, y = dmatrices('y ~ x1 + x2 + x3 + x1:x2', your_data)
Run Code Online (Sandbox Code Playgroud)

哪里your_data是如数据框与响应列y和输入列x1x2x3

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