Migliorare la robustezza del modello di regressione con l’analisi delle serie temporali – Parte 2

Migliorare la robustezza del modello di regressione con l'analisi delle serie temporali - Seconda Parte

Uno studio di caso sui prezzi di rivendita delle HDB di Singapore. In questa storia, dimostriamo come incorporare l’analisi delle serie temporali nella regressione lineare, migliorando la capacità predittiva del modello.

Foto di Robbie Down su Unsplash

Precedentemente…

Benvenuti al secondo segmento di questo articolo!

Nella Parte 1, siamo riusciti con successo a costruire un modello di serie temporali, specificamente utilizzando SARIMA (Seasonal Autoregressive Integrated Moving Average). Inoltre, abbiamo valutato il modello che abbiamo costruito eseguendo un’esame visivo e valutando il suo errore medio assoluto (MAE).

Migliorare la robustezza del modello di regressione con l’analisi delle serie temporali – Parte 1

In questa storia, dimostriamo come incorporare l’analisi delle serie temporali nella regressione lineare può migliorare il modello…

pub.towardsai.net

(Per il codice completo dei processi end-to-end di questa analisi, dall’estrazione dei dati alla costruzione dei modelli di regressione, sentiti libero di controllare i miei repository GitHub qui)

Come suggerisce il titolo, questo articolo non si ferma all’analisi delle serie temporali. Nella seconda parte, sposteremo il nostro focus sulla costruzione di modelli di regressione su come prevedere i prezzi delle HDB di Singapore. Inoltre, utilizzeremo le informazioni dal nostro modello di serie temporale come features di regressione per rafforzare la capacità predittiva della nostra regressione.

Detto ciò, prima di proseguire con quella parte, torniamo al nostro dataset pulito e eseguiamo alcuni processi di ingegneria delle features.

cleandata.head()
Dataset pulito - Immagine dell'autore

Ingegneria delle Features

L’ingegneria delle features è un’altra fase cruciale nella costruzione dei modelli predittivi. È il processo in cui modifichiamo le features esistenti o ne creiamo di nuove. L’obiettivo principale dell’ingegneria delle features è convertire i nostri dati in un formato che può essere facilmente digerito dai nostri modelli. In sostanza, l’ingegneria delle features forma un fondamentale blocco di costruzione dei nostri modelli predittivi.

Il modo in cui eseguiamo l’ingegneria delle features dipende dai tipi di dati. Di conseguenza, nel nostro caso, il primo passo nell’eseguire l’ingegneria delle features è quello di raggruppare le nostre features in tre gruppi: features categoriche, features temporali e features numeriche.

Features Categoriche

In base alla nostra analisi delle features categoriche, è evidente che ‘flat_type’ e ‘storey_range’ presentano caratteristiche ordinate. Anche se le features ordinate possiedono un ordine naturale, è importante notare che le differenze numeriche tra le classi non portano necessariamente informazioni specifiche. Interessantemente, quando esaminiamo ‘flat_type’ e ‘storey_range’ in relazione a ‘resale_price’, osserviamo relazioni quasi lineari.

Prezzi medi per tipo di appartamento - Immagine dell'autore
Prezzi medi per fascia di piano - Immagine dell'autore

Di conseguenza, possiamo semplificare il nostro modello predittivo convertendo queste caratteristiche ordinali in numeriche usando l’encoder ordinale. Questa trasformazione aiuta a rimuovere complessità superflue all’interno del modello, mantenendo al contempo informazioni importanti.

np.sort(cleandata['flat_type'].unique())
‘flat_type’ dopo la codifica ordinale - Immagine dell'autore
np.sort(cleandata['storey_range'].unique())
‘storey_range’ dopo la codifica ordinale - Immagine dell'autore

Caratteristiche Temporali

Le caratteristiche temporali sono un gruppo di caratteristiche correlate ai dati di serie temporali. Queste caratteristiche possono assumere la forma di data e ora, numeriche o dati categorici. Nel segmento precedente, nello specifico nella fase di preelaborazione, abbiamo creato nuove caratteristiche ‘resale_year’ e ‘resale_month’ da ‘resale_date’. A differenza di ‘flat_type’ e ‘storey_range’, abbiamo scoperto che ‘resale_month’, che è anche ordinale, non ha una relazione lineare con ‘resale_price’. Invece, ‘resale_month’ rappresenta l’aspetto della stagionalità dei nostri dati. Pertanto, è necessario convertire ‘resale_month’ da numerico a categorico. Da ‘resale_month’, abbiamo anche creato la nuova caratteristica ‘resale_quarter’.

