如何在Python sklearn中添加交互项

2024-10-06 12:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有自变量[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的高相关性。


Tags: 线性阈值sklearn条件x1x2polyx3
4条回答

如果您在scikit learn with linear regression中执行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)

自变量x1x2x3是特征矩阵的列,系数abc包含在特征矩阵中。

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

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

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

请注意,无论x1x2之间的相关性如何,这将始终为您提供一个具有交互作用的模型(理论上可以是0)。当然,您可以预先测量相关性,并使用它来决定要拟合哪个模型。

为了生成多项式特征,我假设您正在使用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这可能导致诸如过度拟合/高方差等问题

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

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

其中your_data是例如具有响应列y和输入列x1x2x3的数据帧。

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

为了生成多项式特征,我假设您正在使用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这可能导致诸如过度拟合/高方差等问题

相关问题 更多 >