Fondamenti di Machine Learning — Linear Regression
Dal modello alla sua applicazione
Modello regressione lineare
Vogliamo trovare il modello lineare più semplice che si adatti ai nostri dati per ottenere previsioni su nuovi dati
Nel nostro caso consideriamo l’equazione di una linea: y = mx + q; dove m è la pendenza (coefficiente angolare) e q è l’intercetta.
Se scrivessimo quell’equazione come
avremmo che:
· y è il nostro output target;
· X è la nostra caratteristica (feature);
· W sono i due parametri che dobbiamo imparare.
Se lo scrivessimo in forma matriciale e se
potremmo scrivere l’equazione come la matrice dei parametri trasposta per la design matrix, cioè
Conviene trasformarla in forma matriciale per una maggiore efficienza computazionale.
La regressione lineare è uno strumento statistico tradizionale che si adatta a una linea retta come modello:
Calcola il gradiente della perdita (vedremo in seguito) e stima la linea più performante.
Dobbiamo trovare quella retta che ha in media la distanza minore con questi punti.
Vogliamo che w0 e w1 abbiano una linea che abbia la distanza minima dal nostro punto. Chiamiamo l’output del nostro modello lineare y*=F(xi,W). Vogliamo il miglior W che minimizzi la seguente funzione di costo (trovare i minimi):
Per minimizzare questa funzione dovremmo calcolare la derivata (gradiente) di rispetto a W e trovare dove questa derivata è uguale a 0:
Al fine di semplificare il calcolo del gradiente, la funzione di costo viene solitamente definita con un’aggiunta del due al denominatore.
Minimizzazione funzione di costo J(w) — Algoritmo di discesa del gradiente
Questa è la funzione di costo con due parametri che vogliamo minimizzare. Vogliamo andare quindi verso il centro di questa conca. Per fare questo utilizziamo l’algoritmo di discesa del gradiente (Gradient Descent, GD):
· Iniziamo con una scelta casuale di W;
· Continua a cambiare W per ridurre J (W) fino a quando speriamo di finire al minimo;
· I pesi vengono aggiornati contemporaneamente.
Mi sposto di piccoli passi per andare verso il minimo. Mi sposto in direzione opposta al gradiente, cioè mi allontano dal massimo.
Attenzione, sotto determinate ipotesi è garantita l’esistenza del minimo, per altre invece no. Non possiamo sapere se quello che abbiamo trovato è un minimo locale o un minimo globale.
Si ripete questa operazione fino alla convergenza, cioè quando:
α (learning rate) rappresenta la lunghezza del passo che faccio nei miei “spostamenti”. Se questo è molto grande, questo spostamento è molto più veloce ma meno preciso.
Ora ipotizziamo di avere un’altra funzione di loss più complessa (situazione realistica), partiamo scegliendo due parametri casuali
Applichiamo l’algoritmo
La scelta del learning rate è importante per determinare la precisione dell’algoritmo.
Stochastic-Gradient Descent (SGD)
La discesa del gradiente utilizza l’intero set di allenamento per calcolare i gradienti ad ogni passo. Per questo motivo è molto lento quando il set di allenamento è grande.
Stochastic-Gradient Descent sceglie un’istanza casuale nel set di allenamento ad ogni passo e calcola i gradienti in base solo a quella singola istanza. È più veloce e consente di allenarsi su enormi set di allenamento (meno memoria richiesta). A causa della sua natura casuale, SGD è meno regolare del Gradient Descent. Invece di diminuire delicatamente fino al minimo, la funzione di costo rimbalzerà su e giù, diminuendo solo in media.
I valori dei parametri finali sono buoni ma nessuna garanzia di risultati ottimali.
Quando la funzione è molto irregolare, SGD può aiutare a saltare un minimo locale.
Regressione lineare in python
Scikit-learn
La regressione lineare è disponibile nel modulo python scikit-learn.
Esempio delle case:
· Importiamo il modello lineare;
· Importiamo la metrica mean_squared_error (MSE,è quanto sbaglia in media il mio algoritmo);
· Dividiamo il feature e label in test e train.
· Creiamo il modello regr;
· Chiamiamo .fit su regr (vuol dire training), reshape serve per non avere errore da sklearn perché non è realistico fare train su una sola feature. y_train viene passato perché è un apprendimento supervisionato;
· Una volta addestrato possiamo fare predizioni sul nostro test-set;
· Chiamiamo .predict su regr;
· Stampiamo i risultati;
· Stampiamo il mean_squared_error.
Visualizziamo i risultati.
Analisi dei risultati
Stiamo calcolando l’errore quadrato medio sul set di test cercando di capire se il nostro modello è buono o meno.
Qual è la risposta?
· MSE = 85318750,59;
· Tuttavia, MSE non è nella stessa unità dei nostri campioni;
· Un’idea: radice mean square error: 9236.814958911717.
È buono o no? Dipende: se la predizione delle case è un milione di dollari, un errore di 9236 dollari è marginale; se la casa costa 100 mila e sbaglio di 10 mila, sto sbagliando del 10% che non è così marginale.
Alcuni problemi di questo modello creato:
· I dati sono puramente inventati, quindi non possiamo aspettarci grandi risultati (i dati sono importanti, l’IA non è magia);
· Forse un polinomio o un modello non lineare potrebbero essere scelte migliori;
· Il set di dati è troppo piccolo:
— I dati sono importanti e abbiamo bisogno del set di dati di osservazione più ampio che è possibile;
— L’overfitting e l’underfitting possono essere rilevanti con un piccolo set di dati.
Un modello “appreso dai dati” è generalmente valido quanto i dati da cui è stato derivato.
Un buon set di dati dovrebbe essere:
· Grande;
· Corretto (influenzato dal rumore il meno possibile);
· Consistente (gli esempi non devono essere contraddittori e un pattern dovrebbe esistere);
· Ben bilanciato (tutte le classi adeguatamente rappresentate).
I.I.D Assumptions
I dati di addestramento e test sono generati da una distribuzione di probabilità su set di dati chiamata “processo di generazione di dati”.
In genere facciamo una serie di ipotesi conosciute collettivamente come assunzioni i.i.d:
· Gli esempi nel dataset sono indipendenti l’uno dall’altro e che il set di training e il set di test sono distribuiti in modo identico (identically distributed) (I.I.D);
· I set di allenamento e test sono tratti dalla stessa distribuzione di probabilità. Comunemente nota anche come ipotesi del generatore ideale: esiste una distribuzione di probabilità di ogni fenomeno e il nostro set di dati è solo un insieme di osservazioni che abbiamo raccolto su questa distribuzione. Speriamo che il nostro set di dati sia rappresentativo dell’intera distribuzione!
Vogliamo assolutamente evitare l’overfitting, è molto difficile da risolvere (l’algoritmo di apprendimento memorizza il set di training invece di imparare le regole generali, il modello si comporta bene sui dati di training, ma non generalizza bene).
Supponiamo di avere una distribuzione di probabilità p(x,y) e di campionare da essa ripetutamente per generare il training set e il set di test.
Formiamo un modello, e per alcuni valori fissi w:
· Se l’errore del set di training previsto è esattamente lo stesso dell’errore del set di test previsto, siamo ok poiché i dati vengono estratti (in teoria) dalla stessa distribuzione;
· Se l’errore del set di test è “maggiore” dell’errore del set di allenamento: probabilmente overfitting;
· Se l’errore di allenamento è grande di per sé: probabilmente underfitting.
I fattori che determinano le prestazioni di un algoritmo di apprendimento automatico sono la sua capacità di:
· Ridurre l’errore di formazione;
· Ridurre il divario tra l’allenamento e l’errore di test.
Possiamo controllare se un modello ha maggiori probabilità di overfit o underfit modificandone la capacità.
Capacità
La capacità del modello è l’abilità del modello di adattarsi a un’ampia varietà di funzioni:
· I modelli con bassa capacità possono avere difficoltà a adattarsi al training-set (underfitting)
· I modelli ad alta capacità possono overfittare memorizzando le proprietà del training-set che non sono utili per il test-set e per la generalizzazione
Un modo per controllare la capacità di un algoritmo di apprendimento è scegliere il suo spazio di ipotesi: l’insieme di funzioni che l’algoritmo di apprendimento è autorizzato a selezionare come soluzione.
Ad esempio, l’algoritmo di regressione lineare ha l’insieme di tutte le funzioni lineari del suo input come suo spazio di ipotesi:
Esempio:
Abbiamo un set di dati di punti (cerchio blu) generati dalla funzione sin(2πx) + N (un rumore casuale). Il nostro obiettivo è quello di prevedere il valore di t per un nuovo valore di x, senza la conoscenza della curva verde (sin(2πx)) e di come questo set di dati è stato generato.
Il valore di x è la nostra singola caratteristica, il valore t è il nostro valore target per imparare e prevedere.
Domanda: È un task(compito) di regressione, ma come possiamo selezionare l’ordine M del polinomio?
Sicuramente non è una retta (si vede a occhio che ha un andamento ondulatorio). Vado ad aumentare di volta in volta il valore del mio polinomio (il valore di M).
Se M=9 la funzione è troppo complessa, siamo in overfitting. Prestare attenzione al grafico a destra per verificare l’andamento dell’errore in test e in training.
Questo risultato è “strano” per le serie di Taylor perché, per la nostra funzione, più si aumenta il grado più si approssima meglio. Come mai abbiamo questo risultato?
Il valore che stanno acquisendo i nostri pesi (w) che moltiplicano le x, a un certo punto diventano molto molto grandi. Stiamo dando molta importanza al training set.
Se usassimo un set di dati più grande con N = 100 campioni l’overfitting diventerebbe meno grave.
Euristica approssimativa: il numero di punti dati non deve essere inferiore a un multiplo (ad esempio 5 o 10) del numero di parametri nel modello.
Regolarizzazione L2
Per controllare il fenomeno dell’over-fitting una tecnica comune prevede l’aggiunta di un termine di penalità alla funzione di costo al fine di scoraggiare i coefficienti dal raggiungere grandi valori.
I termini di penalità più semplici sono la somma dei quadrati di tutti i coefficienti:
Questo caso particolare di un regolarizzatole quadratico è chiamato Ridge regression e nel contesto delle reti neurali è noto come decadimento di peso (Weight decay).
Se impostiamo il parametro di regolarizzazione λ su un valore grande, quando minimizziamo forziamo i pesi (la sommatoria) ad essere molto piccoli.
Validation set
Quando dobbiamo selezionare un modello o provare diversi valori di qualsiasi iperparametro per progettare il nostro algoritmo o per controllare la capacità del modello, non possiamo usare il set di test!
Ecco perché il test-set è necessario per misurare l’errore di generalizzazione finale del nostro modello e il nostro modello non deve essere progettato “adatto” al nostro test-set, altrimenti non possiamo misurare l’errore di generalizzazione! Quindi introduciamo un terzo set chiamato Validation-set (estratto dal training set).
Riassumendo
Per ricapitolare:
· Training-Set: il set di dati da cui impariamo;
· Validation-set: un set di dati che utilizziamo per ottimizzare i parametri del modello;
· Test-Set: Un set di dati che deve includere modelli che descrivono lo stesso problema che non appartengono al set di addestramento e che NON SI DEVE MAI USARE fino alla fine del training e della progettazione del modello. Viene utilizzato per verificare se quanto appreso in fase di training può essere correttamente generalizzato su nuovi dati.
Esempio scikit-learn
Regressione polinomiale in scikit-learn
Se vogliamo adattare un paraboloide ai dati invece di un piano, possiamo combinare le caratteristiche in polinomi del secondo ordine, in modo che il modello sia simile a questo:
È ancora lineare:
Dobbiamo trasformare la matrice di dati di input in una nuova matrice di dati di un dato grado. Da
a
Nel seguente modo:
L2 reguralization in scikit-learn: