Sei sulla pagina 1di 44

Progetto

di sistemi intelligenti
Time Series Neural Network
Fabio Aiuto Federico Bianucci Irene Bont

Sommario
Corali di Bach .................................................................................................................................................... 3 Obiettivi ........................................................................................................................................................ 3 Risoluzione .................................................................................................................................................... 4 Suddivisione dei dati ..................................................................................................................................... 7 Grafici .......................................................................................................................................................... 11 Advanced Script .......................................................................................................................................... 15 Dati significativi ........................................................................................................................................... 17 Osservazioni ................................................................................................................................................ 18 Cosa fare perci? ........................................................................................................................................ 19 Predizione dei picchi di ozono nellaria .......................................................................................................... 20 Obiettivi ...................................................................................................................................................... 20 Elaborazione dei dati .................................................................................................................................. 20 Addestramento ........................................................................................................................................... 23 Grafici .......................................................................................................................................................... 25 Osservazioni ................................................................................................................................................ 27 Conclusioni .................................................................................................................................................. 42


Indice delle figure
Figura 1 - Importazione dati .............................................................................................................................. 4 Figura 2 - Creazione delle variabili .................................................................................................................... 4 Figura 3 - nnstart ............................................................................................................................................... 5 Figura 4 - Rete NAR ........................................................................................................................................... 5 Figura 5 - Selezione dei dati .............................................................................................................................. 6 Figura 6 - Suddivisione dei dati ......................................................................................................................... 8 Figura 7 - Training ............................................................................................................................................. 9 Figura 8 - Addestramento della rete ............................................................................................................... 10 Figura 9 - Grafico della Performance .............................................................................................................. 11 Figura 10 - Grafico dell'autocorrelazione dell'errore ...................................................................................... 12 Figura 11 - Grafico della risposta della serie storica ....................................................................................... 13 Figura 12 - Istogramma dell'errore ................................................................................................................. 13 Figura 13 - Grafico della regressione .............................................................................................................. 14 Figura 14 - Rete neurale NAR in anello chiuso ................................................................................................ 16 Figura 15 - Addestramento della nuova rete .................................................................................................. 18 Figura 16 - Grafico della performance ............................................................................................................ 19 Figura 17 - Rete neurale NARX ........................................................................................................................ 23 Figura 18 - Addestramento della rete ............................................................................................................. 24 Figura 19 - Grafico della performance ............................................................................................................ 25 Figura 20 - Grafico dell'autocorrelazione dell'errore ...................................................................................... 26 Figura 21 - Grafico della correlazione tra input e errore ................................................................................ 26 Figura 22 - Addestramento della nuova rete .................................................................................................. 29 Figura 23 - Grafico della performance ............................................................................................................ 30 Figura 24 - Grafico dell'autocorrelazione dell'errore ...................................................................................... 31 Figura 25 - Grafico della regressione .............................................................................................................. 31 Figura 26 - Grafico della correlazione di input e errore .................................................................................. 33 Figura 27 - Addestramento della rete finale ................................................................................................... 34 Figura 28 - Grafico della performance ............................................................................................................ 35 Figura 29 - Grafico dell'autocorrelazione ........................................................................................................ 36 Figura 30 - Grafico della correlazione tra input e errore ................................................................................ 36 Figura 31 - Rete NARX in anello chiuso con funzione di trasferimento lineare .............................................. 39 Figura 32 - Valori reali predetti dalla rete ....................................................................................................... 40 Figura 33 - Rete NARX in anello chiuso con funzione di trasferimento a soglia ............................................. 41 Figura 34 - Grafico dei valori interi predetti dalla rete ................................................................................... 42

Corali di Bach

