Polynomial Regression Μηχανικής Μάθησης

Πολυωνυμική Ανάλυση (Polynomial Regression)

Εάν τα σημεία δεδομένων σας δεν ταιριάζουν显然 σε μια γραμμική καμπύλη (μέσω των σημείων δεδομένων), η πολυωνυμική ανάλυση είναι μια ιδανική επιλογή.

Ως και η γραμμική ανάλυση, η πολυωνυμική ανάλυση χρησιμοποιεί τη σχέση μεταξύ των μεταβλητών x και y για να βρει τον καλύτερο τρόπο να σχεδιάσει τη γραμμή των σημείων δεδομένων.


Μέθοδος λειτουργίας

Το Python έχει μερικές μεθόδους για να βρει τη σχέση μεταξύ των σημείων δεδομένων και να σχεδιάσει τη γραμμή πολυωνυμικής ανάλυσης. Θα σας δείξουμε πώς να χρησιμοποιήσετε αυτές τις μεθόδους αντί για μαθηματικές εξισώσεις.

Στο παρακάτω παράδειγμα καταγράψαμε 18 αυτοκίνητα που περνούσαν από μια συγκεκριμένη γέφυρα φόρου.

Έχουμε καταγράψει την ταχύτητα των αυτοκινήτων και τον χρόνο διέλευσης (ώρες).

Ο άξονας x αντιπροσωπεύει τις ώρες της ημέρας, ο άξονας y αντιπροσωπεύει την ταχύτητα:

Παράδειγμα

Πρώτα σχεδιάστε το διάγραμμα σημείων:

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

Αποτελέσματα:


Εκτέλεση Παραδείγματος

Παράδειγμα

εισαγωγή numpy και matplotlibΣτη συνέχεια, σχεδιάστε τη γραμμή πολυωνυμικής ανάλυσης:

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

Αποτελέσματα:


Εκτέλεση Παραδείγματος

Αιτιολογία παραδείγματος

Εισαγωγή των απαιτούμενων μοντέλων:

import numpy
import matplotlib.pyplot as plt

Δημιουργία πινάκων που εκπροσωπούν τις τιμές του άξονα x και του άξονα y:

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 έχει μια μέθοδο που μας επιτρέπει να δημιουργήσουμε μοντέλα πολυωνυμικής ανάλυσης:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Ύστερα καθορίστε τον τρόπο εμφάνισης των γραμμών, ξεκινώντας από τη θέση 1 και τελειώνοντας στη θέση 22:

myline = numpy.linspace(1, 22, 100)

Σχεδίαση του αρχικού διαγράμματος σημείων:

plt.scatter(x, y)

Δημιουργία γραμμής πολυωνυμικής ανάλυσης:

plt.plot(myline, mymodel(myline))

Εμφάνιση γραφημάτων:

plt.show()

R-Squared

Είναι σημαντικό να γνωρίζουμε πόσο καλή είναι η σχέση μεταξύ των τιμών του άξονα x και του άξονα y, γιατί αν δεν υπάρχει σχέση, η πολυωνυμική ανάλυση δεν μπορεί να χρησιμοποιηθεί για την πρόβλεψη.

Η σχέση μετράται με την τιμή του r-squared (r-squared).

Η εμβέλεια του r-squared είναι από 0 έως 1, όπου 0 σημαίνει μη σχετικό και 1 σημαίνει 100% σχετικό.

Το Python και το modul Sklearn θα υπολογίσουν για εσάς την τιμή, πρέπει απλώς να εισάγετε τα πίνακες x και y:

Παράδειγμα

Πώς είναι η προσαρμογή των δεδομένων μου στην πολυωνυμική ανάλυση;

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

Εκτέλεση Παραδείγματος

Σημειώσεις:Το αποτέλεσμα 0.94 δείχνει ότι υπάρχει καλή σχέση, και μπορούμε να χρησιμοποιήσουμε την πολυωνυμική ανάλυση για μελλοντικές προβλέψεις.

Πρόβλεψη μελλοντικών τιμών

Τώρα, μπορούμε να χρησιμοποιήσουμε τις πληροφορίες που συλλέξαμε για να προβλέψουμε μελλοντικές τιμές.

Για παράδειγμα: δοκιμάστε να προβλέψετε την ταχύτητα των αυτοκινήτων που περνούν από τον φόρο αυτοκινήτου περίπου στις 17:00;

Για το σκοπό αυτό, χρειαζόμαστε τα ίδια παραδείγματα όπως παραπάνω: mymodel Πίνακας:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

Παράδειγμα

Πρόβλεψη ταχύτητας του αυτοκινήτου μετά τις 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)

Εκτέλεση Παραδείγματος

Η ταχύτητα πρόβλεψης είναι 88.87, όπως επίσης μπορούμε να δούμε στο διάγραμμα:


Κακή προσαρμογή;

Δημιουργήστε μια παράδειγμα όπου η πολυωνυμική ανάλυση δεν είναι η καλύτερη μέθοδος πρόβλεψης μέλλοντων τιμών.

Παράδειγμα

Αυτές οι τιμές των αξιοτήτων του x και y θα οδηγήσουν σε πολύ κακή συσχέτιση πολυωνυμικής ανάλυσης:

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

Αποτελέσματα:


Εκτέλεση Παραδείγματος

Τιμή του r-squared;

Παράδειγμα

Πρέπει να λάβετε一个非常 χαμηλή τιμή του r-squared.

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

Εκτέλεση Παραδείγματος

Αποτελέσματα: 0.00995 δείχνει κακή σχέση και μας λέει ότι ο οπτικός δείκτης δεν είναι κατάλληλος για πολυωνυμική ανάλυση.