Ri regressione lineare nel machine learning

Regression

When you try to find the relationship between variables, the term 'regression' (regression) is used.

In machine learning and statistical modeling, this relationship is used to predict the results of future events.

Regressione lineare

La regressione lineare disegna una retta tra tutti i punti di dati utilizzando la relazione tra i punti di dati.

Questa linea può essere utilizzata per prevedere valori futuri.


Nella machine learning, la previsione del futuro è molto importante.

Principio di funzionamento

Python fornisce alcuni metodi per trovare la relazione tra i punti di dati e tracciare la retta di regressione lineare. Vi mostreremo come utilizzare questi metodi invece di formule matematiche.

Nell'esempio seguente, l'asse x rappresenta l'età dell'auto, l'asse y rappresenta la velocità. Abbiamo registrato l'età e la velocità di 13 auto che passano attraverso il pedaggio. Vediamo se i dati che abbiamo raccolto possono essere utilizzati per la regressione lineare:

Esempio

Prima di tutto, disegna il grafico degli scatter plot:

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

Risultato:


Eseguire l'istanza

Esempio

importa scipy e traccia la retta di regressione lineare:

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

Risultato:


Eseguire l'istanza

Esempio di spiegazione

Importa i moduli necessari:

import matplotlib.pyplot as plt
from scipy import stats

Crea un array che rappresenta i valori dell'asse x e 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]

Esegui un metodo che restituisce alcuni valori chiave della regressione lineare:

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

Crea un'istanza che utilizza slope e intercept La funzione dei valori restituisce nuovi valori. Questo nuovo valore rappresenta la posizione corrispondente dell'asse y per il valore dell'asse x:

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

Esegui ogni valore dell'array x con la funzione. Questo produrrà un nuovo array, nel quale l'asse y avrà nuovi valori:

mymodel = list(map(myfunc, x))

Traccia il grafico degli scatter plot originali:

plt.scatter(x, y)

Traccia la retta di regressione lineare:

plt.plot(x, mymodel)

Mostra il grafico:

plt.show()

R-Squared

È importante sapere quanto bene i valori dell'asse x e quelli dell'asse y sono correlati, se non ci sono relazioni, la regressione lineare non può essere utilizzata per prevedere nulla.

Questa relazione è misurata da un valore chiamato r quadrato (r-squared).

L'intervallo del valore di r quadrato è da 0 a 1, dove 0 indica l'irrelazione e 1 indica il 100% di relazione.

Il modulo Python e Scipy calcoleranno questo valore per voi, tutto ciò che dovete fare è fornire i valori di x e y a lui:

Esempio

Come si adatta il mio dati nella regressione lineare?

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)

Eseguire l'istanza

Nota:Il risultato -0.76 indica una qualche relazione, ma non una relazione perfetta, ma indica che possiamo utilizzare la regressione lineare nelle previsioni future.

Previsione di valori futuri

Ora, possiamo utilizzare le informazioni raccolte per prevedere valori futuri.

Ad esempio: proviamo a prevedere la velocità di un'auto con 10 anni di storia.

Per questo, dobbiamo avere lo stesso myfunc() Funzione:

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

Esempio

Prevedere la velocità di un'auto con 10 anni di età:

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)

Eseguire l'istanza

La velocità di previsione è di 85.6, la possiamo leggere anche dal grafico:


Pessima adattabilità?

Creiamo un esempio in cui la regressione lineare non è il metodo migliore per prevedere valori futuri.

Esempio

Questi valori per l'asse x e y portano a una buona adattabilità della regressione lineare molto debole:

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

Risultato:


Eseguire l'istanza

e il valore di r-squared?

Esempio

Dovresti ottenere un valore molto basso di 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)

Eseguire l'istanza

Risultato: 0,013 indica una relazione molto debole e ci dice che il set di dati non è adatto alla regressione lineare.