Obiettivi
Lo scopo del progetto analizzare una serie storica e riuscire a creare una rete neurale, addestrarla e fare in modo che riesca a prevedere come tale serie debba continuare. Sul sito dellUCI Machine Learning Repository abbiamo deciso di analizzare un dataset delle corali di Bach. Una corale una serie di note in cui ogni nota presenta determinate caratteristiche. Il dataset in questione formato da 100 corali, di cui per semplicit stata codificata in formato Lisp la sola linea del soprano (originariamente le corali erano a 4 voci). Questo perch la singola linea melodica del soprano pu essere studiata indipendentemente dalle altre voci. Con la serie in questione dovremo riuscire a creare una rete neurale che abbia capito le propriet melodiche della corale e riesca a riprodurre note nuove che mantengono le caratteristiche musicali dellintera corale. Verificheremo poi se la rete opportunamente addestrata abbia generato lavori originali e accettabili. Ogni nota delle corali codificata con 6 attributi: a) b) c) d) Tempo di partenza, misurato in sedicesimi dallinizio della corale (tempo 0). Tono, numero MIDI (60 = C4, 61 = C#4, 72 = C5, etc.). Durata, misurata in sedicesimi di nota. Chiave, numero di diesis o bemolle, positiva se la chiave ha dei diesis, negativa se la chiave ha dei bemolle. e) Tempo, in sedicesimi per battuta. f) Corona, vero o falso, dipende se la nota sta sotto corona o no. Il dominio di ogni attributo il seguente: a) b) c) d) e) f) {0,1,2,...} {60,...,75} {1,...,16} {-4,...,+4} {12,16} {0,1}

Non ci sono attributi con valori mancanti. Le sezioni ripetute (|: :|) non sono state codificate (per es. |:A:|B stato codificato come AB).

Risoluzione
Per addestrare la nostra rete abbiamo scelto la corale numero 58 del dataset, composta da 86 elementi o note. Abbiamo importato la matrice 86x6 opportunamente costruita nel workspace di Matlab dal file chorales.txt. Il dataset originario era stato codificato in linguaggio Lisp, perci, per importare la struttura in Matlab, abbiamo suddiviso ogni nota per ogni riga della matrice, mentre le colonne rappresentano i relativi attributi.


Figura 1 - Importazione dati


Figura 2 - Creazione delle variabili

Abbiamo quindi avviato il Neural Network Tool di Matlab con il comando nnstart.


Figura 3 - nnstart

Di l si scelto di usare il Time Series mediante una rete neurale NAR (nonlinear autoregressive).


Figura 4 - Rete NAR

Il nostro obiettivo quello di predire valori futuri della serie utilizzando valori passati della serie stessa. Si utilizza una rete di tipo NAR, in quanto non sono presenti variabili esogene, per cui la predizione delluscita y(t) data da d (nel nostro caso, come vedremo pi avanti, 4) valori passati di y(t). Non esistono variabili esogene perch tutti gli attributi della serie in input sono attributi dei target e che quindi vogliamo necessariamente in uscita. Le variabili esogene, invece, sono per definizione variabili che influiscono sulluscita della rete ma che non fanno parte del target.


Figura 5 - Selezione dei dati

Suddivisione dei dati


Quando si addestrano reti multilayer, occorre innanzi tutto dividere i dati in 3 sottoinsiemi. Il primo sottoinsieme il training set, che viene usato per calcolare il gradiente e aggiornare i pesi e i bias della rete. Ricordiamo che il processo di apprendimento pu essere interpretato come una discesa lungo la linea di massima pendenza individuata appunto dal gradiente. La risposta fornita dalla rete per ogni esempio viene confrontata con la risposta desiderata (target), si valuta la differenza (errore) fra le due e, in base a tale differenza, si aggiustano i pesi. Questo processo viene ripetuto sullintero training set finch le uscite della rete producono un errore al di sotto di una soglia prestabilita. Il secondo sottoinsieme il validation set. Lerrore sul validation set viene monitorato durante il processo di addestramento. Lerrore di validazione normalmente diminuisce durante la fase di addestramento, cos come lerrore sul training set. Tuttavia, quando la rete comincia ad andare in overfitting, lerrore sul validation set tipicamente comincia a salire. I pesi e i bias della rete vengono salvati al momento del minimo errore sul validation set. Tale valore anche se non il minimo assoluto rappresenta comunque il minimo errore prima che la rete non riesca a generalizzare.

Lerrore sul test set non viene usato durante laddestramento della rete, ma viene usato per confrontare modelli diversi con i pesi gi definiti. Se lerrore sul test set raggiunge un minimo ad un valore di iterazione significativamente diverso dallerrore sul validation set, questo pu indicare una cattiva divisione dei dati. Infatti i due set di dati sono generalmente simili nel caso in cui i campioni scelti sono significativi.

I dati per la validazione e il test sono stati settati entrambi al 15% dei dati originali. Con queste impostazioni, i vettori di ingresso e target saranno casualmente divisi in 3 set: Il 70% sar usato per il training Il 15% sar usato per validare la rete, ovvero per capire se la rete sta generalizzando e quindi fermare il training prima di un overfitting Il restante 15% sar usato per un test completamente indipendente sulla generalizzazione della rete.


Figura 6 - Suddivisione dei dati

La rete NAR che abbiamo creato una rete a due livelli, con una funzione di trasferimento sigmoide nello strato nascosto e una funzione di trasferimento lineare nello strato di uscita. Il numero di default di neuroni nascosti di 10, mentre il numero di default di ritardi di 2, ma in questo caso lo abbiamo cambiato a 4 per migliorare le performance della rete. Cos facendo luscita y(t) dipender dei valori della y(t) nei 4 istanti precedenti. Tale scelta legata ad una motivazione strettamente musicale in quanto il tempo in chiave della corale 4/4 indicando quindi una periodicit di base di 4 note.


Figura 7 - Training

A questo punto abbiamo addestrato la rete. Laddestramento durato 58 epoche dove unepoca rappresenta un ciclo di presentazione degli esempi del training set. Dallimmagine si vede che laddestramento andato avanti finch lerrore sulla validazione non ha smesso di diminuire dopo 6 iterazioni (validation stop).


Figura 8 - Addestramento della rete

Concluso laddestramento, si passa allanalisi dei grafici.


10

Grafici

Il primo grafico che ci viene presentato il grafico della performance del training, della validazione e del test.

Figura 9 - Grafico della Performance

Questo grafico ci consente di controllare un potenziale overfitting. Dallimmagine si vede che gli errori di addestramento, validazione e test diminuiscono tutti fino alliterazione 52, dopo la quale notiamo un incremento anche se minimo dellerrore sul validation set che indica che la rete non riesce, da quel momento in poi, a generalizzare. Vengono dunque congelati i pesi della rete ottenuti dal training set alla 52epoca. Con tale pesi la rete d un errore quadratico medio di 1,7544. Laumento dellerrore sul validation set e la contemporanea diminuzione dellerrore sul training set ci indica in presenza di un possibile overfitting. Dal validation stop in poi le prestazioni sui dati di allenamento aumentano mentre le prestazioni sui dati di test sono peggiori.

11

Interessante anche il grafico dellautocorrelazione dellerrore. Esso descrive come gli errori di predizione sono correlati nel tempo con se stessi. Per un modello di predizione perfetto, bisognerebbe che ci fosse un solo valore non nullo in corrispondenza dello 0 (questo lerrore quadratico medio). Vorrebbe dire che gli errori di predizione sono completamente scorrelati dagli altri. Il risultato ottenuto comunque molto buono in quanto le correlazioni, eccetto quella in corrispondenza dello 0, cadono approssimativamente nellintervallo di confidenza del 95%, tanto che si pu dire che il modello adeguato.


Figura 10 - Grafico dell'autocorrelazione dell'errore

12

Il grafico, invece, della risposta della serie storica mostra gli input, i target e gli errori nel tempo. Esso indica anche quali punti e in quale momento sono stati selezionati per il training, il testing e la validazione.

Figura 11 - Grafico della risposta della serie storica

Figura 12 - Istogramma dell'errore

C poi il grafico dellistogramma dellerrore che mostra il numero di volte in cui un certo valore dellerrore si presenta per i tre diversi tipi di set. Notiamo che con ci sono valori di errore significativamente lontani dallerrore nullo quindi tutte le epoche hanno prodotto un errore piuttosto basso.

13

Infine importantissimo il grafico della regressione:

Figura 13 - Grafico della regressione

Dal grafico emerge che il modello molto buono. Le rette di regressione hanno tutte un coefficiente prossimo a 1 quindi la retta ideale si sovrappone alla retta ottenuta ad ogni prova. Tale retta minimizza la somma dei quadrati degli scarti. Non essendoci pallini estremamente lontani dalla retta vuol dire che per tutte le epoche si sono registrati degli errori piuttosto bassi.

Advanced Script
Di seguito abbiamo riportato lo script generato per addestrare e testare la nostra rete.
% % % % % % % Solve an Autoregression Time-Series Problem with a NAR Neural Network Script generated by NTSTOOL Created Mon Jan 10 23:45:58 CET 2011 This script assumes this variable is defined: chorales - feedback time series.

targetSeries = tonndata(chorales,false,false); % Create a Nonlinear Autoregressive Network feedbackDelays = 1:4; hiddenLayerSize = 10; net = narnet(feedbackDelays,hiddenLayerSize); % Choose Feedback Pre/Post-Processing Functions % Settings for feedback input are automatically applied to feedback output % For a list of all processing functions type: help nnprocess net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'}; % Prepare the Data for Training and Simulation % The function PREPARETS prepares timeseries data for a particular network, % shifting time by the minimum amount to fill input states and layer states. % Using PREPARETS allows you to keep your original time series data unchanged, while % easily customizing it for networks with differing numbers of delays, with % open loop or closed loop feedback modes. [inputs,inputStates,layerStates,targets] = preparets(net,{},{},targetSeries); % Setup Division of Data for Training, Validation, Testing % For a list of all data division functions type: help nndivide net.divideFcn = 'dividerand'; % Divide data randomly net.divideMode = 'time'; % Divide up every value net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Choose a Training Function % For a list of all training functions type: help nntrain net.trainFcn = 'trainlm'; % Levenberg-Marquardt % Choose a Performance Function % For a list of all performance functions type: help nnperformance net.performFcn = 'mse'; % Mean squared error % Choose Plot Functions % For a list of all plot functions type: help nnplot net.plotFcns = {'plotperform','plottrainstate','plotresponse', ... 'ploterrcorr', 'plotinerrcorr'};

% Train the Network [net,tr] = train(net,inputs,targets,inputStates,layerStates);

15

% Test the Network outputs = net(inputs,inputStates,layerStates); errors = gsubtract(targets,outputs); performance = perform(net,targets,outputs) % Recalculate Training, Validation and Test Performance trainTargets = gmultiply(targets,tr.trainMask); valTargets = gmultiply(targets,tr.valMask); testTargets = gmultiply(targets,tr.testMask); trainPerformance = perform(net,trainTargets,outputs) valPerformance = perform(net,valTargets,outputs) testPerformance = perform(net,testTargets,outputs) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, plotresponse(targets,outputs) %figure, ploterrcorr(errors) %figure, plotinerrcorr(inputs,errors) % Closed Loop Network % Use this network to do multi-step prediction. % The function CLOSELOOP replaces the feedback input with a direct % connection from the outout layer. netc = closeloop(net); [xc,xic,aic,tc] = preparets(netc,{},{},targetSeries); yc = netc(xc,xic,aic); perfc = perform(net,tc,yc)

view(netc)

Figura 14 - Rete neurale NAR in anello chiuso

16

Dati significativi
Per trarre ulteriori conclusioni abbiamo riportato la struttura della nostra rete (net):

>> net net = Neural Network name: 'NAR Neural Network' efficiency: .cacheDelayedInputs, .flattenTime, .memoryReduction userdata: (your custom info) dimensions: numInputs: 1 numLayers: 2 numOutputs: 1 numInputDelays: 4 numLayerDelays: 0 numFeedbackDelays: 0 numWeightElements: 214 sampleTime: 1


17

Osservazioni

Abbiamo evidenziato come il numero di pesi di 214. Quando abbiamo costruito la rete sapevamo che fosse necessario dimensionare lo strato nascosto affinch il rapporto pesi/dati fosse accettabile ovvero che i dati fossero almeno 5 volte pi numerosi dei pesi.

A questo punto occorre considerare che la nostra serie composta da soltanto 86 elementi, troppo pochi per pretendere che la rete apprenda bene il comportamento da tenere. A riprova di ci ci viene incontro la struttura di yc, larray di celle contenente la serie predetta. La predizione viene fatta quando la rete termina laddestramento e vengono retroazionate le uscite. La rete a quel punto prevedr valori di y(t) solo in base a valori precedentemente predetti. Analizzando il contenuto dellarray si nota che dal punto di vista prettamente musicale esso non ha alcun senso. La rete presenta infatti grafici che evidenziano un corretto addestramento ma nonostante ci non riesce a generalizzare a causa delloverfitting. Si potrebbe pensare di ridurre i pesi della rete attraverso la riduzione dei neuroni e di ritardi ma in questo modo lerrore aumenterebbe considerevolmente. Verifichiamo quanto detto facendo una prova: lasciamo inalterato il delay e diminuiamo a 8 i neuroni dello strato nascosto:


Figura 15 - Addestramento della nuova rete


Figura 16 - Grafico della performance

numWeightElements: 172

Il numero dei pesi diminuito, ma il grafico della performance ci conferma quanto ci aspettavamo, cio che i pesi della rete vengono congelati ad un'epoca in cui lerrore quadratico medio aumentato (3,5406). E banale intuire che continuare a diminuire i neuroni dello strato nascosto porta ad un incremento dellerrore ed invece aggiungere neuroni comporterebbe un peggioramento della tendenza di overfitting e dunque predizioni senza senso.

Cosa fare perci?


In alternativa, lasciando inalterati i pesi, occorrerebbe avere serie pi lunghe, con un maggior numero di elementi. Abbiamo pensato di unire pi corali insieme, ma data la grande differenza tra di esse, ancora una volta musicalmente ci non avrebbe avuto senso. In poche parole, predire musica nuova e originale da musica gi esistente un problema veramente complesso.

19

Predizione dei picchi di ozono nellaria


Obiettivi
Lo scopo del progetto quello di analizzare una serie storica riguardante i livelli di ozono nellaria. In particolare, il dataset originale, preso sul sito dellUCI Machine Learning Repository, si riferisce alle rilevazioni giornaliere fatte dal 1998 al 2004 nelle zone di Galveston e Brazoria (Houston). Il lavoro prende spunto da una ricerca effettuata da alcuni studiosi, Forecasting skewed biased stochastic ozone days: analyses, solutions and beyond, Knowledge and Information Systems, e pubblicata nel 2008. Vogliamo riuscire a predire quali saranno i possibili giorni in presenza di un picco di ozono nellaria, addestrando la nostra rete a riconoscerli grazie alla variazione di alcuni fattori fondamentali.

Elaborazione dei dati


In questo secondo caso abbiamo a disposizione un numero ben pi elevato di dati. Ci ci permette di avere maggiori gradi di libert nel cercare di addestrare correttamente la nostra rete neurale. La rete che vogliamo costruire dovr riuscire a prevedere la presenza o meno di tasso di ozono nellaria nei giorni successivi alle rilevazioni dei dati. Il dataset originale composto da 2536 istanze, ciascuna di 74 attributi. In particolare sono stati riportati I seguenti attributi: attributo 1: data del rilevamento; attributi 2-25: velocit del vento ad ogni ora del giorno; attributi 26-27: velocit del vento massima e media giornaliera; attributi 28-51: temperatura ad ogni ora del giorno; attributi 52-53: temperatura massima e media giornaliera; attributi 54-58: temperatura, umidit, direzione del vento nord-sud, direzione del vento est-ovest, altezza alla pressione di 85 mBar; attributi 59-63: temperatura, umidit, direzione del vento nord-sud, direzione del vento est-ovest, altezza alla pressione di 70 mBar; attributi 64-68: temperatura, umidit, direzione del vento nord-sud, direzione del vento est-ovest, altezza alla pressione di 50 mBar; attributo 69: ioduro di potassio; attributo 70: incognito; attributo 71: pressione al livello del mare; attributo 72: variante del precedente; attributo 73: livello delle precipitazioni. attributo 74: livello di ozono
20

Il dataset originale presenta al suo interno valori nulli, che sono stati codificati con il carattere '?'. Per far s che tali valori potessero essere elaborati dalla nostra rete neurale, abbiamo scritto un semplice programma in C++ per sostituirli con la media tra il corrispondente valore precedente e valore successivo. Di seguito il codice:
#include <iostream> #include <fstream> #include <new> using namespace std; int main() { const int row=2000; const int col=73; char* a; double b=100000; ifstream is; is.open("dataset.txt"); if(is.fail()) { cerr<<"Impossibile aprire il file."; return 1; } ofstream os; os.open("dataset2.txt"); if(os.fail()) { cerr<<"Impossibile aprire il file."; return 1; } char* mat[row][col]; for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { is>>a; if (!strcmp(a,"?")) sprintf(a,"%g",b); mat[i][j]=a; os<<mat[i][j]<<"\t"; } os<<"\n"; } is.close(); os.close(); is.open("dataset2.txt"); if(is.fail()) { cerr<<"Impossibile aprire il file."; return 1; } os.open("dataset3.txt"); if(os.fail()) { cerr<<"Impossibile aprire il file."; return 1; } double cella; double media=0; double mat2[row][col]; system("PAUSE"); cout<<"\n"<<"\n";

21

for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { is>>cella; mat2[i][j]=cella; } } for(int i=0; i<row; i++) { for(int j=0; j<col; j++) { if (mat2[i][j]==100000) { int rigadown=i+1; while (mat2[rigadown][j]==100000) rigadown++; media=(mat2[i-1][j]+mat2[rigadown][j])/2; mat2[i][j]=media; } os<<mat2[i][j]<<"\t"; } os<<"\n"; } is.close(); os.close(); system("PAUSE"); return 0; }

