Il trasferimento dell’apprendimento (transfer learning) è una tecnica fondamentale per sviluppare modelli di deep learning senza partire da zero, consentendo di risparmiare tempo ed energia durante la costruzione e l’addestramento di reti neurali. Sfruttando modelli preaddestrati sviluppati dalla comunità scientifica, si ottengono architetture robuste e consolidate, come GoogLeNet o YOLO, che permettono di ridurre la quantità di dati etichettati necessari e di diminuire le risorse computazionali richieste. Tuttavia, anche con tutti questi vantaggi, è importante che l’utente comprenda e gestisca in prima persona le fasi di costruzione, addestramento, verifica e validazione del modello, adattandolo al proprio dataset specifico.

Un caso particolarmente rilevante di applicazione del deep learning è la previsione dei terremoti, un evento naturale estremamente distruttivo e difficile da prevedere con precisione. La capacità di stimare con accuratezza la probabilità e l’entità di un terremoto è cruciale per ridurre i danni potenziali e salvare vite umane. L’approccio classico prevede di stimare la posizione in termini di latitudine, longitudine e profondità, nonché il momento temporale dell’evento, configurando il problema come una regressione spaziale e temporale su una griglia tridimensionale.

Di particolare interesse è la previsione del livello di energia rilasciata dal terremoto, collegata direttamente alla magnitudo del sisma. L’energia può essere approssimata attraverso una relazione logaritmica in funzione della magnitudo, permettendo così di quantificare la pericolosità dell’evento in modo più efficace. Il modello di deep learning che si vuole costruire, pertanto, deve essere in grado di stimare la magnitudo del terremoto basandosi sui dati geospaziali e temporali.

Per addestrare una rete neurale profonda con questo scopo, si può utilizzare un dataset reale e ampio, come quello fornito da Kaggle, contenente oltre un milione di registrazioni globali di terremoti dal 1973 al 1997, con informazioni su latitudine, longitudine, profondità, magnitudo, ora e data. Per motivi pratici, si riduce la dimensione del dataset a un campione più gestibile di circa 6000 record, suddivisi in dati per l’addestramento, la verifica e la validazione.

L’ambiente MATLAB offre strumenti potenti per costruire e testare modelli di rete neurale artificiale (ANN) attraverso app dedicate come ANN App e Deep Network Designer. Questi strumenti consentono di progettare architetture, importare modelli preaddestrati, esportarli e integrarli con altri framework di deep learning. Nel caso della previsione terremoti, una rete neurale superficiale può essere sufficiente per elaborare i dati disponibili.

Il processo inizia con la raccolta e la pre-elaborazione dei dati, organizzando gli input (latitudine, longitudine, profondità, ora) e l’output (magnitudo) in matrici, che saranno successivamente utilizzate per addestrare la rete. Un’attenta preparazione dei dati è fondamentale per garantire l’efficacia del modello, così come una corretta suddivisione tra dati di training, validazione e test, che permette di evitare fenomeni di overfitting e valutare la capacità di generalizzazione della rete.

Questa metodologia, anche se applicata a un problema concreto come la previsione di terremoti, riflette un principio più ampio: il deep learning richiede non solo strumenti tecnologici avanzati, ma soprattutto una comprensione chiara del processo di costruzione del modello e delle caratteristiche del dataset. Solo così è possibile ottenere modelli affidabili, capaci di supportare decisioni critiche in ambiti complessi.

È importante inoltre sottolineare che la qualità e la rappresentatività dei dati influiscono profondamente sui risultati del modello; quindi, l’attenzione alla raccolta, pulizia e organizzazione dei dati deve essere massima. Nel contesto della previsione dei terremoti, la natura caotica e imprevedibile di tali eventi impone anche una continua revisione e aggiornamento dei modelli, per integrare nuove informazioni e migliorare la precisione predittiva.

Come si prepara e normalizza un dataset per l’addestramento ANFIS in MATLAB?

In MATLAB, la rappresentazione dei dati di addestramento o di verifica avviene attraverso una matrice M × N, dove M indica il numero di righe (punti dati) e N il numero di colonne, contenenti esclusivamente valori numerici, fatta eccezione per eventuali colonne di testo non incluse nell’analisi. Ogni colonna rappresenta un singolo parametro di input, mentre l’ultima colonna contiene i dati di output. Nel contesto del nostro progetto, ad esempio, si utilizzano cinque variabili: la data, che non viene considerata numerica, il prezzo di apertura (OPEN), il prezzo massimo (HIGH), il prezzo minimo (LOW) e il volume totale (VOLUME) come input, e il prezzo di chiusura (CLOSE) come output. I dati provengono dal file Google_Stock_Price.csv, contenente complessivamente 1258 punti dati, ciascuno corrispondente a una riga per ogni colonna.

