web-dev-qa-db-fra.com

Comment ajouter un terme d'interaction dans Python sklearn

Si j'ai des variables indépendantes [x1, x2, x3] Si j'adapte la régression linéaire dans sklearn, cela me donnera quelque chose comme ceci:

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

La régression polynomiale avec poly = 2 me donnera quelque chose comme

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

Je ne veux pas avoir de termes avec le deuxième degré comme x1 ^ 2.

comment puis-je avoir

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

si x1 et x2 ont une corrélation élevée supérieure à une valeur seuil j.

11
Dylan

Pour générer des entités polynomiales, je suppose que vous utilisez sklearn.preprocessing.PolynomialFeatures

Il y a un argument dans la méthode pour ne considérer que les interactions. Vous pouvez donc écrire quelque chose comme:

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

Maintenant, seuls vos termes d'interaction sont pris en compte et les degrés supérieurs sont omis. Votre nouvel espace de fonctionnalité devient [x1, x2, x3, x1 * x2, x1 * x3, x2 * x3]

Vous pouvez adapter votre modèle de régression en plus de cela

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

Faire votre équation résultante y = a*x1 + b*x2 + c*x3 + d*x1*x + e*x2*x3 + f*x3*x1

Remarque: Si vous avez un espace d'entité dimensionnel élevé, cela conduirait à malédiction de dimensionnalité qui pourrait causer des problèmes comme le sur-ajustement/variance élevée

16
harsha

Si tu fais y = a*x1 + b*x2 + c*x3 + intercept dans scikit-learn avec régression linéaire, je suppose que vous faites quelque chose comme ça:

# 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)

Les variables indépendantes x1, x2, x sont les colonnes de la matrice d'entités x, et les coefficients a, b, c sont contenus dans model.coef_.

Si vous voulez un terme d'interaction, ajoutez-le à la matrice d'entités:

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

Maintenant, les trois premières colonnes contiennent les variables, et la colonne suivante contient l'interaction x1 * x2. Après avoir installé le modèle, vous constaterez que model.coef_ contient quatre coefficients a, b, c, d.

Notez que cela vous donnera toujours un modèle avec interaction (il peut cependant être théoriquement 0), quelle que soit la corrélation entre x1 et x2. Bien sûr, vous pouvez mesurer la corrélation au préalable et l'utiliser pour décider du modèle à adapter.

5
kazemakase

Utilisez patsy pour construire une matrice de conception comme suit:

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

your_data Est par exemple un DataFrame avec la colonne de réponse y et les colonnes d'entrée x1, x2 et x3.

Appelez ensuite simplement la méthode fit de votre estimateur, par ex. LinearRegression().fit(X,y).

4
DontDivideByZero