Il programma apre in lettura il dataset originale (dataset.txt) e in scrittura un file temporaneo (dataset2.txt). Quindi riscrive il dataset originale nel file temporaneo, sostituendo al carattere '?' l'intero 100000 (valore non presente all'interno del dataset originale). A questo punto il programma apre il file temporaneo (dataset2.txt) in lettura e apre in scrittura il dataset definitivo (dataset3.txt), andando a sostituire ad ogni valore intero 100000 la media tra il corrispondente valore precedente e il corrispondente valore successivo, sempre che anche questo non sia un valore da modificare (in questo caso il programma scende al valore ancora successivo e cos via). Il dataset finale formato da 2000 elementi, ciascuno composto da 73 attributi. Ricordiamo che lultimo attributo di ciascuna rilevazione per lappunto il tasso di ozono presente nellaria dunque il target della nostra rete. Esso rappresenta ci che vogliamo prevedere e di conseguenza fondamentale durante laddestramento, perch i valori gi noti di ozono ci consentono di calcolare la differenza tra ci la rete produce e ci che gi conosciamo essere luscita desiderata. Abbiamo quindi stabilito che, tra tutti gli attributi, 72 (la data viene ignorata) influiscono indirettamente luscita della rete e perci sono le variabili esogene in ingresso e solo il 73 esimo attributo il target.