Altre caratteristiche temporali sono le nuove caratteristiche che otteniamo dall’analisi delle serie temporali. Queste caratteristiche sono previsione, tendenza e variabili ritardate. Per le caratteristiche di previsione e tendenza, possiamo ottenerle direttamente dal nostro modello SARIMA. Per le variabili ritardate, le abbiamo create dalla previsione. Anche se il numero ottimale di variabili ritardate è tre, basato sul parametro ARIMA p = 3, abbiamo scelto di creare quattro variabili ritardate. Aggiungendo una variabile extra, vogliamo esaminare come questa modifica influisca sul comportamento del nostro modello di regressione.

Con le nuove caratteristiche temporali a disposizione, possiamo quindi integrare facilmente queste caratteristiche nel dataset pulito.

Caratteristiche Numeriche

Le caratteristiche numeriche sono in buone condizioni. Pertanto, non è necessario apportare alcuna modifica.

Selezione delle Caratteristiche

Foto di Edu Grande su Unsplash

Dopo aver eseguito con successo l’ingegneria delle caratteristiche, abbiamo rinominato il nostro dataset in newdata. Dopo aver ottenuto newdata, il passaggio successivo è selezionare le caratteristiche più rilevanti per il nostro modello.

Innanzitutto, raggruppiamo insieme le colonne numeriche nel nostro dataset e facciamo un test di correlazione. Con questo test, possiamo effettuare la selezione in due fasi. La prima consiste nel confrontare le caratteristiche con la variabile target, in questo caso ‘resale_price’.

Dalla mappa di correlazione sottostante, osserviamo che ‘resale_price’ ha un certo grado di correlazione con queste caratteristiche numeriche, da una correlazione moderata a una correlazione forte. Tuttavia, osserviamo anche che alcune caratteristiche hanno correlazioni forti tra loro, indicando la presenza di multicollinearità.

Sappiamo che ‘remaining_lease’ è una funzione di ‘lease_commence_year’. Pertanto, possiamo eliminare una di queste caratteristiche. Pertanto, abbiamo rimosso ‘remaining_lease’. Inoltre, osserviamo anche che ‘floor_area_sqm’ e ‘flat_type’ sono correlati tra loro in modo molto forte, quindi possiamo rimuovere ‘flat_type’ dal dataset.

Tabella di correlazione 1 - Immagine dell'autore

Nel frattempo, per le nostre caratteristiche temporali ottenute da SARIMA, tutte sono moderatamente correlate con il target. Inoltre, tutte manifestano anche una multicollinearità tra di loro. Detto ciò, non rimuoveremo nessuna di esse in questo momento perché vogliamo conoscere la combinazione di queste caratteristiche che funziona meglio nel nostro modello di regressione.

Tabella di correlazione 2 - Immagine dell'autore

Nel frattempo, per le caratteristiche categoriche, utilizziamo un approccio più diretto. Dall’immagine sottostante, vediamo che ‘block’ e ‘street_name’ hanno un numero estremamente elevato di classi uniche, rispettivamente 2671 e 565. Va notato che le caratteristiche categoriche che contengono un numero molto elevato di classi tendono ad aumentare la complessità del modello e sono molto soggette a causare un sovrapprendimento. Pertanto, decidiamo di eliminare queste caratteristiche.

cat = newdata.select_dtypes(exclude = 'number') #categorical/qualitativefor i, column in enumerate(cat.columns):    print(f'{column}'.title(), ': contiene', cat[column].nunique(), 'valori')
Dimensione delle classi delle caratteristiche categoriche - Immagine dell'autore

Una volta decise le caratteristiche da includere nel modello di regressione, possiamo passare alla prossima fase, la costruzione del modello di regressione.

Regressione Lineare

Foto di Clément Hélardot su Unsplash

Nell’apprendimento automatico, la regressione lineare è un tipo di tecnica di apprendimento supervisionato il cui obiettivo è prevedere il valore della variabile dipendente in base alla sua relazione con una o più variabili indipendenti. Una caratteristica chiave della regressione lineare è che la variabile dipendente, chiamata anche obiettivo, è costituita da valori numerici continui, mentre le variabili indipendenti, conosciute anche come caratteristiche, possono consistere di valori numerici o valori categorici.