La matrice complessiva viene suddivisa in due parti da 600 righe ciascuna: la prima per l’addestramento, la seconda per la verifica del modello. Questo passaggio è cruciale per garantire la validità della rete ANFIS, evitando che il modello si limiti a memorizzare i dati senza generalizzare correttamente.

Un’operazione imprescindibile è la normalizzazione dei dati. Poiché l’interesse non è rivolto ai valori assoluti dei prezzi azionari, ma alle loro variazioni relative – come picchi e minimi in un determinato intervallo – si applica una trasformazione che divide ogni valore per il massimo della sua colonna, ottenendo valori compresi tra 0 e 1. Questa procedura permette di rendere omogenei i dati e migliora la convergenza durante l’addestramento del modello, eliminando la distorsione dovuta a scale diverse tra variabili.

Il codice MATLAB per generare i dataset di training e checking segue una logica rigorosa: si legge il file CSV con la funzione readtable(), che restituisce una tabella in formato cell array. Per poter manipolare i dati numerici, è necessario convertirli in array numerici con table2array(). Un particolare accorgimento è necessario per la colonna VOLUME, i cui valori sono annidati in celle e devono essere convertiti in numeri con str2double() per evitare errori di compilazione. Il processo di estrazione dei dati inizia dalla prima riga fino alla 600 per il training e dalla 601 alla 1200 per il checking, mantenendo l’integrità del campione.

Dopo aver eseguito la normalizzazione, i dati vengono assemblati in matrici rispettivamente denominate TrainData e ChkData, e salvati in formato ASCII per essere caricati successivamente all’interno dell’ambiente MATLAB. Questo approccio standardizzato consente di mantenere il flusso di lavoro modulare e ripetibile.

Successivamente, il toolbox Neuro-Fuzzy Designer di MATLAB viene impiegato per costruire il modello ANFIS. Questa applicazione fornisce un’interfaccia grafica user-friendly che facilita le fasi di progettazione, addestramento, test e validazione senza richiedere scrittura di codice. La procedura consiste nel caricare i file train_data.dat e check_data.dat all’interno dell’ambiente e selezionare i dataset per le rispettive fasi di training e checking, agevolando la verifica della correttezza e l’ottimizzazione del modello neuro-fuzzy.

È fondamentale comprendere che la qualità e la preparazione accurata del dataset rappresentano il primo passo imprescindibile per il successo di qualsiasi progetto di apprendimento automatico, soprattutto in contesti complessi come la previsione dei prezzi azionari. La normalizzazione non è solo una pratica tecnica, ma un requisito concettuale che modifica la prospettiva sull’interpretazione dei dati, spostando l’attenzione dal valore assoluto alle variazioni significative e agli andamenti. Inoltre, l’organizzazione rigorosa in training e checking evita fenomeni di overfitting e migliora la capacità del modello di adattarsi a dati nuovi e non visti in fase di addestramento.

In aggiunta, è importante ricordare che il dataset deve essere esente da errori e incongruenze, poiché la presenza di valori mancanti o errati può compromettere la stabilità e l’affidabilità della rete ANFIS. Infine, la scelta delle variabili di input e output deve essere basata su una chiara comprensione del fenomeno studiato, al fine di garantire che il modello acquisisca informazioni rilevanti e non rumore.

Come si costruisce un modello di regressione ad albero con fitrtree() in MATLAB?

La costruzione di un modello di regressione ad albero con la funzione fitrtree() di MATLAB presenta molteplici possibilità di configurazione, che possono inizialmente sembrare complesse per chi si avvicina al machine learning. Tuttavia, comprendere le opzioni più rilevanti e comuni consente di ridurre notevolmente la curva di apprendimento e di sfruttare al meglio questo strumento.

La funzione fitrtree() può essere utilizzata con cinque diverse sintassi costruttive. Il parametro Tbl rappresenta la tabella dati contenente le variabili, mentre X è la matrice delle variabili predittive (input) e Y è il vettore della variabile risposta (output). Se nella tabella Tbl è presente la variabile risposta, questa può essere indicata tramite il nome specifico (ResponseVarName) oppure tramite una formula che specifica esattamente quali variabili usare come predittori. Nel caso in cui la variabile risposta non sia contenuta nella tabella, essa deve essere fornita come vettore Y esterno, la cui lunghezza deve corrispondere al numero di righe di Tbl.