22

Addestramento
Per prima cosa scegliamo il tipo di rete che vogliamo creare: secondo quanto detto precedentemente la rete adatta al nostro caso la rete NARX.

La prima prova che abbiamo voluto effettuare di vedere il comportamento della rete secondo una struttura che prevede 10 neuroni nello strato nascosto e un delay pari a 2. Dunque durante laddestramento verranno prodotto uscite y(t) che dipenderanno da y(t-1), da y(t-2), da x(t-1) e da x(t-2). La y(t) ottenuta verr cos confrontata con il target y(t) e verr stabilito lerrore che la rete ha commesso. Terminato laddestramento la rete calcoler in maniera indipendente valori di y(t) che dipenderanno sempre da y(t-2), y(t-1), x(t-2) e x(t-1) ma stavolta le y non rappresentano i target bens predizioni della rete che vengono retroazionati in ingresso alla rete stessa.


Figura 17 - Rete neurale NARX

23

Per quanto riguarda la suddivisione dei dati abbiamo lasciato inalterate le percentuali di default che prevedono lutilizzo del 75% per il training set, 15% per il validation set e il 15% per il test set.


Figura 18 - Addestramento della rete

24

Grafici


Figura 19 - Grafico della performance

Dallimmagine si vede che la rete completa velocemente il processo di addestramento. Gli errori di training, validazione e test diminuiscono tutti fino alliterazione 2, dopo la quale notiamo un incremento dellerrore sul validation set, che indica che la rete non riesce, da quel momento in poi, a generalizzare. Vengono dunque congelati i pesi della rete ottenuti dal training set alla 2epoca. Con tali pesi la rete d un errore quadratico medio di 0,0466. Essendo il target formato da valori zero oppure uno, lerrore ottenuto dellordine di grandezza del 5%, quindi concludiamo che molto basso. E importante notare come la curva del test set sembra che nel tempo raggiunga alti valori dellerrore quadratico medio: tale comportamento era da noi preventivato, in quanto la rete ha un elevato numero di neuroni nello strato nascosto, per cui non vi un buon rapporto tra dati e pesi della rete. Un sovradimensionamento della rete non implica necessariamente overfitting, ma in questo caso sembra proprio essersi verificato.

