Estratto del documento

Polytechnic University of Bari

Department of Electrical and Information Engineering

Master's Degree in Computer Science Engineering (Information Systems)

ML Appunti

Artificial Intelligence and Machine Learning

Professor: Tommaso Di Noia

A.Y. 2021/2022

Date: 30/11/2021

Machine Learning System

Vogliamo capire le diverse parti che abbiamo nella costruzione di un intero sistema di ML:

  • Qual è la rappresentazione che usiamo? È l'ipotesi che definiamo nel nostro modello per provare a predire una task di class o regressione.
  • Poi abbiamo una fase di ottimizzazione che può essere fatta usando il gradient descent o una procedura nel classification o regression trees. Possiamo includere altri algoritmi come greedy search.
  • Dobbiamo anche valutare le capacità del nostro modello per eseguire una specifica task. Questo aspetto è chiamato evaluation. È l'assegnazione di valori numerici alle performance del nostro modello.
  • L'obiettivo: quindi di creare un modello in grado di raggiungere questo tipo di goal.

ML System Life Cycle

Questo è il ciclo di vita di un sistema di Machine Learning:

Eseguiamo un primo step dove analizziamo i dati e pre-processiamo i dati e abbiamo un dataset fornito da qualcuno. Poi vogliamo definire un modello e allenarlo sul nostro training set estratto dal dataset. Poi vogliamo valutare il modello da unseen (mai visti) samples (ciò che chiamiamo test set). Infine, dal momento che abbiamo un modello finale creiamo un’applicazione che incapsula il nostro modello ML e inserire questa applicazione dove vogliamo. Questa applicazione riceve nuovi dati, nuove info dall'utente e possiamo valutare ulteriormente le performance del nostro modello.

Data Analysis e Pre-processing

Possiamo iniziare dall'inizio: Vogliamo analizzare e pre-processare i dati. Parlando dell'analisi dei dati. Il problema di quando riceviamo un nuovo dataset, le info sul dataset possono presentare dei problemi, possono essere sporche (possiamo avere dei valori mancanti), possiamo quindi trovare errori in questi dataset forniti da persone esterne. Qui il problema è detto GIGO: garbage in – garbage out, ovvero la situazione in cui inseriamo nel nostro modello di machine learning è garbage (spazzatura).

Un’analisi e pulizia accurata dei dati è necessaria. Questa fase di pre-processing solitamente richiede tanto tempo. Quindi cosa intendiamo per data cleaning o data pre-processing:

  • Pulizia dei dati: prima di tutto dobbiamo rimuovere i datapoints molto diversi da altri per evitare problemi. Questi tipi di datapoints sono chiamati outliers. Successivamente vogliamo aggiustare (regolare) i nostri data per rimuovere il rumore e i duplicati.
  • Possiamo cambiare i dati: Se ci concentriamo su cosa fare dopo aver pulito i dati, ci sono altre operazioni. Ad esempio, in alcune situazioni avere variabili continue, non è un’ottima cosa. In alcuni casi quello che vogliamo è avere solo una label specifica da usare. O realizziamo che in alcuni casi le info che abbiamo non sono significative per allenare il modello. Ciò che possiamo fare è:
    • Discretizzare i dati, selezionando alcune colonne ad es. e trasformare i valori di queste colonne in interi ad esempio oppure in float.
    • Aggregare i valori di diverse colonne, ottenendo nuovi valori.
    • Normalizzare i dati.

Solitamente queste operazioni non sono sufficienti per fare ciò che vogliamo. Un'altra fase di pre-processing riguarda la creazione di nuovi attributi.

Metodo di Rimozione degli Outliers (Boxplot)

Possiamo concentrarci sul boxplot, un metodo per rimuovere gli outliers. Questo metodo funziona nel seguente modo: Divide i dati nel dataset in delle quantità chiamate Quartili. Questi quartili sono dei valori che parzializzano i nostri dati sulla base di alcune informazioni, in questo caso sul valore medio. Quindi con i quartili dividiamo il nostro dataset in 4 diversi sets oppure possiamo splittare il nostro dataset in 10 o 100 parti, ottenendo i Decili e Percentili.

Vediamo un esempio: Abbiamo un insieme di valori ordinati e sono il nostro dataset. Ciò che vogliamo fare è sfruttare i Quartili e identificare e rimuovere gli outliers. Quindi la prima operazione da fare è calcolare il valore di Q2 (che divide a metà il dataset) e poi trovare Q1 e Q3.

