web-dev-qa-db-ja.com

Python sklearnで相互作用項を追加する方法

独立変数[x1、x2、x3]がある場合、sklearnに線形回帰を当てはめると、次のようになります。

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

Poly = 2の多項式回帰により、次のような結果が得られます。

y = a*x1^2 + b*x1*x2 ......

X1 ^ 2のような2次の用語を持ちたくありません。

どうすれば入手することができますか

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

x1とx2のしきい値jの相関が大きい場合。

11
Dylan

多項式の特徴を生成するために、 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

注:高次元の特徴空間がある場合、これは 次元の呪い につながり、過剰適合/高分散

16
harsha

もしあなたがそうするなら 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)

独立変数x1x2xは、特徴行列xの列、および係数abcmodel.coef_

相互作用項が必要な場合は、それを機能マトリックスに追加します。

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

最初の3列には変数が含まれ、次の列には相互作用x1 * x2が含まれます。モデルをフィッティングすると、model.coef_には4つの係数が含まれていますabcd

x1x2の相関関係に関係なく、これにより常に相互作用のあるモデルが得られます(ただし、理論的には0になります)。もちろん、事前に相関を測定し、それを使用して適合するモデルを決定できます。

5
kazemakase

patsy を使用して、次のように設計マトリックスを作成します。

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

_your_data_は、たとえば応答列yおよび入力列_x1_、_x2_および_x3_を含むDataFrame.

次に、推定器のfitメソッドを呼び出すだけです。 LinearRegression().fit(X,y)

4