25


Figura 20 - Grafico dell'autocorrelazione dell'errore

Interessante anche il grafico dellautocorrelazione dellerrore. Esso descrive come gli errori sono correlati nel tempo. Per un modello di predizione perfetto, bisognerebbe che ci fosse un solo valore non nullo in corrispondenza dello 0 (questo lerrore quadratico medio). Vorrebbe dire che gli errori di predizione sono completamente scorrelati dagli altri. Il risultato ottenuto comunque molto buono, in quanto le correlazioni, eccetto quella in corrispondenza dello 0, cadono approssimativamente nellintervallo di confidenza, tanto che si pu dire che il modello adeguato.


Figura 21 - Grafico della correlazione tra input e errore

Questo grafico mostra come gli errori sono correlati con la sequenza di input x(t). Per un modello perfetto di predizioni tutte le correlazioni dovrebbero essere 0. Nel nostro caso linput correlato con lerrore ma comunque tutte le correlazioni cadono allinterno dellintervallo di confidenza.
26

Osservazioni

Laddestramento che abbiamo effettuato ci fornisce valutazioni positive in quanto la rete riesce ad imparare con un errore basso ed i grafici ci confermano che il modello abbastanza buono. Dal grafico della performance abbiamo per individuato delloverfitting suggeritoci dallerrore sul test set. Come precedentemente detto osserviamo che, con il numero di neuroni e delay scelti, la rete sovradimensionata cio abbiamo un rapporto pesi/dati troppo alto. I dati sono 2000, numWeightElements: 1481 quindi il rapporto inferiore a 5.
net = Neural Network name: 'NARX Neural Network' efficiency: .cacheDelayedInputs, .flattenTime, .memoryReduction userdata: (your custom info) dimensions: numInputs: numLayers: numOutputs: numInputDelays: numLayerDelays: numFeedbackDelays: numWeightElements: sampleTime: 2 2 1 2 0 0 1481 1

