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?

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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.