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

Επιστροφή

Όταν προσπαθείτε να βρείτε τη σχέση μεταξύ μεταβλητών, χρησιμοποιείται ο όρος "επιστροφή" (regression).

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

Γραμμική εξίσωση

Η γραμμική εξίσωση χρησιμοποιεί τη σχέση μεταξύ σημείων δεδομένων για να σχεδιάσει μια ευθεία γραμμή μεταξύ όλων των σημείων δεδομένων.

Αυτή η γραμμή μπορεί να χρησιμοποιηθεί για την πρόβλεψη μελλοντικών τιμών.


Στη μηχανική μάθηση, η πρόβλεψη του μέλλοντος είναι πολύ σημαντική.

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

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

Στο παρακάτω παράδειγμα, ο άξονας x αντιπροσωπεύει την ηλικία του αυτοκινήτου και ο άξονας y την ταχύτητα. Έχουμε καταγράψει την ηλικία και την ταχύτητα 13 αυτοκινήτων που περνούν από τον σταθμό χρέωσης. Ας δούμε αν τα δεδομένα που συλλέξαμε μπορούν να χρησιμοποιηθούν για γραμμική εξίσωση:

Παράδειγμα

Πρώτα να σχεδιάσουμε το διάγραμμα διασποράς:

import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()

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


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

Παράδειγμα

εισαγωγή scipy και να σχεδιάσουμε τη γραμμική εξίσωση:

import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

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


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

Παράδειγμα εξήγησης

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

import matplotlib.pyplot as plt
from scipy import stats

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

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

Εκτέλεση μιας μεθόδου που επιστρέφει μερικούς σημαντικούς κλειδιά της γραμμικής εξίσωσης:

slope, intercept, r, p, std_err = stats.linregress(x, y)

Δημιουργία μιας που χρησιμοποιεί slope και intercept Η συνάρτηση τιμών επιστρέφει νέες τιμές. Αυτές οι νέες τιμές δείχνουν την θέση που η αντίστοιχη τιμή του άξονα x θα τοποθετηθεί στον άξονα y:

def myfunc(x):
  return slope * x + intercept

Εκτέλεση της συνάρτησης για κάθε τιμή του πίνακα x. Αυτό θα παράξει έναν νέο πίνακα, όπου ο άξονας y έχει νέες τιμές:

mymodel = list(map(myfunc, x))

Δημιουργία αρχικού διαγράμματος διασποράς:

plt.scatter(x, y)

Δημιουργία γραμμικής εξίσωσης:

plt.plot(x, mymodel)

Εμφάνιση γραφήματος:

plt.show()

R-Squared

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

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

Το εύρος του r-square είναι από 0 έως 1, όπου 0 σημαίνει μη σχετικό και 1 σημαίνει 100% σχετικό.

Το Python και το μοντέλο Scipy θα υπολογίσουν για σένα αυτό το όρισμα, πρέπει απλώς να παρέχεις τις τιμές x και y του:

Παράδειγμα

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

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

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

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

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

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

Για παράδειγμα: ας προσπαθήσουμε να προβλέψουμε την ταχύτητα ενός αυτοκινήτου με 10 χρόνια ιστορίας.

Για το σκοπό αυτό, χρειαζόμαστε τα ίδια με το προηγούμενο παράδειγμα: myfunc() Συνάρτηση:

def myfunc(x):
  return slope * x + intercept

Παράδειγμα

Πρόβλεψη ταχύτητας ενός αυτοκινήτου με 10 χρόνια ζωής:

from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
speed = myfunc(10)
print(speed)

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

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


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

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

Παράδειγμα

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

import matplotlib.pyplot as plt
from scipy import stats
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]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
  return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

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


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

και τιμή r-squared;

Παράδειγμα

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

import numpy
from scipy import stats
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]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)

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

Τα αποτελέσματα: 0.013 δείχνει πολύ κακή σχέση και μας λέει ότι ο συλλογισμός αυτός δεν είναι κατάλληλος για γραμμικό ανάλυση.