Detto ci decidiamo di ridimensionare la rete e valutare se questo comporter un miglioramento o peggioramento del processo di addestramento. Innanzitutto abbiamo deciso di aumentare il numero di neuroni nascosti da 10 a 12. Inoltre abbiamo pensato di diminuire il numero di variabili esogene, cercando di scegliere solamente quelle fondamentali. Ad ogni attributo infatti corrisponde una variabile esogena e ci sono alcuni attributi che influiscono maggiormente sulluscita della rete piuttosto che altri, che sono poco rilevanti e che semplicemente sovradimensionano la rete. Leggendo la documentazione sul dataset abbiamo trovato riscontro in questa nostra ipotesi, quando troviamo infatti scritto: only about 10 features among these 72 features have been verified by environmental scientists to be useful and relevant, and there is neither empirical nor theoretical information as of yet on the relevance of the other 60 features.

27

Sempre studiando la documentazione siamo riusciti a circoscrivere un numero ristretto di variabili ritenute da noi fondamentali, associandole a quelle contenute nella formula che il sistema di forecasting descritto utilizza. The following equation summarizes the parametric equation and the parameters involved.
EmFactor (Tmax Tb) SRd O3 = Upwind + --------------------------------------------WSa 0.1 +WSp 0.5+ 1

in which, O3 - Local ozone peak prediction Upwind - Upwind ozone background level EmFactor - Precursor emissions related factor Tmax - Maximum temperature in degrees F Tb - Base temperature where net ozone production begins (50 F) SRd - Solar radiation total for the day WSa - Wind speed near sunrise (using 09-12 UTC forecast mode) WSp - Wind speed mid-day (using 15-21 UTC forecast mode)

Descriviamo brevemente le associazioni: La variabile O3 la variabile di uscita dal nostro sistema; La variabile Upwind stata associata alla direzione del vento al livello pi vicino a quello del mare, perci con le variabile del dataset U85 e V85; La variabile EmFactor non altro che il livello di ozono del giorno precedente, perci la nostra variabile di uscita in anello chiuso; La variabile Tmax stata associata alla variabile del dataset con lo stesso significato T_PK; La variabile Tb stata associata alla variabile del dataset T_AV, che rappresenta la temperatura media giornaliera; La variabile SRd non ha trovato associazioni nel dataset; La variabile WSa stata associata alle variabili WSR9, WSR10, WSR11 e WSR12, che indicano la velocit del vento dalle ore 9 alle ore 12; La variabile WSp stata associata alle variabili WSR15, WSR16, WSR 17, WSR18, WSR19, WSR20 e WSR21, che indicano la velocit del vento dalle ore 15 alle ore 21. Abbiamo ridotto cosi il vettore delle variabili esogene da un vettore di dimensione 72 ad un vettore di dimensione 15.

28

Proseguiamo quindi con laddestramento della nuova rete neurale. I dati sono presi dal file ozono_final.mat che comprende gli input (dataset3) ed i target (ozoneTarget).


Figura 22 - Addestramento della nuova rete

29


Figura 23 - Grafico della performance

In questo grafico notiamo che laddestramento durato 10 epoche ma la presenza del validation set ci permette di congelare i pesi della rete alla 4epoca per evitare loverfitting della rete. Lerrore quadratico medio ottenuto a tale epoca comunque abbastanza piccolo (0,060706) e ci ci fa pensare che la rete abbia imparato bene. In realt laumento dellerrore sul validation set e la contemporanea diminuzione dellerrore sul training set ci indica in presenza di un possibile overfitting. Dal validation stop in poi le prestazioni sui dati di allenamento aumentano mentre le prestazioni sui dati di test sono peggiori.

30

Anche in questo caso la rete d un grafico dellautocorrelazione abbastanza buono evidenziando la bont del modello.


Figura 24 - Grafico dell'autocorrelazione dell'errore

Sarebbe importante valutare anche il grafico della regressione, ma in questo caso notiamo che non significativo in quanto le uscite sono numeri reali e manca quindi una classificazione che le identifichi come zero oppure uno.