La formula, nel formato "Y ~ x1 + x2 + x3", permette di indicare un sottoinsieme delle variabili presenti nella tabella Tbl da utilizzare come predittori, escludendo automaticamente tutte le altre. È importante che i nomi delle variabili nel modello corrispondano esattamente ai nomi validi della tabella e a quelli riconosciuti da MATLAB.

Un aspetto cruciale nell’uso di fitrtree() è la possibilità di passare parametri aggiuntivi tramite coppie nome-valore. Questi parametri permettono di configurare aspetti fondamentali del modello, quali la gestione delle variabili categoriche, la dimensione minima dei nodi genitori (MinParentSize), la denominazione delle variabili predittive e della risposta, nonché l’attivazione della cross-validazione con impostazioni personalizzate come il numero di fold (KFold). Questo livello di personalizzazione consente di adattare il modello alle caratteristiche specifiche del dataset e agli obiettivi di analisi.

Nel dettaglio, è possibile ad esempio indicare quali predittori sono categorici, stabilire una dimensione minima per i nodi genitori in modo da controllare la complessità dell’albero, e abilitare la cross-validazione per prevenire fenomeni di overfitting e ottenere stime più affidabili delle prestazioni predittive.

Un esempio concreto mostra come costruire più modelli di regressione ad albero partendo dal dataset di automobili "carsmall" disponibile in MATLAB. Si definiscono vettori di input contenenti variabili come Accelerazione, Peso, Cilindri e Potenza, e si costruiscono modelli con diverse configurazioni di predittori e parametri. Successivamente, si può utilizzare la funzione predict() per valutare un modello addestrato su nuovi dati di input, stimando così variabili di interesse come il consumo medio di carburante (MPG).

Inoltre, attraverso un’analisi delle suddivisioni imposte dagli alberi, ad esempio visualizzando un istogramma del numero di split, è possibile approfondire la complessità e la struttura del modello allenato. La funzione view() permette di visualizzare graficamente l’albero decisionale, facilitando l’interpretazione del processo decisionale automatico.

È fondamentale comprendere che la corretta definizione di variabili predittive e risposta, la selezione attenta dei parametri tramite coppie nome-valore e l’uso di tecniche di validazione incrociata rappresentano elementi imprescindibili per costruire modelli robusti e interpretabili. La flessibilità offerta da fitrtree() richiede quindi una conoscenza approfondita delle opzioni e un’analisi critica dei dati per evitare errori comuni come la selezione di variabili non significative o la sovra-complessità del modello.

In aggiunta, è importante considerare le caratteristiche intrinseche dei dati, come la presenza di variabili categoriche, valori mancanti, e la distribuzione delle variabili risposta e predittive, poiché influenzano fortemente la qualità e l’affidabilità del modello di regressione ad albero. L’interpretazione dei risultati deve tenere conto del compromesso tra complessità e generalizzazione, bilanciando la capacità del modello di adattarsi ai dati osservati con la sua capacità di predire dati nuovi.

Come utilizzare il Random Forest per la regressione: Comprendere gli oggetti TreeBagger e RegressionBaggedEnsemble

Il Random Forest è un potente algoritmo di ensemble che si è dimostrato molto efficace sia per la classificazione che per la regressione. In questo capitolo, ci concentreremo principalmente sull’utilizzo di due oggetti fondamentali per la regressione: il TreeBagger e il RegressionBaggedEnsemble. Questi oggetti fanno parte di una serie di classi che offrono funzionalità diverse ma complementari nell’ambito della regressione basata su algoritmi di tipo ensemble.

L’oggetto TreeBagger, creato dalla funzione TreeBagger(), è una raccolta di alberi decisionali "bagged", cioè ottenuti tramite il metodo di bootstrap aggregation (bagging). Gli alberi decisionali singoli tendono a sovradattarsi ai dati, ma il bagging aiuta a ridurre questo fenomeno, migliorando la capacità di generalizzazione del modello. Questo approccio prevede che ogni albero sia costruito utilizzando campioni casuali del dataset di ingresso, e ogni albero venga addestrato con un sottoinsieme casuale delle variabili predittive, seguendo il principio del Random Forest.