Nel nostro caso HDB, costruiamo un modello di regressione lineare per prevedere i valori di ‘resale_price’ in base alla sua relazione con le caratteristiche ( ‘floor_area_sqm’, ‘storey_range’, ecc). Per ottenere un modello predittivo robusto, prima dobbiamo costruire un modello di riferimento. Un modello di riferimento è un punto di partenza essenziale e un punto di riferimento su come un modello dovrebbe performare e su come può essere migliorato.

Modello di Riferimento

Come sappiamo, il nostro obiettivo è vedere come la combinazione di analisi delle serie temporali aiuta a migliorare le previsioni di regressione. Di conseguenza, creiamo un modello di riferimento che non include componenti temporali, a parte quelle presenti nel dataset grezzo, che, nel nostro caso, includono ‘resale_date’ e i suoi derivati diretti, cioè ‘resale_year’, ‘resale_month’ e ‘resale_quarter’. Pertanto, con il modello di riferimento, creiamo essenzialmente uno scenario in cui ci affidiamo solo alla regressione lineare convenzionale.

Sotto è riportata la combinazione di caratteristiche e target utilizzata nel nostro modello di riferimento:

feat.head()
Caratteristiche del modello di riferimento - Immagine dell'autore

Costruzione del Modello

Va notato che perché il nostro dataset contiene caratteristiche categoriche, dobbiamo creare variabili dummy. Nel nostro caso, abbiamo creato variabili dummy utilizzando la codifica one-hot di Pandas.

Come osservato nella schermata sottostante, il numero di caratteristiche aumenta da 9 a ben 62, grazie alla creazione di variabili dummy.

dummies = pd.get_dummies(feat, drop_first=True, prefix_sep='--') dummies.head()
Caratteristiche con variabili dummy - Immagine dell'autore

Dopo la creazione delle variabili dummy, il nostro prossimo passo è suddividere i dati in set di addestramento e di test. Il criterio di suddivisione utilizzato è lo stesso utilizzato nell’analisi delle serie temporali, in cui gli ultimi 12 mesi costituiscono il set di test, mentre quelli precedenti diventano il set di addestramento. Nel nostro caso specifico, questa suddivisione porta a una proporzione di circa 20:80 tra set di test e di addestramento. Dopo aver suddiviso i dati, potremmo quindi costruire il modello.

(In questa analisi, non entreremo nei dettagli come i coefficienti di regressione o la significatività statistica di ogni caratteristica. Tuttavia, per un riassunto completo del modello di regressione, puoi consultarli nei miei repository GitHub.)

import statsmodels.api as smLinearRegression = sm.OLS(y_train, sm.add_constant(X_train)).fit()

Valutazione del modello

Come abbiamo fatto nella sezione di analisi delle serie temporali, per valutare le prestazioni del nostro modello di regressione, adotteremo due approcci: valutazione metrica e valutazione visiva. Questi due approcci lavorano insieme per fornirci una comprensione approfondita dell’efficacia del modello.

Per iniziare la valutazione, quello che dobbiamo valutare è il grafico dei residui del modello di regressione per esaminare l’omoschedasticità del modello. Innanzitutto, valutiamo i residui del set di addestramento. Come osservato dall’immagine sottostante, possiamo vedere che nella fascia di prezzo più bassa, i dati effettivi sono distribuiti in modo uniforme intorno alla linea di regressione. Tuttavia, mano a mano che il prezzo aumenta, i dati effettivi si distribuiscono meno uniformemente rispetto alla linea di regressione. D’altra parte, l’istogramma dei residui segue la forma a campana di una distribuzione normale con una media vicino allo zero, che si attesta a -1,13e-11 dopo la standardizzazione.

Analisi dei residui di addestramento del modello di base - Immagine dell'autore

Inoltre, i risultati ottenuti dal set di test sono ancora meno promettenti. Come osservato dall’immagine sottostante, possiamo vedere che i dati effettivi si discostano ancora di più dalla linea di regressione mano a mano che il prezzo aumenta. Inoltre, l’istogramma, sebbene segua la forma a campana di una distribuzione normale, non è centrato vicino allo zero, attestandosi a -0,73 dopo la standardizzazione.

Analisi dei residui di test del modello di base - Immagine dell'autore

Nel frattempo, le principali metriche che utilizziamo per valutare l’efficacia del modello di regressione sono il coefficiente di determinazione corretto (adjusted R-squared), l’errore assoluto medio (MAE) del set di addestramento e l’errore assoluto medio del set di test. Queste metriche sono essenziali per misurare l’accuratezza del modello e la sua capacità di generalizzare.

I valori di queste metriche sono i seguenti:

  • adjusted R-squared: 86,19%

