Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min read

La previsione delle serie temporali è una delle tecniche più richieste della scienza dei dati, che sia nel trading azionario, nella previsione delle vendite aziendali o nelle previsioni del tempo. E’ chiaramente un’abilità molto utile da avere e vi fornirò proprio questo alla fine di questo articolo.

In questo tutorial, costruiremo un modello ARIMA (non preoccupatevi se non sapete ancora esattamente come funziona) per prevedere i valori futuri della temperatura di una particolare città usando python. Il link GitHub per il codice e il set di dati si trova alla fine di questo blog. Ho anche allegato il mio video di YouTube alla fine, nel caso in cui siate interessati a una spiegazione video. Quindi, senza perdere tempo, cominciamo.

Il primo passo in qualsiasi serie temporale è quello di leggere i vostri dati e vedere come sono. Il seguente frammento di codice dimostra come farlo.

Il codice è abbastanza semplice. Leggiamo i dati usando pd.read_csv e scrivendo parse_date=True, ci assicuriamo che pandas capisca che ha a che fare con valori di date e non di stringhe.

Poi eliminiamo i valori mancanti e stampiamo la forma dei dati. df.head() stampa le prime 5 righe del dataset. Ecco l’output che dovresti vedere per questo:

Plot Your data

Il prossimo passo è tracciare i tuoi dati. Questo ti dà un’idea se i dati sono stazionari o no. Per coloro che non sanno cosa significhi la stazionarietà, lasciate che ve ne dia un’idea. Anche se ho fatto diversi video su questo argomento, tutto si riduce a questo:

Ogni serie temporale di dati che deve essere modellata deve essere stazionaria. Stazionario significa che le sue proprietà statistiche sono più o meno costanti nel tempo. Ha senso, vero? In che altro modo si possono fare previsioni se le proprietà statistiche variano nel tempo? Queste sono le seguenti proprietà che ogni modello di stazionarietà avrà:

  1. Media costante
  2. Varianza costante (Ci possono essere variazioni, ma le variazioni non dovrebbero essere irregolari)
  3. Nessuna stagionalità (Nessun modello che si ripete nella serie di dati)

Quindi il primo passo è verificare la stazionarietà. Se la vostra serie di dati non è stazionaria, dovrete convertirla in una serie stazionaria. Ora, prima che iniziate a preoccuparvi di tutto questo, rilassatevi! Abbiamo un test fisso e facile per controllare la stazionarietà chiamato ADF (Augmented Dickey Fuller Test). Ma prima di mostrarlo, tracciamo prima i dati.

Siccome mi interessa solo prevedere la temperatura media, questa è l’unica colonna che traccerò.

df.plot(figsize=(12,5))

Checking For Stationarity

Subito, possiamo vedere che sembra avere una media costante intorno a 45. E anche le fluttuazioni sembrano essere più o meno le stesse. Tuttavia, per essere sicuri che i dati siano stazionari o meno, eseguiamo un test statistico fisso usando il seguente codice:

Ottienirai l’output come segue:

Non hai bisogno di preoccuparti di tutte le statistiche complesse. Per interpretare i risultati del test, basta guardare il valore p. E si usa il seguente semplice metodo:

Se p< 0.05 ; I dati sono stazionari

se p>0.05; I dati non sono stazionari

Non è una regola fissa, ma un dato stazionario dovrebbe avere un valore p piccolo. Un valore p più grande potrebbe indicare la presenza di certe tendenze (media variabile) o anche la stagionalità.

Infine, decidete il vostro modello ARIMA

Ora, anche se ho fatto diversi video su YouTube su questo argomento, se non capite completamente cosa sia un modello ARIMA, permettetemi di presentarvi una facile panoramica:

L’ARIMA è composto da 3 termini (Auto-Regressione + Integrato+Moving-Average)

  1. Auto-Regressione:

Questo significa fondamentalmente che si stanno usando i valori precedenti della serie temporale per prevedere il futuro. Quanti valori passati si usano, determinano l’ordine del modello AR. Ecco come appare un modello AR(1):

Y(t)= Some_Constant*Y(t-1)+ Another_Constant +Error(t)

Semplice abbastanza, vero?

2. Integrato:

Si ricorda il nostro discorso sulla stazionarietà, e come sia estremamente importante? Bene, se il vostro set di dati non è stazionario, il più delle volte avete bisogno di eseguire una sorta di operazione di differenza per renderlo stazionario. Se state differenziando con il valore precedente, il suo ordine 1 e così via. Ecco un esempio di questo:

Scusate il mio cattivo disegno. Ma come potete vedere la serie Y(t) non era stazionaria, a causa di una tendenza all’aumento con conseguente media variabile. Semplicemente la sottraiamo dai valori precedenti e voilà! Diventa stazionaria. A seconda dei vostri dati, potreste dover ripetere il differenziamento per ottenere un differenziamento di secondo ordine, terzo ordine e così via..

3. Media mobile:

