Guida Machine Learning: La regressione lineare

GrincH--

Utente Emerald
2 Settembre 2010
524
86
275
536
Ultima modifica:
Note: Per comprendere al meglio la guida è consigliabile una conoscenza semi-avanzata di Python, Matematica e Statistica.

il termine regressione viene utilizzato quando si tenta di trovare la relazione tra variabili. E’ ampiamente utilizzata in statistica per stimare i valori di variabili dipendenti (output, la variabile i cui valori sono da stimare) e variabili indipendenti (input, la variabile “di confronto”). In Machine Learning o apprendimento automatico tale relazione viene utilizzata per prevedere il risultato di eventi futuri. La Regressione Lineare utilizza la relazione tra i punti dati per tracciare una linea retta che attraversa il grafico.


La regressione lineare, un aspetto matematico:



1sETF0sg5ooymHz8xkdy31E71Z6WlwWjmYIP9LsmgVaPHOpG-bVoAOTY17rkapiiG84YcIV__9nPwhq-e6m53wDNk_BBPdhsXR3WZX-XGmFKY10HG6xFUZxD-8nfQFLzGD5aYTIE


Il grafico che si utilizza per la rappresentazione grafica dei dati è il Scatterplot
ma8-iC5S5F_GrluEom3tpmWUsEAfN6Duhnl8Ct8x-hY8T_X_D2arFY48QUApEl-Vq8kEqeo2yHZYfvTw3BzAQbgkchFI0ArPpqvXcnOebDifdGt0UBtxrgOhvHk92F2bcs58cFAm



Dove i dati sono dati ordinati (in ordine crescente/decrescente) e vengono rappresentati da punti.
Abbiamo sull’asse X i dati della variabile dipendente e sull’asse Y i dati della var. Indipendente.

L’interpretazione del grafico è più o meno la seguente: (Grafico preso da RealPython)
-tTEsqwAmop6rL86rFOk7lJYap6hebEEt6jsMVmvMuF47e2USD1cU6HYJR6JJMPqk46w6wOyOu1m_VC7AfWM8XKzAHAs69W30YU-3hiR9CGIWTqIwvlSAgadnrD4T0hNapQujYlH




In coding:

Andiamo più nel pratico:
Note: I presenti codici sono stati presi da W3School e non sono stati scritti da me.
**: Per la rappresentazione grafica dei dati su grafico utilizzo l’IDE Spyder

Creiamo due Array X e Y (che rispettivamente saranno l’asse X e Y della tabella)

Python:
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]

(I dati X rappresentano l’età di 13 macchine e i dati Y la velocità di ognuna di esse)

Python:
#Importiamo il modulo Mathplotlib:

import matplotlib.pyplot as plt

#Scriviamo gli Array

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]

#Usiamo il metodo scatter() per disegnare il grafico

plt.scatter(x, y)

plt.show()

V8YRKjgRcB32m4b35xQIUT7MEXSco_yHiKbLSCzvtP2TDfKnmYb8cwvVaI5TK4fELDCVCjEZpMi5eZYptq0jiJIp0ixr6F82MwwUhm9_xNoMx-2zER6-1v0hPpXKnSzbrDyXo3T3

Sh7AQokkE_FugYPlIzlFqpTywxazs1pUXwQxOiPCh3c0rqunPC6sor1uZlXApsY_wTQrMJ_YzzXg11qw18hkYiCIm6s0r-AqN_9uK0WwO7ubBhjNb8JkNpHVqmwsCQI1Db7lAMps


Da quanto possiamo intuire dal grafico le due auto più veloci sono le più giovani di età e le più lente sono le più vecchie.

Adesso useremo SciPy per disegnare la linea di regressione lineare:
Codice:
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()

XbzPwzLInlN2-hlFkmYtp74Lgh5iPvIgP-sfIP7jqcQdhGExX0jb4cbxChuX9-gQV63dk_6T6gMWcyRM2KmVvj70e_dL5mvVijzHfR3ROWfxcZ21q6vZtP7b5E8HTgEn3P13YiOc


O1r2t0cURxjianE-5lDJ1VkCiCt4n8SPS5FjoiiLVDL8tB3tuel9tG6OD4TL8weZUZzn7IEhj0_xW3C5YFFaMKzDr-9RU-j3eXjunQ7uafphGSkrkXsjTZqyHWZFkAVWj_khG5zI




Spiegazione del codice:


Importa i moduli che ti servono.

Codice:
import matplotlib.pyplot as plt

from scipy import stats

Crea gli array che rappresentano i valori degli assi X e Y
Codice:
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 il metodo stats.linregress() di SciPy per far si che restituisca i valori chiave della regressione lineare:
Codice:
slope, intercept, r, p, std_err = stats.linregress(x, y)

Ti riporto questa pag per ulteriori informazioni sul modulo: QUI

Crea una funzione che utilizzi i valori slope e intercept per restituire un nuovo valore. Questo nuovo valore rappresentato sull'asse y verrà “affiancato” dal valore x corrispondente:
Codice:
def myfunc(x):

  return slope * x + intercept

Esegui ogni valore dell’array X attraverso la funzione. Risulterà un nuovo array con i nuovi valori per l’asse Y.

Codice:
mymodel = list(map(myfunc, x))