Il valore di adjusted R-squared fornisce una misura di quanto bene il nostro modello predittivo può spiegare la varianza dei dati penalizzando la complessità del modello. In termini pratici, indica quanto bene le variabili indipendenti (caratteristiche) nel nostro modello possono spiegare i valori della variabile dipendente (target). Un valore di adjusted R-squared del 86,19% può essere considerato un valore alto, considerando che stiamo cercando di modellare i prezzi delle case, che possono essere complessi da predire in quanto coinvolgono inherentemente il comportamento umano. Un valore di adjusted R-squared più alto (più vicino al 100%) in un modello di regressione è tipicamente una caratteristica desiderabile.

  • MAE del set di addestramento: S$47.453
  • MAE del set di test: S$59.158

Nel frattempo, per i valori di MAE, come abbiamo fatto nell’analisi delle serie temporali, dobbiamo confrontarli con la media dei prezzi medi mensili, che è di S$483.783. Ciò significa che i valori del MAE variano dal 9,8% al 12,2% della media dei prezzi medi mensili. Sebbene questi valori siano relativamente bassi rispetto alla media dei prezzi medi mensili, sarebbe meglio se potessimo ridurre ulteriormente questi valori di errore.

Un altro angolo per valutare il modello è esaminare quanto bene la nostra regressione può fare previsioni su serie temporali. Pertanto, generiamo grafici che visualizzano i prezzi medi mensili dai dati effettivi, le previsioni di allenamento e le previsioni di test.

Previsione vs reale, modello di base — Immagine dell'autore

Dall’esame del grafico sopra, possiamo scoprire alcune importanti intuizioni. È evidente che il nostro modello di base può catturare abbastanza bene la stagionalità. Tuttavia, il modello sembra affrontare difficoltà nel catturare la tendenza. È evidente che le previsioni di allenamento (linea verde) deviano frequentemente abbastanza lontano dai valori effettivi, come indicato dalle aree ombreggiate verdi. Le previsioni di test (linea viola) mostrano errori ancora più grandi, come mostrato nell’area ombreggiata viola, suggerendo ulteriormente che il modello ha difficoltà nel catturare la tendenza.

Tutto sommato, la nostra valutazione completa, che comprende la valutazione visiva e metrica, suggerisce la necessità di miglioramenti al modello attuale.

Modello migliorato

Dopo estesi esperimenti usando diversi scenari con varie combinazioni di caratteristiche e trasformazione dei dati, abbiamo finalmente ottenuto un modello migliorato. Il nuovo modello dovrebbe avere una maggiore robustezza. Tuttavia, il modello, allo stesso tempo, dovrebbe evitare complessità superflue per mantenere l’interpretabilità.

Tale modello migliore implica l’incorporazione di determinate caratteristiche ottenute dall’analisi delle serie temporali utilizzando SARIMA, che sono la tendenza e il terzo ritardo. Inoltre, il modello potrebbe funzionare in modo più robusto utilizzando la trasformazione dei dati sul target (‘resale_price’) utilizzando la trasformazione di Box-Cox.

feat.head()
Caratteristiche del modello migliorato — Immagine dell'autore

Costruzione del modello

Nel processo di costruzione del modello migliorato, utilizziamo gli stessi trattamenti del modello di base. Effettuando gli stessi passaggi, possiamo confrontare efficacemente le prestazioni del modello migliorato con quelle del modello di base. L’unica differenza significativa è che il target del modello migliorato deve subire una trasformazione inversa per riportarlo all’unità originale.

Valutazione del modello

Come abbiamo fatto per il modello di base, la prima cosa che valutiamo nel modello migliorato sono i residui. Va notato che non possiamo confrontare i valori nella analisi dei residui del modello migliorato con quelli del modello di base poiché ciascun modello ha un’unità target diversa, a meno che non utilizziamo una standardizzazione sui residui.

Analisi dei residui di allenamento del modello migliorato — Immagine dell'autore

Come osservato nel grafico di regressione sopra, possiamo dedurre che il modello migliorato produce residui più uniformemente dispersi rispetto a quelli del modello di base. Questa scoperta suggerisce un miglioramento della robustezza del modello. Inoltre, se guardiamo al dataset di test, il grafico di regressione risultante, mostrato di seguito, mostra anche dati uniformemente dispersi, suggerendo omoschedasticità. Questo è anche un indicatore che stiamo procedendo nella giusta direzione!

Analisi dei residui di test del modello migliorato — Immagine dell'autore