Il TreeBagger, per impostazione predefinita, cresce alberi decisionali per la classificazione. Tuttavia, è possibile utilizzarlo anche per la regressione, modificando uno degli argomenti, specificando il parametro Method come regression. In questo caso, ogni albero nel modello viene addestrato per prevedere una variabile continua invece che una classe discreta.

Un altro oggetto fondamentale è il RegressionBaggedEnsemble, una classe derivata da RegressionEnsemble, la quale a sua volta deriva da CompactRegressionEnsemble. La classe CompactRegressionEnsemble rappresenta una versione semplificata della classe RegressionEnsemble e non include i dati di addestramento necessari per alcune operazioni, come la validazione incrociata. Viene quindi utilizzata solo per effettuare previsioni su nuovi dati. La RegressionEnsemble, al contrario, integra i modelli di apprendimento deboli addestrati insieme ai dati di addestramento, permettendo di fare previsioni basate sull'aggregazione delle previsioni provenienti da ciascun singolo modello.

La classe RegressionBaggedEnsemble estende la RegressionEnsemble, introducendo il concetto di bagging, che, come nel caso del TreeBagger, aiuta a migliorare la robustezza del modello riducendo il rischio di sovradattamento. Entrambe queste classi, per la creazione di nuovi oggetti, utilizzano la funzione fitrensemble(), che consente di addestrare il modello su un insieme di dati.

Un aspetto importante da notare riguarda il funzionamento del metodo di bagging applicato agli alberi decisionali. Ogni albero è costruito utilizzando un campione casuale del dataset, e le osservazioni non incluse in questo campione vengono considerate come "out-of-bag" per quell’albero specifico. Le previsioni finali del modello vengono quindi fatte aggregando i risultati ottenuti da ciascun albero nel modello, riducendo l’influenza di eventuali errori di singoli alberi.

Inoltre, nel contesto dell’analisi dei dati, la scelta dell’algoritmo di ensemble più appropriato dipende spesso dai dati stessi. L’utilizzo dell’apposita applicazione Regression Learner App, disponibile nel toolbox di statistica e machine learning, consente di esplorare e confrontare diversi modelli di alberi decisionali, come Boosted Trees, Bagged Trees e All Ensembles. Attraverso questa applicazione, è possibile visualizzare e confrontare i risultati ottenuti con vari tipi di modelli, e scegliere quello più adatto per il proprio dataset.

Per esempio, il dataset nl_motor2.xls può essere utilizzato per eseguire una regressione ensemble utilizzando i modelli di alberi decisionali. Dopo aver importato il dataset e avviato la sessione nell’app Regression Learner, è possibile selezionare il modello "All Ensembles" per addestrare il modello di regressione. Successivamente, l’applicazione mostrerà i risultati dell’addestramento e le performance del modello, evidenziando eventuali errori di previsione tra i valori reali e quelli stimati.

Per un’ulteriore valutazione del modello addestrato, è possibile esportarlo nel workspace e utilizzare i dati nuovi per fare previsioni. Questo processo è fondamentale per testare l’affidabilità del modello addestrato e confrontarlo con nuovi dati, attraverso un codice che simula una valutazione del modello in scenari reali.

Approfondimenti

Il Random Forest è particolarmente utile quando si ha a che fare con dataset complessi e grandi, dove i modelli di regressione lineari o singoli alberi decisionali potrebbero non essere sufficienti. La potenza del Random Forest risiede nella sua capacità di ridurre il rischio di overfitting aggregando il risultato di più modelli deboli, aumentando così la stabilità e la precisione delle previsioni.

Un altro punto importante riguarda l'interpretabilità dei modelli Random Forest. Sebbene i modelli di ensemble come il Random Forest siano noti per essere "black boxes" rispetto ad altri modelli più semplici, esistono tecniche di interpretazione, come l'analisi dell'importanza delle variabili predittive, che consentono di ottenere informazioni più dettagliate su come le singole variabili influenzano la previsione del modello.

Un lettore che desidera approfondire l’uso di questi algoritmi per la regressione dovrebbe anche familiarizzare con le tecniche di tuning del modello, come la selezione del numero di alberi (n_estimators), la profondità degli alberi (max_depth) e il numero di variabili da selezionare ad ogni divisione (max_features). Questi parametri possono influenzare notevolmente le performance del modello e devono essere ottimizzati per ottenere i migliori risultati.