Disegna il grafico a dispersione originale:
Codice:
plt.scatter(x, y)

Disegna la linea di regressione lineare:
Codice:
plt.plot(x, mymodel)

Visualizza il diagramma:
Codice:
plt.show()


È importante sapere come è la relazione tra i valori dell'asse x e i valori dell'asse y, se non ci sono relazioni la regressione lineare non può essere utilizzata per le previsioni.
Questa relazione - il coefficiente di correlazione - è chiamata r.
Il valore r varia da 0 a 1, dove 0 significa nessuna relazione e 1 significa correlato al 100%.
Python e il modulo Scipy ci aiuteranno a calcolare tale valore.


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


Nota: il risultato -0,76 mostra che esiste una relazione, non perfetta, ma indica che potremmo utilizzare la regressione lineare 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 di 10 anni.
Per fare ciò, abbiamo bisogno della stessa funzione myfunc() dell'esempio sopra:

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

Esempio
Prevedi la velocità di un'auto di 10 anni:
Codice:
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)

L'esempio prevedeva una velocità a 85,6, che potremmo anche leggere dal diagramma:



r_RSJ5b8CYLHF0OcgVeHVdmRPbUchcoqvJStJiZumuR6QSIcUhOn1N33MmWWAk_V3UMmJ0kNcZw92mAp7xcnoFDlk7zK_Pz8JN-gWsbTFL--a1l-HYsGO5WGA70il1KsDbeN2wMV


Spero quantomeno di aver svelato qualche dubbio sull'argomento e sopratutto di esser stato utile.
Per qualsiasi cosa non esitate a contattarmi sul post!
 
Molto interessante!
Sto seguendo infatti un corso di Machine Learning in aggiunta a Neural Networks & Deep Learning!

Hai logicamente tralasciato la parte monotona di teoria di ML (quella riguardante lo spazio delle ipotesi, le migliaia di definizioni e teoremi come l' (agnostic) PAC learning e il No-Free Lunch) per rendere al livello di tutti il topic.

Aggiungerei che la regressione lineare è un task risolto da algoritmi di Machine Learning di tipo supervised ovvero con una sorta di controllo della previsione del modello (che nel caso della regressione è l'MSE ovvero il Mean Square Error e che nel codice lo std_err è proprio la radice dell'MSE). Nel caso in cui questa ipotesi venisse meno, si parlerebbe di algoritmi di ML di tipo unsupervised (come per esempio il Deep Learning).

Mi piacerebbe che ci fosse una continuazione magari passando dalla famosa task di Classificazione e vedere alla fine i SVM (Support Vector Machines) in modo da vedere tutti i concetti base per poi apprendere le conoscenze fondamentali per passare a codici per (esempio) riconoscimento vocale, facciale fino ai DeepFakes (con le GAN Generative-Adversarial Network).

Magari potrei supportare qualche thread nelle prossime settimane essendo argomenti che comunque vedrò a lezione. :asd:

MP
 
  • Mi piace
Reazioni: GrincH--
Anche io sto seguendo un corso di Artificial Intelligence & Machine Learning, ma ancora non abbiamo inaugurato la parte di Neural Networks & Deep Learning ma fatto Supervised / Unsupervised Learning.
Si ho tralasciato tutta la parte di teoria soprattutto perchè mi sembrava di entrare troppo nel mondo accademico mentre mi volevo concentrare sul "succo" e come hai detto te, renderlo al livello di tutti.

Aggiungerei che la regressione lineare è un task risolto da algoritmi di Machine Learning di tipo supervised ovvero con una sorta di controllo della previsione del modello (che nel caso della regressione è l'MSE ovvero il Mean Square Error e che nel codice lo std_err è proprio la radice dell'MSE). Nel caso in cui questa ipotesi venisse meno, si parlerebbe di algoritmi di ML di tipo unsupervised (come per esempio il Deep Learning).

Musica per le mie orecchie!

Come detto, molti aspetti sono stati trascurati proprio per creare una piccola rubrica di AI & ML, e man mano riempire tutto il sacco, ci sarà senz'altro una continuazione passando prima magari un aspetto generale sulla distinzione tra supervised / unsupervised, e senza dubbio poi procedere con Classificazione, Clustering e SVM...senza tralasciare l'importanza di avere Training Data Set e allenare gli algoritmi a prevedere i dati!

Sono molto felice della tua opinione e sarei onorato se anche tu aggiungessi qualche thread!

GrincH--
 
  • Mi piace
Reazioni: MichPower
Nella mia facoltà, i corsi di ML e Deep Learning sono due corsi differenti.

Inoltre, posso approfondire la parte di regressione lineare risolvendo il problema della classificazione con due algoritmi differenti:

-
Programmazione Lineare (LP), molto matematicosa. Richiede nozioni di algebra lineare visto che trasforma il problema in una equazione matriciale;
- Perceptron Algoritmo iterativo (inventato negli anni '50!!!!) che permette di raggiungere un modello lineare di classificazione dei samples in tempi molto brevi (sempre se il principio di realizzabilità tenga, ovvero che il dataset sia separabile linearmente).

Non so come tu abbia intenzione di continuare, se andare avanti sotto questo post o creare un continuo di thread.

Nel mentre studio e codifico in Python il codice per il secondo Algoritmo (Perceptron).

MP