Apprendimento automatico - Regressione polinomiale
Regressione polinomiale
Se i punti dati chiaramente non si adattano a una regressione lineare (una linea retta attraverso tutti i punti dati), potrebbe essere l'ideale per la regressione polinomiale.
La regressione polinomiale, come la regressione lineare, utilizza la relazione tra le variabili xey per trovare il modo migliore per tracciare una linea attraverso i punti dati.
Come funziona?
Python ha metodi per trovare una relazione tra punti dati e per tracciare una linea di regressione polinomiale. Ti mostreremo come utilizzare questi metodi invece di passare attraverso la formula matematica.
Nell'esempio seguente, abbiamo immatricolato 18 auto mentre stavano passando un determinato casello.
Abbiamo registrato la velocità dell'auto e l'ora del giorno (ora) in cui è avvenuto il passaggio.
L'asse x rappresenta le ore del giorno e l'asse y rappresenta la velocità:
Esempio
Inizia disegnando un grafico a dispersione:
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
Risultato:
Esempio
Importa numpy
e
matplotlib
quindi traccia la linea di Polynomial Regression:
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
Risultato:
Esempio spiegato
Importa i moduli di cui hai bisogno.
Puoi conoscere il modulo NumPy nel nostro Tutorial NumPy .
Puoi conoscere il modulo SciPy nel nostro Tutorial SciPy .
import numpy
import matplotlib.pyplot as plt
Crea gli array che rappresentano i valori degli assi xey:
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
NumPy ha un metodo che ci permette di creare un modello polinomiale:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Quindi specificare come verrà visualizzata la riga, iniziamo dalla posizione 1 e finiamo alla posizione 22:
myline = numpy.linspace(1, 22, 100)
Disegna il grafico a dispersione originale:
plt.scatter(x, y)
Disegna la linea di regressione polinomiale:
plt.plot(myline, mymodel(myline))
Visualizza il diagramma:
plt.show()
R-quadrato
È importante sapere quanto è buona la relazione tra i valori degli assi x e y, se non ci sono relazioni la regressione polinomiale non può essere utilizzata per prevedere nulla.
La relazione viene misurata con un valore chiamato r-quadrato.
Il valore r-quadrato è compreso tra 0 e 1, dove 0 significa nessuna relazione e 1 significa 100% correlato.
Python e il modulo Sklearn calcoleranno questo valore per te, tutto ciò che devi fare è alimentarlo con gli array xey:
Esempio
Quanto bene si adattano i miei dati in una regressione polinomiale?
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
Nota: il risultato 0,94 mostra che esiste un'ottima relazione e possiamo utilizzare la regressione polinomiale nelle previsioni future.
Prevedere i valori futuri
Ora possiamo utilizzare le informazioni che abbiamo raccolto per prevedere i valori futuri.
Esempio: Proviamo a prevedere la velocità di un'auto che passa il casello intorno alle 17:00:
Per fare ciò, abbiamo bisogno dello stesso mymodel
array dell'esempio sopra:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Esempio
Prevedi la velocità di un'auto che passa alle 17:00:
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)
L'esempio prevedeva una velocità di 88,87, che potremmo anche leggere dal diagramma:
Cattivo adattamento?
Creiamo un esempio in cui la regressione polinomiale non sarebbe il metodo migliore per prevedere i valori futuri.
Esempio
Questi valori per l'asse x e y dovrebbero risultare in un adattamento pessimo per la regressione polinomiale:
import numpy
import matplotlib.pyplot as plt
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
Risultato:
E il valore r-quadrato?
Esempio
Dovresti ottenere un valore r quadrato molto basso.
import numpy
from sklearn.metrics import r2_score
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
Il risultato: 0,00995 indica una pessima relazione e ci dice che questo set di dati non è adatto per la regressione polinomiale.