Sul lato destro possiamo vedere che il valore di Q2, dal momento in cui questo è un dataset di eventi, può essere ottenuto sommando 20 e 21 e dividendo per 2. Facciamo lo stesso per Q1 e Q3. Quindi otteniamo 3 diversi valori. Possiamo vedere nel plot che abbiamo rappresentato il valore minimo (Q1), al centro il valore medio (Q2) e il valore massimo (Q3). Sulla base di Q1, Q2, Q3 abbiamo generato il boxplot. Questo box è chiamato boxplot.

Vediamo quindi come usare queste informazioni per consentire la rimozione degli outliers. Per fare ciò possiamo calcolare una nuova quantità chiamata range interquartile (IQR) = Q3 - Q1. Sto calcolando quindi la distanza tra Q1 e Q3. Questo IQR in questo esempio = 4. IQR è molto importante in quanto ci consente di calcolare gli outliers, perché possiamo combinare questa informazione con Q1 e Q3, usando questo IQR come un pilastro che inseriamo al di fuori del nostro boxplot, valutando quali sono gli outliers e quali no. Per valutare quali sono gli outliers e quali no, diciamo che: Tutti i valori minori di Q1-1.5*IQR e tutti i valori maggiori di Q3+1.5*IQR sono considerati come outliers.

Quindi nel nostro esempio i limiti superiori e inferiori sono:

  • Limite inferiore (Q1-1.5*IQR): 17.5 – 1.5*4 = 11.5
  • Limite superiore (Q3+1.5*IQR): 21.5 + 1.5*4 = 27.5

E quindi i valori < 11.5 e > 27.5 sono considerati outliers. Nel nostro esempio il valore 2 è un outlier. Usando questa tecnica possiamo controllare se ci sono datapoints che dovrebbero essere rimossi dal dataset prima che sia usato.

Normalizzazione

Dopo aver fatto questo tipo di operazioni possiamo normalizzare i dati. Sappiamo che ci sono diversi tipi di normalizzazioni, le più usate sono min-max e z-score normalizzation. La min-max normalizzation è influenzata però dal valore di outliers. Perché in questo caso nel calcolo del minimo e del massimo consideriamo gli outliers che influenzano negativamente questi valori.

Quindi cosa accade nell'esempio precedente se non abbiamo rimosso gli outliers? Il nostro minimo (2) non è quello corretto in quanto è un outlier. Mentre per la z-score normalizzation è anch'essa influenzata dalla presenza degli outliers ma meno rispetto alla min max normalizzation perché qui calcoliamo la media e la deviazione standard che sono meno influenzate rispetto al calcolo del minimo o del massimo.

Feature Selection

Forse non tutte le features sono importanti allo stesso modo per eseguire la task di ML. Forse possiamo rimuovere alcune features:

Cosa possiamo usare per rimuovere features?

  • Domain experts (persone, esperti), che conoscono il contesto di applicazione e sapere quali features non influenzeranno sulla task di ML
  • Filtri: quindi misurare l'importanza di ogni feature per definire delle classi di importanza (es. Information Gain, Entropy, Mutual Information)
  • Wrappers: metodo iterativo per trovare un buon subset di features
  • Riduzione delle dimensioni (PCA, SVD)

Come Valutare le Ipotesi

Abbiamo bisogno di definire un modo per analizzare e valutare le nostre ipotesi e le performance. Quello che vogliamo è avere unseen samples (samples mai visti) per testare il modello. Il dataset originale è splittato in training set e test set, per fare ciò con un ratio solitamente 80%-20%.

Come possiamo testare il modello? Ci sono diversi modi per farlo, perché abbiamo definito una funzione di costo per fare ciò e in dettaglio ciò che vogliamo è minimizzare questa funzione di costo. In particolare, usando il training set, quello che vogliamo è trovare il migliore valore di theta che minimizzi la funzione di errore (Jtheta).

Quando abbiamo ottenuto questi theta value possiamo fissarli e usare i datapoints presenti nel test set (20%) per testare il nostro modello e valutarlo, calcolando l'errore su questi samples, usando i theta parametri trovati e fissati prima. Possiamo fare lo stesso per la logistic regression.

Ma dobbiamo ricordare che il nostro scopo finale è un altro, ovvero trovare un modello in grado di generalizzare bene. Cosa vuol dire? Immaginiamo di allenare il nostro modello sui dati di training, e otteniamo un modello tale che l'errore sui samples del training set è quasi nullo. Sembrerebbe un ottimo modello, ma lo è solo per quel training set; quindi, usando altri samples diversi da quelli presenti nel training set, riusciremmo ad avere sempre un errore così basso? NO, perché siamo in condizione di overfitting.

