Regressione lineare: dalla retta ai primi modelli di machine learning
Hai i dati di dieci appartamenti venduti in zona: superficie e prezzo. Ne stai valutando uno da 85 m². Quanto dovrebbe costare?
A occhio la risposta è "più è grande, più costa", ma serve un numero. La regressione lineare trasforma quell'intuizione in una formula: trova la retta che meglio riassume i dati e la usa per fare previsioni. È il modello più semplice del machine learning, e quasi tutto quello che viene dopo, reti neurali comprese, ne riprende le idee.
Il problema
| Superficie (m²) | Prezzo (k€) |
|---|---|
| 40 | 105 |
| 50 | 120 |
| 55 | 140 |
| 65 | 150 |
| 70 | 175 |
| 80 | 185 |
| 90 | 210 |
| 100 | 225 |
| 110 | 255 |
| 120 | 265 |
Messi su un grafico, i punti stanno quasi allineati, ma non perfettamente: due appartamenti della stessa metratura possono costare diversamente per piano, esposizione o stato degli interni. Nessuna retta passa per tutti i punti. Cerchiamo quella che ci passa più vicino.
I segmenti verticali tra ogni punto e la retta sono gli errori della retta: la distanza tra il prezzo vero e quello previsto. Trovare la retta migliore vuol dire renderli il più piccoli possibile.
Il modello
Formula di una retta:
- è l'input, la superficie;
- (si legge "y cappello") è la previsione, il prezzo stimato;
- è la pendenza: quanti k€ in più costa ogni m² in più;
- è l'intercetta: il valore della retta quando .
"Addestrare" il modello significa scegliere e . Sono solo due numeri, ma il principio è lo stesso di una rete neurale con miliardi di parametri: cercare i valori che fanno sbagliare il modello il meno possibile sui dati che conosciamo.
Cosa vuol dire "la retta migliore"
Prendiamo una retta qualsiasi, per esempio , e confrontiamola con i dati. Per l'appartamento da 70 m² prevede k€, ma il prezzo vero è 175 k€: la retta sbaglia di 5 k€ in difetto. Per quello da 65 m² prevede 160 k€ contro un prezzo vero di 150 k€: sbaglia di 10 k€ in eccesso.
Questa differenza tra prezzo vero e prezzo previsto si chiama residuo:
È positivo quando la retta sta sotto il punto (sottostima), negativo quando sta sopra (sovrastima). Ogni appartamento ha il suo residuo, e a noi serve un unico numero che dica quanto sbaglia la retta nel complesso, per poter confrontare due rette e scegliere la migliore.
Il problema della somma di residui
L'idea più semplice, ma fallace, per calcolare l'errore è sommare i residui. Proviamo con due rette:
- retta A, piatta: prevede sempre 183 k€, il prezzo medio, qualunque sia la superficie. È evidentemente pessima: dà lo stesso prezzo a un bilocale da 40 m² e a un appartamento da 120 m²;
- retta B: , quella di prima, che segue bene i punti.
| Superficie (m²) | Prezzo vero (k€) | Residuo A (k€) | Residuo B (k€) |
|---|---|---|---|
| 40 | 105 | −78 | −5 |
| 50 | 120 | −63 | −10 |
| 55 | 140 | −43 | 0 |
| 65 | 150 | −33 | −10 |
| 70 | 175 | −8 | +5 |
| 80 | 185 | +2 | −5 |
| 90 | 210 | +27 | 0 |
| 100 | 225 | +42 | −5 |
| 110 | 255 | +72 | +5 |
| 120 | 265 | +82 | −5 |
| Somma | 0 | −30 |
La retta A, quella pessima, ha somma esattamente zero, come se non sbagliasse mai. Gli errori enormi in eccesso sui piccoli appartamenti e quelli in difetto sui grandi si annullano a vicenda. La somma premia la retta sbagliata.
Il quadrato risolve il problema
Il rimedio è togliere il segno prima di sommare, elevando ogni residuo al quadrato: e valgono entrambi 6.084 k€², e nessun errore può più compensarne un altro. Facendo poi la media su tutti gli appartamenti si ottiene l'errore quadratico medio (MSE, mean squared error):
| Retta A (piatta) | Retta B | |
|---|---|---|
| Somma dei residui (k€) | 0 | −30 |
| MSE (k€²) | 2.746 | 35 |
Ora il verdetto è quello giusto: la retta B sbaglia quasi ottanta volte meno.
In formula, con appartamenti numerati da a :
Si legge così: per ogni appartamento , calcola il residuo e elevalo al quadrato; somma tutti i quadrati (); dividi per il numero di appartamenti ().
La retta migliore è quella con l'MSE più basso possibile, e il metodo per trovarla si chiama minimi quadrati.
Perché il quadrato e non il valore assoluto?
Anche il valore assoluto toglie il segno: . Si potrebbe minimizzare la media dei valori assoluti, e in certi casi lo si fa. Il quadrato però ha due vantaggi.
Pesa di più gli errori grandi. Un errore di 10 k€ al quadrato vale 100 k€², un errore di 1 k€ vale 1 k€²: sbagliare di 10 conta come sbagliare di 1 per cento volte, non per dieci. La retta quindi evita a tutti i costi gli errori grossi, anche a prezzo di qualche errore piccolo in più. Di solito è quello che si vuole. Il rovescio della medaglia è che un singolo punto anomalo può spostare molto la retta, come vedremo tra i limiti.
Si fanno i conti facilmente. Il quadrato è una curva liscia, senza spigoli, e si deriva senza problemi. Il valore assoluto invece ha uno spigolo in zero, dove la derivata non esiste. Grazie al quadrato il minimo si trova con una formula esatta, che è la prossima sezione, oppure con la discesa del gradiente, che vedremo più avanti.
Minimi quadrati: la formula esatta
Per una retta il minimo si trova con una formula chiusa. Indicando con e le medie:
L'intuizione: il numeratore misura quanto e si muovono insieme (quando la superficie è sopra la media, anche il prezzo lo è?), il denominatore quanto si muove da sola. La seconda formula garantisce che la retta passi per il punto medio .
Con i nostri dati:
| Passo | Valore |
|---|---|
| (superficie media) | 78 m² |
| (prezzo medio) | 183 k€ |
| 13.210 m²·k€ | |
| 6.410 m⁴ | |
| 2,061 k€/m² | |
| 22,25 k€ |
Ogni metro quadro in più vale circa 2.060 €. Per l'appartamento da 85 m²:
cioè circa 197.400 €.
Ecco cosa prevede la retta per ogni appartamento, e di quanto sbaglia:
| Superficie (m²) | Prezzo vero (k€) | Previsto (k€) | Residuo (k€) |
|---|---|---|---|
| 40 | 105 | 104,7 | +0,3 |
| 50 | 120 | 125,3 | −5,3 |
| 55 | 140 | 135,6 | +4,4 |
| 65 | 150 | 156,2 | −6,2 |
| 70 | 175 | 166,5 | +8,5 |
| 80 | 185 | 187,1 | −2,1 |
| 90 | 210 | 207,7 | +2,3 |
| 100 | 225 | 228,3 | −3,3 |
| 110 | 255 | 248,9 | +6,1 |
| 120 | 265 | 269,6 | −4,6 |
L'MSE vale 23,6 k€². La sua radice, circa 4,9 k€, torna nella stessa unità dei prezzi: in media la retta sbaglia di qualche migliaio di euro.
Discesa del gradiente: arrivarci per tentativi
La formula dei minimi quadrati funziona solo per modelli semplici come la retta. Per una rete neurale non esiste: i parametri vanno trovati per tentativi, migliorandoli un poco alla volta. Il metodo si chiama discesa del gradiente, e la regressione lineare è il posto ideale per vederlo all'opera, perché conosciamo già il risultato giusto.
L'idea
Ogni coppia di valori è una retta diversa, e ogni retta ha il suo MSE. Si può immaginare l'MSE come un terreno collinare: la posizione è data da e , l'altezza è l'errore. La retta migliore è il punto più basso della valle.
Siamo bendati: non vediamo la valle, possiamo solo tastare il terreno sotto i piedi. La strategia è:
- partire da una retta qualsiasi, per esempio e ;
- capire da che parte il terreno scende;
- fare un piccolo passo in quella direzione;
- ripetere finché il terreno non è piatto.
Da che parte si scende: le derivate
Semplifichiamo: teniamo fermo al suo valore migliore, 22,25 k€, e muoviamo solo . Per ogni valore di calcoliamo l'MSE e lo mettiamo in un grafico. Viene una curva a U: l'errore è grande con pendenze troppo basse o troppo alte, ed è minimo in .
Chi sta sulla curva non vede dov'è il minimo. Vede solo com'è inclinata la curva nel punto in cui si trova, cioè la linea tratteggiata. Quell'inclinazione è la derivata, e il suo segno dice da che parte andare:
- a sinistra del minimo, per esempio in , la curva scende andando verso destra. La derivata è negativa: spostandosi a destra, cioè aumentando , l'errore cala;
- a destra del minimo, per esempio in , la curva sale andando verso destra. La derivata è positiva: bisogna tornare a sinistra, cioè diminuire .
La regola, in entrambi i casi: muoversi nel verso opposto al segno della derivata.
Osservazione
Lontano dal minimo la curva è ripida e la derivata è grande, vicino al minimo è quasi piatta e la derivata è piccola. Se il passo è proporzionale alla derivata, si fanno passi lunghi quando si è lontani e passi corti quando si è vicini.
Con vale lo stesso ragionamento, su una curva a U diversa. Le due derivate insieme, una per e una per , formano il gradiente, da cui il nome del metodo.
Per l'MSE le derivate si possono calcolare manualmente e hanno una forma semplice:
Spiegazione formula, passo per passo
Bastano due regole delle derivate: la derivata di una somma è la somma delle derivate, e la regola della catena per il quadrato.
1. Scriviamo l'MSE in funzione di e . Al posto di mettiamo la retta, :
Il residuo e il suo opposto hanno lo stesso quadrato: usiamo perché rende i segni più comodi.
2. Si deriva un termine alla volta. è una costante e resta fuori; la derivata della somma è la somma delle derivate dei singoli termini. Basta quindi derivare un termine generico:
3. Regola della catena. La derivata di un quadrato è , moltiplicato per la derivata di quello che c'è dentro:
4. Quanto cambia se cambia ? In i dati , sono numeri fissi, e anche è fermo, perché deriviamo solo rispetto a . Resta , la cui derivata rispetto a è . Rispetto a , invece, l'unico termine che cambia è stesso, con derivata 1:
5. Rimettiamo tutto insieme, ricordando che :
L'unica differenza tra le due è quel fattore : da lì viene la superficie che moltiplica ogni errore nella derivata di .
In parole: si prende l'errore di ogni appartamento . Per si sommano e basta; per ogni errore viene prima moltiplicato per la superficie . Poi a ogni passo:
Il segno meno è quello che fa andare nella direzione opposta alla derivata. è il learning rate: un numero che decide quanto è lungo ogni passo.
Il primo passo, con i numeri
Partiamo da e : la retta è piatta a zero, prevede 0 € per ogni appartamento, e l'MSE è enorme, 36.235 k€². Tutti gli errori sono negativi (la retta sta sotto ogni punto), quindi entrambe le derivate sono negative:
| Derivata | Passo () | Nuovo valore | |
|---|---|---|---|
| −31.190 k€·m² | +3,119 k€/m² | 3,119 k€/m² | |
| −366 k€ | +0,037 k€ | 0,037 k€ |
Entrambi i parametri salgono, come ci si aspetta. Ma la derivata rispetto a è 85 volte più grande di quella rispetto a : ogni errore viene moltiplicato per la superficie, che vale in media 78 m². Con lo stesso , fa un balzo e si muove appena. Ci torniamo tra poco, perché spiega tutto il resto.
codice
In Python sono le due formule di sopra ripetute in un ciclo:
x = [40, 50, 55, 65, 70, 80, 90, 100, 110, 120]
y = [105, 120, 140, 150, 175, 185, 210, 225, 255, 265]
n = len(x)
m, q = 0.0, 0.0 # si parte da una retta qualsiasi
passo = 0.0001 # learning rate: quanto è lungo ogni passo
for i in range(200_000):
errori = [(m * a + q) - b for a, b in zip(x, y)]
grad_m = 2 / n * sum(e * a for e, a in zip(errori, x))
grad_q = 2 / n * sum(errori)
m -= passo * grad_m
q -= passo * grad_q
print(f"m = {m:.3f}, q = {q:.2f}") # m = 2.067, q = 21.76errori sono gli , grad_m e grad_q le due derivate, passo è .
Cosa succede passo dopo passo
| Iterazione | (k€/m²) | (k€) | MSE (k€²) |
|---|---|---|---|
| 0 | 0 | 0 | 36.235 |
| 1 | 3,119 | 0,04 | 4.380 |
| 2 | 2,042 | 0,02 | 584 |
| 10 | 2,319 | 0,03 | 70,7 |
| 1.000 | 2,314 | 0,45 | 69,0 |
| 10.000 | 2,274 | 3,88 | 55,8 |
| 100.000 | 2,099 | 18,95 | 24,7 |
| 200.000 | 2,067 | 21,76 | 23,7 |
Si vedono due fasi molto diverse.
Fase 1: in dieci passi si sistema la pendenza. L'MSE crolla da 36.235 k€² a circa 70 k€². Al primo passo esagera e arriva a 3,119, oltre il valore giusto; al secondo la derivata ha cambiato segno e lo riporta indietro a 2,042. Dopo qualche oscillazione si assesta su 2,319. Intanto è rimasto praticamente a zero.
Quel 2,319 non è casuale: è la pendenza della retta migliore tra quelle che passano per l'origine, cioè con , e ha MSE 71 k€². In questa fase l'algoritmo ha trovato la migliore retta possibile senza quasi toccare .
Fase 2: centinaia di migliaia di passi per sistemare . Ora l'algoritmo deve alzare da 0 a 22 k€ e, insieme, abbassare da 2,32 a 2,06. Ma si muove a passi minuscoli: dopo 1.000 iterazioni vale 0,45 k€, dopo 100.000 ancora 18,95 k€.
Perché così lento? In questa fase la derivata rispetto a è quasi zero: per il attuale, è già al valore giusto. Quella rispetto a vale circa −4 k€, quindi a ogni passo sale di k€: 40 centesimi per iterazione, per arrivare a 22.000 €. E man mano che si avvicina la derivata cala, quindi i passi si accorciano ancora.
Basterebbe un più grande? No: nella direzione di il terreno è ripidissimo (è quel fattore 85 visto al primo passo), e con un passo più lungo oscillerebbe sempre più forte fino a esplodere. Lo vediamo subito sotto. Il valore di deve andare bene per la direzione più ripida, e così è troppo piccolo per quella più piatta.
Il problema nasce dal fatto che le due grandezze hanno scale molto diverse: la superficie vale decine di m², la colonna dell'intercetta vale sempre 1. La soluzione pratica è normalizzare i dati prima di addestrare, portando ogni variabile su una scala simile: con la normalizzazione bastano poche decine di passi. Lo vediamo nel dettaglio nell'articolo sulla discesa del gradiente e la normalizzazione.
Il learning rate
Il parametro passo è delicato. Raddoppiandolo, a 0.0002, succede questo:
| Iterazione | (k€/m²) | MSE (k€²) |
|---|---|---|
| 0 | 0 | 36.235 |
| 1 | 6,24 | 103.404 |
| 2 | −4,31 | 295.327 |
| 3 | 13,52 | 843.712 |
| 5 | 34,32 | 6.887.811 |
Ogni passo è così lungo che scavalca la valle e atterra più in alto, sul versante opposto. L'errore esplode e va a infinito. Con un passo troppo piccolo invece l'addestramento è corretto ma interminabile. Scegliere il learning rate è uno dei primi problemi pratici di chi addestra qualsiasi modello.
Quanto è buona la retta: R²
L'MSE dice quanto sbaglia la retta, ma "23,6 k€²" non significa molto da solo. Un indicatore più leggibile è l'R² (coefficiente di determinazione), che confronta la retta con il modello più stupido possibile: prevedere sempre la media, 183 k€, qualunque sia la superficie.
- : la retta passa esattamente per tutti i punti;
- : la retta non fa meglio della media;
- : fa addirittura peggio (succede quando il modello è sbagliato).
Con i nostri dati : la superficie spiega il 99% della variazione dei prezzi. È un valore altissimo, ma i dati sono inventati e volutamente puliti. Su dati reali di immobili è normale trovare valori molto più bassi, perché il prezzo dipende da tante cose oltre ai metri quadri.
I limiti
La regressione lineare è semplice, veloce e facile da interpretare. Ma funziona solo se se ne rispettano le ipotesi.
I dati devono avere un andamento lineare. Se la relazione è curva (ad esempio la velocità di download in funzione del numero di utenti connessi, che crolla oltre una soglia), una retta la approssima male qualunque siano e . In questi casi si trasformano le variabili o si usa un modello diverso.
Gli outlier pesano tantissimo. Il quadrato amplifica gli errori grandi: un singolo attico venduto a 900 k€ inclinerebbe tutta la retta verso di sé, peggiorando le previsioni per tutti gli altri appartamenti. Prima di addestrare conviene guardare i dati.
Fuori dai dati, la retta non sa niente. Abbiamo osservato appartamenti tra 40 e 120 m². Chiedere il prezzo di un monolocale da 15 m² o di una villa da 400 m² significa fidarsi di una retta proprio dove non c'è alcuna prova che valga. Per la retta prevede 22 k€, un appartamento di zero metri quadri che costa qualcosa: serve a posizionare la retta, non ha un significato reale.
Correlazione non è causalità. Una retta che lega bene due grandezze non dice che una causa l'altra. Le vendite di gelati e gli annegamenti crescono insieme, ma il motivo è un terzo fattore, l'estate. La regressione misura che due cose si muovono insieme, non perché.
Più di una variabile
Nel mondo reale il prezzo dipende anche da piano, zona, anno di costruzione. La regressione lineare multipla generalizza la retta:
Con due variabili non è più una retta ma un piano, con di più un "iperpiano" che non si riesce a disegnare. L'idea però non cambia: un peso per ogni variabile, si minimizza l'MSE, con i minimi quadrati o con la discesa del gradiente. Per il caso matriciale leggere l'articolo sulla regressione lineare multipla; quanto ci si può fidare dei parametri stimati è invece il tema di quanto fidarsi dei minimi quadrati.
Un singolo neurone di una rete neurale fa esattamente questo calcolo, una somma pesata più un termine costante, e poi ci applica una funzione non lineare. Impilando migliaia di neuroni si ottengono modelli capaci di riconoscere immagini o generare testo, ma alla base c'è sempre quella somma pesata e lo stesso addestramento a passi.
Per prendere la mano ho preparato un lab interattivo e un set di esercizi con soluzioni.
Riepilogo
- La regressione lineare cerca la retta che meglio riassume la relazione tra due grandezze.
- "Migliore" significa con il più basso errore quadratico medio (MSE): i residui si elevano al quadrato, così non si annullano e gli errori grandi pesano di più.
- Con i minimi quadrati e si calcolano con una formula esatta.
- La discesa del gradiente arriva allo stesso risultato per tentativi; è il metodo con cui si addestrano le reti neurali. Il learning rate va scelto con cura: troppo grande diverge, troppo piccolo non finisce mai.
- R² dice quanto la retta fa meglio del prevedere sempre la media.
- Attenzione a relazioni non lineari, outlier, previsioni fuori dall'intervallo dei dati e alla differenza tra correlazione e causalità.