Régression polynomiale avec scikit-learn

29

J'essaie d'utiliser scikit-learn pour la régression polynomiale. D'après ce que j'ai lu, la régression polynomiale est un cas particulier de régression linéaire. J'étais en train de sauter que peut-être l'un des modèles linéaires généralisés de scikit peut être paramétré pour s'adapter à des polynômes d'ordre supérieur, mais je ne vois aucune option pour le faire.

J'ai réussi à utiliser un support Vector Regressor avec un noyau poly. Cela a bien fonctionné avec un sous-ensemble de mes données, mais cela prend beaucoup de temps pour s'adapter à de plus grands ensembles de données, donc j'ai encore besoin de trouver quelque chose plus rapidement (même si vous échangez une certaine précision).

Suis-je en train de manquer quelque chose d'évident ici?

Mihai Damian
la source

Réponses:

25

Étant donné les données , un vecteur de colonne et , le vecteur cible, vous pouvez effectuer une régression polynomiale en ajoutant des polynômes de . Par exemple, considérez sixyx

x=[2113]

Utiliser uniquement ce vecteur en régression linéaire implique le modèle:

y=α1x

Nous pouvons ajouter des colonnes qui sont des puissances du vecteur ci-dessus, qui représentent l'ajout de polynômes à la régression. Ci-dessous, nous montrons ceci pour les polynômes jusqu'à la puissance 3:

X=[24811113132133]

Voici notre nouvelle matrice de données que nous utilisons dans la régression linéaire de sklearn, et elle représente le modèle:

y=α1x+α2x2+α3x3

Notez que je n'ai pas ajouté un vecteur constant de , car sklearn l'inclura automatiquement.1

Cam.Davidson.Pilon
la source
26

Théorie

La régression polynomiale est un cas particulier de régression linéaire. Avec l'idée principale de comment sélectionner vos fonctionnalités. En regardant la régression multivariée avec 2 variables: x1et x2. La régression linéaire ressemblera à ceci:y = a1 * x1 + a2 * x2.

Maintenant, vous voulez avoir une régression polynomiale (faisons un polynôme à 2 degrés). Nous allons créer quelques fonctionnalités supplémentaires: x1*x2, x1^2et x2^2. Nous obtiendrons donc votre «régression linéaire»:

y = a1 * x1 + a2 * x2 + a3 * x1*x2 + a4 * x1^2 + a5 * x2^2

Cela montre bien une importante malédiction du concept de dimensionnalité , car le nombre de nouvelles fonctionnalités croît beaucoup plus rapidement que linéairement avec la croissance du degré de polynôme. Vous pouvez jeter un œil à ce concept ici .

Entraînez-vous avec scikit-learn

Vous n'avez pas besoin de faire tout cela dans scikit. La régression polynomiale y est déjà disponible (en version 0.15 . Vérifiez comment la mettre à jour ici ).

from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model

X = [[0.44, 0.68], [0.99, 0.23]]
vector = [109.85, 155.72]
predict= [[0.49, 0.18]]
#Edit: added second square bracket above to fix the ValueError problem

poly = PolynomialFeatures(degree=2)
X_ = poly.fit_transform(X)
predict_ = poly.fit_transform(predict)

clf = linear_model.LinearRegression()
clf.fit(X_, vector)
print clf.predict(predict_)
Salvador Dali
la source
1
Que faire si je ne veux pas avoir de termes d'interaction comme x1 * x2, dois-je construire X_ manuellement? il y a un paramètre "interaction_only" dans le constructeur PolynomialFeatures (), et par défaut c'est False. Mais le définir sur True fait le contraire de ce que je veux: il conserve UNIQUEMENT les termes d'interaction, et ne conserve pas x1 ^ 2, x2 ^ 2, etc.
DenisFLASH
Le lien vers YouTube prétend que la vidéo n'existe plus. Avez-vous un autre lien vers cela?
Markon
@Markon n'importe quelle vidéo de cette liste est assez bonne: youtube.com/results?search_query=curse+of+dimensionality
Salvador Dali
@SalvadorDali c'est à ça que sert la réduction de dimensionnalité
user3916597
Je me demande si nous devrions centrer les données avant ou après l'application PolynomialFeatures?
renakre
2

x1x2y=a1x1+a2x2+a3x12+a4x22+a5x1x2a5x1x2) est celui dont je parle.

Vermeer Grange
la source