Regressione polinomiale usando scikit-learn


29

Sto cercando di usare scikit-learn per la regressione polinomiale. Da quello che leggo la regressione polinomiale è un caso speciale di regressione lineare. Stavo pensando che forse uno dei modelli lineari generalizzati di scikit possa essere parametrizzato per adattarsi a polinomi di ordine superiore ma non vedo alcuna opzione per farlo.

Sono riuscito a usare un Support Vector Regressor con un poli kernel. Funzionava bene con un sottoinsieme dei miei dati, ma ci vuole molto a adattarsi a set di dati più grandi, quindi ho ancora bisogno di trovare qualcosa di più veloce (anche se scambiando un po 'di precisione).

Mi sto perdendo qualcosa di ovvio qui?

Risposte:


25

Dati dati , un vettore di colonna e , il vettore di destinazione, è possibile eseguire la regressione polinomiale aggiungendo i polinomi di . Ad esempio, considera sexyx

x=[2113]

L'uso di questo vettore nella regressione lineare implica il modello:

y=α1x

Possiamo aggiungere colonne che sono potenze del vettore sopra, che rappresentano l'aggiunta di polinomi alla regressione. Di seguito viene mostrato questo per i polinomi fino alla potenza 3:

X=[24811113132133]

Questa è la nostra nuova matrice di dati che utilizziamo nella regressione lineare di sklearn e rappresenta il modello:

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

Nota che non ho aggiunto un vettore costante di , poiché sklearn lo includerà automaticamente.1


26

Teoria

La regressione polinomiale è un caso speciale di regressione lineare. Con l'idea principale di come selezionare le funzionalità. Guardando la regressione multivariata con 2 variabili: x1e x2. La regressione lineare sarà simile a questa:y = a1 * x1 + a2 * x2.

Ora vuoi avere una regressione polinomiale (facciamo un polinomio di 2 gradi). Creeremo alcune caratteristiche aggiuntive: x1*x2, x1^2e x2^2. Quindi avremo la tua "regressione lineare":

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

Ciò mostra benissimo un importante concetto di maledizione della dimensionalità , perché il numero di nuove funzionalità cresce molto più velocemente che linearmente con la crescita del grado di polinomio. Puoi dare un'occhiata a questo concetto qui .

Fai pratica con scikit-learn

Non è necessario fare tutto questo in Scikit. La regressione polinomiale è già disponibile lì (nella versione 0.15 . Controlla come aggiornarlo qui ).

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
Cosa succede se non desidero avere termini di interazione come x1 * x2, devo costruire X_ manualmente? c'è un parametro "interaction_only" nel costruttore PolynomialFeatures (), e per impostazione predefinita è False. Ma impostarlo su True fa l'opposto di quello che voglio: mantiene SOLO i termini di interazione e non mantiene x1 ^ 2, x2 ^ 2, ecc.
DenisFLASH,

Il link a YouTube afferma che il video non esiste più. Hai qualche altro link a quello?
Markon,

@Markon qualsiasi video di questo elenco è abbastanza buono: youtube.com/results?search_query=curse+of+dimensionality
Salvador Dali

@SalvadorDali ecco a cosa serve la riduzione della dimensionalità
user3916597

Mi chiedo se dovremmo centrare i dati prima o dopo l'applicazione PolynomialFeatures?
Renakre,

2

Nel caso in cui si stia utilizzando una regressione multivariata e non solo una regressione univariata, non dimenticare i termini incrociati. Ad esempio se hai due variabili e e vuoi polinomi fino alla potenza 2, dovresti usare dove l'ultimo termine ( ) è quello che sono parlare di.x1x2y=a1x1+a2x2+a3x12+a4x22+a5x1x2a5x1x2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.