In generale possiamo dire che l'errore che otteniamo sui data di training è una sottostima dell'errore reale in questo caso, in quanto, usiamo training data per allenare il nostro modello e usiamo li stessi dati per valutare il modello. Quindi se usiamo questi dati per valutare il modello, avremo una sottostima dell'errore di generalizzazione.

Per ottenere un errore di generalizzazione affidabile, quello che abbiamo bisogno è di effettuare la valutazione su dati che non stati mai usati (valutazione, training, ecc.). Questo è l'unico modo che abbiamo per evitare la sottostima dell'errore di generalizzazione.

Model Selection

Possiamo immaginare che abbiamo dieci diverse ipotesi. Supponiamo che queste siano diversi polinomi di linear o logistic regression. Vogliamo scegliere il miglior modello. Sulla base di ciò che abbiamo detto, possiamo allenare il primo modello sul train e valutarlo sul test set. Lo stesso per tutti i modelli. Alla fine, troveremo che uno dei modelli ha il minor errore sul test set e supponiamo sia il quinto modello.

La domanda ora è: questo modello generalizza al meglio? Non lo sappiamo, perché possiamo dire che questo è il generalization error, ma è quello l'errore di generalizzazione? Perché noi usiamo questo valore, ovvero, l'errore sul test set, per selezionare il modello. Quindi ora abbiamo coinvolto il test set nella selezione dei parametri; quindi, il test set non è usato nella fase di training ma è usato nella fase di model selection.

Però non sappiamo ancora se su nuovi samples al quale applichiamo il modello se questo modello è davvero il migliore. E come detto prima se vogliamo calcolare l'errore di generalizzazione dobbiamo usare nuovi dati che non sono mai stati usati prima. Ma in questo caso abbiamo usato già il test set per selezionare il modello.

In sostanza abbiamo bisogno di un nuovo test set. Perché altrimenti non potremmo calcolare il generalization error, non potrò sapere se il mio modello sta generalizzando bene o no. Quindi ho bisogno di un nuovo test set, in quanto, se usassi solo un test set, dal momento in cui ho selezionato il modello che performa al meglio su questo specifico test set non ho garanzie che questo modello stia performando al meglio, magari lo fa solo su questo test set. Forse sono stato fortunato ottenendo un ottimo modello per il mio test set ma non vuol dire che su altri samples questo modello generalizzi al meglio e dal momento in cui utilizzo questo test set per selezionare il modello, questa è una sottostima dell'errore di generalizzazione dell'errore.

Cosa possiamo fare? Creiamo un nuovo set, splittando il dataset originale in tre parti, ad esempio:

  • 60% train set per allenare il modello
  • 20% validation set, per selezionare il modello e gli hyperparameters (lambda, learning rate, topologia della neural network e così via)
  • 20% test set, per calcolare le performance del nostro modello

Recap: Possiamo valutare le nostre performance usando il training set? NO. Perché in quel caso rischiamo una situazione di overfitting dove il modello non è assolutamente in grado di generalizzare e l'errore sui training data sarà una sottostima dell'errore di generalizzazione. Possiamo scegliere il modello che fornisce le migliori performance sul Validation Set? SI. Dobbiamo allenare il modello sul training set e validarlo usando il validation set. In questo modo siamo in grado di valutare l'errore di generalizzazione su nuovi samples (mai visti).

Cross Validation

Come possiamo creare questo validation set? Solitamente il validation set è costruito a partire da 1/3 del training set (hold-out cross validation) o possiamo usare la k-folds cross validation. L'idea è che possiamo calcolare il validation set per selezionare il modello; quindi, usiamo il training set per allenare il modello, il validation set per selezionare il modello e quindi possiamo unirli insieme ancora con il modello finale per non sprecare dati e quindi possiamo allenare il nostro modello di nuovo su tutti i training + validation data.

Ora possiamo riproporre, ricreare il nostro esempio con 10 diversi modelli, usando il validation set e quindi il validation error. Quindi analizziamo la model complexity e possiamo vedere come se incrementiamo la complessità il training error va sempre più giù, mentre il validation error decresce fino a un certo punto per poi crescere sempre di più all'aumentare della complessità. Quindi è intuitivo capire che dobbiamo trovare un compromesso per trovare la giusta complessità del modello. Sulla base di ciò che abbiamo imparato di ora, possiamo ricreare il nostro esempio precedente dove abbiamo 10 diversi modelli basati su 10 diversi polinomi e vogliamo valutarli. Quindi li alleniamo sul training set, li valutiamo sul validation set e sulla base di ciò possiamo trovare il modello (ad esempio il 5° polinomio). Quindi prendiamo il 5° polinomio e possiamo valutarlo usando il test set. Questo è il modo giusto per fare questo tipo di operazioni.