Nel frattempo, i valori delle metriche di valutazione sono i seguenti:

  • R-squared corretto: 89,61%
  • MAE del dataset di allenamento: S$40.114
  • MAE del dataset di test: S$42.432

Il valore del R-squared corretto del modello migliorato è superiore a quello del modello di base. Nel frattempo, i valori di MAE del dataset di allenamento e del dataset di test del modello migliorato sono più piccoli rispetto a quelli del modello di base. Questi cambiamenti indicano ulteriormente un miglioramento del modello.

E infine, vorremmo analizzare l’aspetto della serie temporale del modello migliorato. Dal grafico qui sotto, è evidente che il nostro modello migliorato presenta lacune significativamente più piccole tra i valori effettivi e quelli previsti rispetto al modello di base, come indicato nelle aree ombreggiate in verde e viola.

Predizione vs Valori Effettivi, Modello Migliorato - Immagine dell'Autore

Confronto delle Metriche

Per facilitare il confronto, ho riassunto le metriche in queste tabelle:

Confronto delle metriche di regressione - Immagine dell'Autore
Confronto delle metriche di serie temporale - Immagine dell'Autore

Confrontando i valori MAE del modello di base con quelli del modello migliorato come mostrato nelle tabelle, possiamo dire che le metriche di valutazione, in particolare gli errori assoluti medi, del secondo modello sono notevolmente migliorati grazie all’incorporazione della serie temporale nel modello di regressione.

È davvero interessante. E allora?

Abbiamo finalmente avuto successo nella creazione di un modello di regressione lineare in grado di catturare la natura a serie temporale dei dati incorporando SARIMA. Detto ciò, potrebbe sorgere la domanda da un milione di dollari: perché è importante? Come possiamo utilizzare il modello predittivo in situazioni reali?

Bene, uno dei principali utilizzi dei modelli predittivi è quello di supportare la decisione basata sui dati. In un mondo pieno di informazioni, la modellizzazione predittiva ci aiuta a convertire le informazioni provenienti dai dati storici in previsioni future, che possono agire come intuizioni utilizzabili.

Nel nostro caso specifico, una delle applicazioni dirette della modellizzazione predittiva è quella di aiutare i proprietari di appartamenti HDB a prendere decisioni informate sul settaggio del prezzo ottimale per le loro proprietà, nel caso in cui desiderino vendere le loro unità. Impostare il prezzo giusto è fondamentale perché una sottostima può comportare una perdita di entrate, mentre una sovrastima può scoraggiare potenziali acquirenti.

Detto ciò, questo modello ha le sue limitazioni. Nelle situazioni reali, uno dei principali problemi delle previsioni a serie temporale è la diminuzione dell’affidabilità dei modelli nel tempo. Tipicamente, quando facciamo previsioni per il futuro lontano, gli errori risultanti diventano più grandi, rendendo le nostre previsioni meno accurate. Questo è particolarmente vero in situazioni che coinvolgono il comportamento umano, come la previsione dei prezzi futuri delle case.

Pertanto, questo modello è meglio utilizzato all’interno di un breve periodo di tempo, come da 6 a 12 mesi nel futuro. Dopo quel periodo, è meglio rivedere il modello rinnovando i dati di addestramento.

Cose fondamentali da tenere a mente

  1. Una delle tecniche di apprendimento automatico più elementari, la regressione lineare, può diventare più robusta combinandola con la classica tecnica di analisi delle serie temporali come SARIMA.
  2. I proprietari di appartamenti HDB possono sfruttare questo modello per aiutarli a impostare i prezzi corretti, nel caso in cui desiderino vendere le loro unità.
  3. A causa delle sue limitazioni, questo modello dovrebbe essere utilizzato in un breve periodo di tempo, come 6 o 12 mesi.
  4. Se si intende utilizzare questo modello per un periodo più lungo, è importante rinnovare periodicamente i dati di addestramento.

Infine, grazie mille per aver letto fino alla fine! Spero che tu trovi utili e stimolanti i miei scritti.

Approfondimenti:

[1] M. Badole, Mastering Multiple Linear Regression: Guida completa, 2021. [Online]. Disponibile su: https://www.analyticsvidhya.com/blog/2021/05/multiple-linear-regression-using-python-and-scikit-learn/ [Accesso: 30 ottobre 2023]

[2] Geeks for Geeks, Regressione Lineare in Python utilizzando Statsmodels, 2022. [Online]. Disponibile: https://www.geeksforgeeks.org/linear-regression-in-python-using-statsmodels/ [Accesso: 30 ottobre 2023]