Figura 25 - Grafico della regressione


net = Neural Network name: 'NARX Neural Network' efficiency: .cacheDelayedInputs, .flattenTime, .memoryReduction userdata: (your custom info) dimensions: numInputs: numLayers: numOutputs: numInputDelays: numLayerDelays: numFeedbackDelays: numWeightElements: sampleTime: 2 2 1 2 0 0 409 1

La rete che abbiamo ottenuto sembra essere stata dimensionata in maniera opportuna. Abbiamo ottenuto un numero di pesi (409) allincirca cinque volte inferiore ai dati di ingresso (2000). Dai grafici che abbiamo analizzato abbiamo verificato la bont della rete che in poche epoche riesce ad apprendere con un errore quadratico medio piuttosto basso e con scarsa correlazione tra errori relativi a predizioni diverse.

Un aspetto fondamentale che ci rimane da valutare quello di capire se ci sono input x(t) che sono maggiormente correlati con lerrore della rete. In caso di forti correlazioni dovremo aggiustare la rete variando i ritardi, facendo dunque in modo che lerrore di una predizione dipenda da un numero maggiore di variabili esogene.
32


Figura 26 - Grafico della correlazione di input e errore

Dal grafico si vede che ci sono intervalli per cui la correlazione tra input ed errore elevata, ben oltre il limite di confidenza. Nella nostra rete una predizione y(t) dipende dai target y(t-1),y(t-2) e dagli input x(t-1),x(t-2). La nostra idea quella di aumentare il numero di ritardi per cercare di far dipendere lerrore da una porzione pi ampia di ingressi e quindi scorrelare lerrore dai soli due ritardi.

33

Decidiamo perci di fare unulteriore prova di addestramento utilizzando sempre 12 neuroni nascosti ma stavolta 4 ritardi in questo modo luscita y(t) dipender da y(t-1), y(t2), y(t-3), y(t-4) e da x(t-1), x(t-2), x(t-3), x(t-4). Ci aspettiamo che la rete abbia un numero di pesi maggiore del caso precedente ma una minore correlazione tra input ed errore.


Figura 27 - Addestramento della rete finale

34


Figura 28 - Grafico della performance

In questo caso notiamo un leggero aumento dellerrore quadratico medio (0.078395). Laddestramento dura 29 epoche ma alla 23 epoca vengono congelati i pesi perch da quel momento in poi vi un progressivo aumento dellerrore sul validation set quindi un possibile overfitting. Aspetto importante del grafico il test set che sembra essere stato positivo, cio ci dice che la rete in breve tempo raggiunge bassi errori di predizione e nel tempo si mantiene sempre con valori di errore piuttosto bassi. Dunque ci viene da pensare che il processo di addestramento riuscito ad insegnare alla rete a generalizzare per cui avremo una predizione molto accurata.

35


Figura 29 - Grafico dell'autocorrelazione

Anche in questo caso c scarsa correlazione tra lerrore di una predizione e gli errori su predizioni precedenti. Sono pochissimi gli istogrammi al di sopra della soglia di confidenza e perci possiamo ritenerli poco significativi.


Figura 30 - Grafico della correlazione tra input e errore

Adesso il grafico della correlazione tra input ed errore decisamente migliore. Solo al valore di ascissa 0 abbiamo un picco della correlazione, ma quello che ci aspettavamo. Per il resto notiamo che la scelta del numero di ritardi sugli ingressi sembra sia stata ottima: tutti i valori di correlazione sono dentro lintervallo di confidenza.
36


net = Neural Network name: 'NARX Neural Network' efficiency: .cacheDelayedInputs, .flattenTime, .memoryReduction userdata: (your custom info) dimensions: numInputs: numLayers: numOutputs: numInputDelays: numLayerDelays: numFeedbackDelays: numWeightElements: sampleTime: 2 2 1 4 0 0 793 1

Con questa ultima prova di addestramento della nostra rete possiamo ritenerci soddisfatti. La rete ben dimensionata; riesce ad imparare con un errore quadratico medio abbastanza buono, anche se laddestramento si interrompe per un validation stop in realt vediamo che il test ci dimostra che la rete si mantiene su livelli di apprendimento buoni.

Di seguito riportiamo lo script che esegue Matlab per laddestramento e la predizione della nostra rete neurale:
% Solve an Autoregression Problem with External Input with a NARX Neural Network % Script generated by NTSTOOL % Created Tue Jan 11 10:13:16 CET 2011 % % This script assumes these variables are defined: % % dataset3 - input time series. % ozono - feedback time series. inputSeries = tonndata(dataset3,false,false); targetSeries = tonndata(ozono,false,false); % Create a Nonlinear Autoregressive Network with External Input inputDelays = 1:4; feedbackDelays = 1:4; hiddenLayerSize = 12; net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize); % Choose Input and Feedback Pre/Post-Processing Functions

37