Model Evaluation

Ci sono diverse tecniche per creare training set e validation set, in generale per splittare il nostro dataset:

Holdout

È la tecnica più classica, dove abbiamo un numero totale di samples e possiamo splittare i nostri dati usando diverse percentuali, in training set (diviso in training e validation set) e test set. Non è detto che siamo in grado di splittare i dati nel modo corretto, cosa vuol dire? Supponiamo che abbiamo una task di classificazione e immaginiamo che il nostro dataset è un dataset sbilanciato, ovvero ad es. 100 samples ma solo 10 sono di classe 1 o il resto di classe 0. Supponiamo di splittare i nostri dati 80%-20% e immaginiamo cosa accade se tutti i samples di classe 1 andassero nel test set. Ciò vuol dire che nel training set non siamo in grado di imparare niente riguardo la classe 1. Per risolvere questo problema possiamo usare diverse tecniche e la più usata è chiamata stratification, che si occupa di riproporre lo stesso ratio delle diverse classi in entrambi il training e test set. Questo è un modo per evitare questo problema.

Limiti nell’usare una sola coppia training/test

Immaginiamo di avere questo holdout splitting, quali sono i problemi con questo tipo di soluzione? Immaginiamo di avere la situazione dell'esempio precedente con 100 samples. Forse sappiamo che 100 samples possono non essere abbastanza per allenare i nostri dati. Quindi quando usiamo l'holdout nei casi in cui i samples possono non essere abbastanza per allenare i dati, stiamo perdendo il 20% di dati per allenare il modello e quindi ciò che potremmo fare è ridurre la percentuale del test set, per usare più training data. Il problema è però che maggiore è il test set, più affidabile è l'evaluation. Quindi ciò che vogliamo è trovare un compromesso tra avere un grande training set (rappresentativo di tutte le possibili situazioni che possiamo avere nel nostro dataset) e un grande test set (che può valutare meglio il nostro modello).

Possiamo quindi immaginare che un singolo holdout split non è abbastanza per valutare e usare la maggior parte dei nostri dati. Per questo motivo si utilizza un'altra strategia chiamata K-folds Cross Validation.

K-Folds Cross Validation

Fin ora abbiamo visto che l'holdout strategy ha alcuni limiti; quindi, in ML ciò che facciamo è realizzare una strategia leggermente più complessa chiamata K-folds cross validation. Vediamo come funziona:

Inizialmente decidiamo un numero: K e poi splittiamo questo dataset usando questo valore. Ad es. se k=4, possiamo splittare il nostro dataset in 4 diversi folds (pieghe). Quindi stiamo partizionando i nostri dati, quindi partizioniamo il nostro dataset in K (4 nell’es.) diverse e distinte pieghe (partizioni). Quindi possiamo eseguire il primo esperimento in cui prendiamo la prima fold e la trattiamo come se fosse un test set e quindi le restanti folds ovvero 2,3 e 4 saranno aggregate e saranno il training set (questo per la prima fold – Experiment 1). Quando finiamo con l’experiment 1, passiamo al 2, dove in questo caso il test set sarà la fold 2 e le altre insieme formeranno il training set. E così via per gli altri Esperimenti (3 e 4).

Il vantaggio di questa strategia è che possiamo usare tutti i dati come train e tutti i dati come test set, ovviamente in diversi esperimenti.

Random Subsampling

Immaginiamo di avere un dataset più o meno grande composto da 1 milione di samples. Possiamo immaginare di usare 5-folds cross validation. In questa situazione useremo un grande numero di samples per ogni test set, perché useremo 1.000.000/5 = 200.000 samples per ogni test set e in alcuni casi potrebbe essere un po’ troppo, cioè un po’ troppi samples che stiamo togliendo al training set. Proviamo quindi con una 10-fold cross validation e in questo caso ogni test set avrà 100.000 samples, ma eseguire una 10-fold cross validation significa eseguire 10 diversi experiments.

Anteprima
Vedrai una selezione di 10 pagine su 175
Appunti completi del corso di Machine Learning Pag. 1 Appunti completi del corso di Machine Learning Pag. 2
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 6
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 11
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 16
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 21
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 26
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 31
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 36
Anteprima di 10 pagg. su 175.
Scarica il documento per vederlo tutto.
Appunti completi del corso di Machine Learning Pag. 41
1 su 175
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Ingegneria industriale e dell'informazione ING-IND/14 Progettazione meccanica e costruzione di macchine

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher pyter9 di informazioni apprese con la frequenza delle lezioni di Machine learning e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Bari o del prof Di Noia Tommaso.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community