Questo significa fondamentalmente che state usando gli errori precedenti per fare la previsione futura. Ha anche senso, giusto? Vedendo quanto vi siete sbagliati nella vostra previsione, ne tenete conto per fare una previsione migliore. E proprio come in un modello AR, il numero di errori precedenti (chiamato anche numero di ritardi) che usate, determina l’ordine del modello.

Ecco come appare l’equazione di ordine MA(1):
Y(t)= Media + Qualche_Costante*Errore(t-1) +Errore(t)

Quindi il nostro lavoro principale è decidere l’ordine delle parti AR, I, MA che sono donate rispettivamente da (p,d,q).

E prima che iniziate a preoccuparvi, lasciatemi dire che tutto sarà fatto automaticamente. La libreria pmdarima viene in nostro soccorso! Fa il lavoro di capire l’ordine dell’ARIMA tutto da solo. Ecco come appare lo snippet di codice:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Assicurati di installare prima la libreria pmdarima usando pip install pmdarima)

Il codice è abbastanza auto esplicativo. Noi forniamo semplicemente i nostri dati alla funzione auto_arima. La funzione fondamentalmente usa qualcosa chiamato come il punteggio AIC per giudicare quanto sia buono un particolare modello di ordine. Cerca semplicemente di minimizzare il punteggio AIC, ed ecco come appare l’output:

Prestazioni del modello per diverse combinazioni di ordini

Si può vedere che il miglior modello ARIMA sembra essere dell’ordine (1,0,5) con il minimo punteggio AIC=8294.785. Con questa conoscenza possiamo finalmente procedere ad addestrare e adattare il modello per iniziare a fare previsioni!

Split Your Dataset

Prima di addestrare effettivamente il modello, dobbiamo dividere il set di dati in una sezione di training e una di testing. Lo facciamo perché prima addestriamo il modello sui dati e teniamo la sezione di test nascosta al modello. Una volta che il modello è pronto, gli chiediamo di fare previsioni sui dati di test e vedere come si comporta.

Il seguente snippet di codice illustra come farlo:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Così, come probabilmente puoi capire, riserviamo gli ultimi 30 giorni dei dati come sezione di test. Potete vedere le forme dei dati attuali e le sezioni di test e di allenamento nell’output.

Forma delle sezioni di allenamento e test

Finalmente, arriviamo alla roba succosa!

Sorprendentemente, creare il modello ARIMA è in realtà uno dei passi più facili una volta che avete fatto tutti i passi preliminari. È semplice come mostrato nello snippet di codice qui sotto:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Come potete vedere, dobbiamo semplicemente chiamare la funzione ARIMA, fornirle il nostro set di dati e menzionare l’ordine del modello ARIMA che vogliamo. Sarete in grado di vedere il sommario del modello anche nel vostro output.

Sommario del modello

Qui potete vedere un sacco di informazioni sul vostro modello. Inoltre potrete vedere i coefficienti di ogni termine AR e MA. Questi non sono altro che il valore delle variabili che avete visto nella precedente equazione del modello AR/MA che erano etichettate come ‘Some_Constant’. Generalmente una grandezza maggiore di questa variabile significa che ha un impatto maggiore sull’output.

Verifica quanto è buono il tuo modello

Ecco dove entrano in gioco i nostri dati di test. Prima facciamo la previsione della temperatura sui dati di test. Poi tracciamo un grafico per vedere come le nostre previsioni sono state confrontate con i dati reali.

Per fare effettivamente le previsioni, dobbiamo usare la funzione model.predict e dirgli l’indice iniziale e finale in cui vogliamo fare le previsioni.

Siccome vogliamo iniziare a fare previsioni dove finiscono i dati di allenamento, questo è quello che ho scritto nella variabile start. Vogliamo smettere di fare previsioni quando il set di dati finisce, il che spiega la variabile end. Se vuoi fare anche previsioni future, puoi semplicemente cambiare di conseguenza la variabile start e end con gli indici che vuoi. Il tuo grafico di uscita dovrebbe assomigliare a questo:

Test values vs Predictions Plot

Come puoi vedere le previsioni fanno un buon lavoro di corrispondenza con la tendenza reale, sebbene ci sia un certo ritardo accettabile.

Controlla la tua metrica di accuratezza

Per accertare effettivamente quanto buono o cattivo sia il tuo modello, troviamo l’errore quadratico medio per esso. Il seguente frammento di codice mostra che:

Prima controlliamo il valore medio dell’insieme di dati che risulta essere 45. E l’errore quadratico medio per questo particolare modello dovrebbe essere di circa 2,3. Inoltre dovreste preoccuparvi del fatto che la vostra radice media quadrata dovrebbe essere molto più piccola del valore medio del set di test. In questo caso possiamo vedere che l’errore medio sarà approssimativamente 2.3/45 *100=5.1% del valore reale.

Così il vostro modello ARIMA è pronto a partire! Nei prossimi blog parlerò di diversi modelli e di come è possibile aumentare ulteriormente la precisione del modello.

Se sei interessato alla spiegazione video dello stesso, vai sul mio canale YouTube per altri contenuti simili! Potete trovare il link GitHub per il codice e il set di dati qui: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Sentitevi liberi di collegarvi con me anche su LinkedIn!