% Settings for feedback input are automatically applied to feedback output % For a list of all processing functions type: help nnprocess % Customize input parameters at: net.inputs{i}.processParam % Customize output parameters at: net.outputs{i}.processParam net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'}; net.inputs{2}.processFcns = {'removeconstantrows','mapminmax'}; % Prepare the Data for Training and Simulation % The function PREPARETS prepares timeseries data for a particular network, % shifting time by the minimum amount to fill input states and layer states. % Using PREPARETS allows you to keep your original time series data unchanged, while % easily customizing it for networks with differing numbers of delays, with % open loop or closed loop feedback modes. [inputs,inputStates,layerStates,targets] = preparets(net,inputSeries,{},targetSeries); % Setup Division of Data for Training, Validation, Testing % The function DIVIDERAND randomly assigns target values to training, % validation and test sets during training. % For a list of all data division functions type: help nndivide net.divideFcn = 'dividerand'; % Divide data randomly % The property DIVIDEMODE set to TIMESTEP means that targets are divided % into training, validation and test sets according to timesteps. % For a list of data division modes type: help nntype_data_division_mode net.divideMode = 'value'; % Divide up every value net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100; % Choose a Training Function % For a list of all training functions type: help nntrain % Customize training parameters at: net.trainParam net.trainFcn = 'trainlm'; % Levenberg-Marquardt % Choose a Performance Function % For a list of all performance functions type: help nnperformance % Customize performance parameters at: net.performParam net.performFcn = 'mse'; % Mean squared error % Choose Plot Functions % For a list of all plot functions type: help nnplot % Customize plot parameters at: net.plotParam net.plotFcns = {'plotperform','plottrainstate','plotresponse', ... 'ploterrcorr', 'plotinerrcorr'}; % Train the Network [net,tr] = train(net,inputs,targets,inputStates,layerStates); % Test the Network outputs = net(inputs,inputStates,layerStates); errors = gsubtract(targets,outputs); performance = perform(net,targets,outputs) % Recalculate Training, Validation and Test Performance trainTargets = gmultiply(targets,tr.trainMask); valTargets = gmultiply(targets,tr.valMask); testTargets = gmultiply(targets,tr.testMask); trainPerformance = perform(net,trainTargets,outputs)

38

valPerformance = perform(net,valTargets,outputs) testPerformance = perform(net,testTargets,outputs) % View the Network view(net) % Plots % Uncomment these lines to enable various plots. %figure, plotperform(tr) %figure, plottrainstate(tr) %figure, plotregression(targets,outputs) %figure, plotresponse(targets,outputs) %figure, ploterrcorr(errors) %figure, plotinerrcorr(inputs,errors) % Closed Loop Network % Use this network to do multi-step prediction. % The function CLOSELOOP replaces the feedback input with a direct % connection from the outout layer. netc = closeloop(net); netc.name = [net.name ' - Closed Loop']; view(netc) [xc,xic,aic,tc] = preparets(netc,inputSeries,{},targetSeries); yc = netc(xc,xic,aic); closedLoopPerformance = perform(netc,tc,yc) plot(cell2mat(yc),'bo')


Figura 31 - Rete NARX in anello chiuso con funzione di trasferimento lineare

39

I valori predetti dalla rete, in questo caso, sono valori reali. Il grafico stampato dallo script il seguente:


Figura 32 - Valori reali predetti dalla rete

Per ottenere in uscita dalla rete valori di ozono interi, abbiamo utilizzato nello strato di uscita la funzione a soglia hardlims, messa a disposizione dalla libreria di Matlab. Poich per tale funzione per la soglia di discriminazione 0, abbiamo modificato il bias (ovvero linverso della soglia) della rete in anello chiuso con il valore 0.3. In questo modo otteniamo in uscita dalla rete valori di ozono interi (0 o 1) discriminati da una soglia a 0.3. Abbiamo scelto 0.3 perch, come si vede dal grafico, la maggior parte dei valori sta sotto questa soglia, mentre i valori superiori sono picchi, ovvero valori non nella norma e quindi rappresentativi di unalta presenza di ozono nellaria.

40

La rete in anello chiuso con la nuova funzione a soglia si presenta in questo modo:


Figura 33 - Rete NARX in anello chiuso con funzione di trasferimento a soglia

Lo script script_ozono.m calcola le uscite in anello chiuso:


inputSeries = tonndata(dataset3,false,false); targetSeries = tonndata(ozono,false,false); netc = closeloop(net); netc.b{2} = -0.3; netc.layers{2}.transferFcn = 'hardlims'; netc.name = [net.name ' - Closed Loop']; view(netc) [xc,xic,aic,tc] = preparets(netc,inputSeries,{},targetSeries); yc = netc(xc,xic,aic); closedLoopPerformance = perform(netc,tc,yc) plot(cell2mat(yc),'bo') figure plot(cell2mat(tc),go)

41

Conclusioni
A questo punto andiamo a valutare le previsioni fatte dalla nostra rete, plottando larray di celle yc, che contiene I valori di ozono presenti nellaria che la rete ha previsto.


Figura 34 - Grafico dei valori interi predetti dalla rete

42


Figura 35 - Grafico della serie dei target

Dallanalisi dei grafici possiamo dedurre che i valori predetti sono attendibili. La presenza di picchi di ozono nel grafico dei valori predetti molto simile a quella del grafico della serie dei target. Questo significa che la rete ha appreso bene e riesce a dare in fase di esecuzione gli stessi risultati forniti in fase di addestramento. In un futuro, se verranno presentati in ingresso alla rete nuovi valori, possiamo ragionevolmente pensare che la rete dar in uscita delle previsioni attendibili.

43