Data una serie temporale, prevedere il valore successivo è un problema che ha affascinato molti programmatori per molto tempo. Ovviamente, una ragione fondamentale per questa attenzione è il mercato azionario, che prometteva ricchezze incalcolabili se si riusciva a decifrarlo. Tuttavia, tranne che per pochi (vedi Una rara intervista con il matematico che ha crackato Wall Street), queste ricchezze si sono dimostrate sfuggenti.
Grazie all’IoT (Internet of Things), l’analisi delle serie temporali è pronta a tornare alla ribalta. L’IoT ci permette di piazzare sensori ubiqui ovunque, raccogliere dati e agire su quei dati. I dispositivi IoT raccolgono dati nel tempo e i dati risultanti sono quasi sempre dati di serie temporali.
Seguono alcuni casi d’uso per la previsione delle serie temporali.
- Previsione del carico di energia
- Previsione della domanda per negozi al dettaglio
- Servizi (ad es. sportelli per il check-in delle compagnie aeree, uffici governativi) previsione della clientela
- Previsione delle entrate
- Monitoraggio vitale delle cure in terapia intensiva
- Previsione della resa e dei raccolti
Esploriamo le tecniche disponibili per le previsioni delle serie temporali.
La prima domanda è che “non è la regressione?”. È vicino, ma non è la stessa cosa della regressione. In una serie temporale, ogni valore è influenzato dai valori che lo precedono. Per esempio, se c’è molto traffico alle 4.55 in un incrocio, è probabile che ci sia un po’ di traffico anche alle 4.56. Questo si chiama autocorrelazione. Se state facendo una regressione, considererete solo x(t) mentre a causa dell’autocorrelazione, anche x(t-1), x(t-2), … influiranno sul risultato. Quindi possiamo pensare alle previsioni delle serie temporali come a una regressione che tiene conto anche dell’autocorrelazione.
Per questa discussione, consideriamo il “Set di dati sul consumo individuale di energia elettrica delle famiglie”, che è costituito dai dati raccolti da una famiglia in quattro anni a intervalli di un minuto. Consideriamo solo tre campi, e il dataset sarà come il seguente.
La prima domanda è come misuriamo il successo? Lo facciamo attraverso una funzione di perdita, dove cerchiamo di minimizzare la funzione di perdita. Ci sono diverse funzioni di perdita, e sono diversi pro e contro.
- MAE ( Mean absolute error) – qui tutti gli errori, grandi e piccoli, sono trattati allo stesso modo
- Root Mean Square Error (RMSE) – questo penalizza i grandi errori a causa del termine quadratico. Per esempio, con errori e , MSE per entrambi sarà 0,5 mentre RMSE è 0,5 e. 0.45.
- MAPE ( Mean Absolute Percentage Error) – Dal momento che #1 e #2 dipendono dall’intervallo di valori della variabile target, non possono essere confrontati tra serie di dati. Al contrario, il MAPE è una percentuale, quindi relativa. È come l’accuratezza in un problema di classificazione, dove tutti sanno che il 99% di accuratezza è abbastanza buono.
- RMSEP (Root Mean Square Percentage Error) – Questo è un ibrido tra #2 e #3.
- Tasso di errore delle previsioni quasi corrette (AC_errorRate) – la percentuale di previsioni che è entro la percentuale %p del valore vero
Se stiamo cercando di prevedere il valore successivo, abbiamo diverse scelte.
Il gold standard per questo tipo di problemi è il modello ARIMA. L’idea centrale dietro l’ARIMA è di rompere la serie temporale in diverse componenti come la componente di tendenza, la componente di stagionalità ecc. e stimare attentamente un modello per ogni componente. Vedere Using R for Time Series Analysis per una buona panoramica.
Tuttavia, ARIMA ha un problema spiacevole. Ha bisogno di un esperto (una buona laurea in statistica o un laureato) per calibrare i parametri del modello. Se volete fare l’ARIMA multivariato, cioè fattorizzare più campi, allora le cose diventano ancora più difficili.
Tuttavia, R ha una funzione chiamata auto.arima, che stima i parametri del modello per voi. L’ho provato.
library("forecast")
....
x_train <- train data set
X-test <- test data set
..
powerTs <- ts(x_train, frequency=525600, start=c(2006,503604))
arimaModel <- auto.arima(powerTs)
powerforecast <- forecast.Arima(arimaModel, h=length(x_test))
accuracy(powerforecast)
Puoi trovare una discussione dettagliata su come fare ARIMA dai link indicati sopra. Ho usato solo 200k dal set di dati in quanto il nostro obiettivo sono set di dati di medie dimensioni. Ha dato un MAPE di 19.5.
Funzioni temporali
Il secondo approccio è quello di arrivare con una lista di caratteristiche che cattura gli aspetti temporali in modo che le informazioni di autocorrelazione non vengano perse. Per esempio, l’analisi tecnica del mercato azionario utilizza caratteristiche costruite utilizzando le medie mobili. Nel caso semplice, un analista seguirà le medie mobili a 7 e 21 giorni e prenderà decisioni basate sui punti di crossover tra questi valori.
Seguono alcune idee di caratteristiche
- raccolta di medie mobili/mediane (es.7, 14, 30, 90 giorni)
- Tempo da un certo evento
- Tempo tra due eventi
- Misure matematiche come Entropia, Z-scores ecc.
- X(t) elevato a funzioni come power(X(t),n), cos((X(t)/k)) ecc
Un trucco comune che la gente usa è applicare queste caratteristiche con tecniche come Random Forest e Gradient Boosting, che possono fornire l’importanza relativa delle caratteristiche. Possiamo usare quei dati per mantenere le buone caratteristiche e abbandonare quelle inefficaci.
Non mi soffermerò troppo su questo argomento. Tuttavia, con un po’ di duro lavoro, questo metodo ha dimostrato di dare ottimi risultati. Per esempio, la maggior parte dei concorsi sono vinti usando questo metodo (ad esempio http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).
Il lato negativo, tuttavia, è che la creazione di caratteristiche è un’arte nera. Ci vuole molto lavoro ed esperienza per creare le caratteristiche.
Rolling Windows-based Regression
Ora siamo arrivati alla parte interessante. Sembra che ci sia un altro metodo che dà risultati abbastanza buoni senza un sacco di aiuto.
L’idea è di prevedere X(t+1), il prossimo valore in una serie temporale, alimentando non solo X(t), ma X(t-1), X(t-2) ecc. al modello. Un’idea simile è stata discussa in Rolling Analysis of Time Series, anche se è usata per risolvere un problema diverso.
Guardiamo un esempio. Diciamo che abbiamo bisogno di prevedere x(t+1) dato X(t). Allora le variabili di origine e di destinazione avranno il seguente aspetto.
Il dataset avrebbe il seguente aspetto dopo la trasformazione con finestra mobile di tre.
Poi, useremo il dataset trasformato con un noto algoritmo di regressione come la regressione lineare e la regressione Random Forest. L’aspettativa è che l’algoritmo di regressione capisca i coefficienti di autocorrelazione da X(t-2) a X(t).
Per esempio, con il set di dati di cui sopra, applicando la regressione lineare sul set di dati trasformato usando una finestra mobile di 14 punti dati si ottengono i seguenti risultati. Qui AC_errorRate considera la previsione corretta se è entro il 10% del valore reale.
LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307
Questo è piuttosto interessante perché batte l’auto ARIMA nel modo giusto ( MAPE 0.19 vs 0.13 con finestre mobili).
Quindi abbiamo provato solo la regressione lineare finora. Poi ho provato diversi altri metodi, e i risultati sono riportati di seguito.
La regressione lineare va ancora abbastanza bene, tuttavia, è debole nel mantenere il tasso di errore entro il 10%. L’apprendimento profondo è migliore su questo aspetto, tuttavia, ha richiesto una seria messa a punto. Si prega di notare che i test sono fatti con 200k punti di dati in quanto il mio obiettivo principale è su piccoli set di dati.
Ho ottenuto i migliori risultati da una rete neurale con 2 strati nascosti di dimensioni 20 unità in ogni strato con zero dropout o regolarizzazione, funzione di attivazione “relu”, e ottimizzatore Adam(lr=0.001) in esecuzione per 500 epoche. La rete è implementata con Keras. Durante la messa a punto, ho trovato articoli e abbastanza utile.
Poi ho provato la stessa idea con pochi altri set di dati.
- Dataset della produzione di latte (piccoli < 200 punti dati)
- Dataset della condivisione di biciclette (circa 18.000 punti dati)
- USD a Euro Exchange rate (circa 6500 punti dati)
- Prezzi delle azioni Apple (circa 13000 punti dati)
Le previsioni sono fatte come serie temporale univariata. Cioè consideriamo solo le marche temporali e il valore che stiamo prevedendo. Qualsiasi valore mancante è imputato usando il padding (usando il valore più recente). Per tutti i test, abbiamo usato una finestra di dimensione 14 per come finestra di laminazione.
Le tabelle seguenti mostrano i risultati. Qui, eccetto Auto.Arima, gli altri metodi che usano una serie di dati basati su una finestra mobile.
Non esiste un chiaro vincitore. Tuttavia, il metodo della finestra mobile che abbiamo discusso accoppiato con un algoritmo di regressione sembra funzionare abbastanza bene.
Conclusione
Abbiamo discusso tre metodi: ARIMA, Usare le caratteristiche per rappresentare gli effetti del tempo, e Rolling windows per fare previsioni del valore successivo di serie temporali con insiemi di dati di medie dimensioni.
Tra i tre, il terzo metodo fornisce buoni risultati paragonabili al modello ARIMA automatico anche se ha bisogno di un minimo di assistenza da parte dell’utente finale.
Pertanto crediamo che la “Rolling Window based Regression” sia un’utile aggiunta per la borsa dei trucchi del previsore!
Tuttavia, questo non scredita l’ARIMA, poiché con la messa a punto di un esperto, farà molto meglio. Allo stesso tempo, con caratteristiche artigianali, i metodi due e tre faranno anche meglio.
Una considerazione cruciale è la scelta della dimensione della finestra per il metodo della finestra mobile. Spesso possiamo avere una buona idea dal dominio. L’utente può anche fare una ricerca di parametri sulla dimensione della finestra.
Seguono alcune cose che hanno bisogno di ulteriore esplorazione.
- Possiamo usare RNN e CNN? Ho provato RNN, ma non ho potuto ottenere buoni risultati finora.
- Potrebbe essere utile alimentare altre caratteristiche come l’ora del giorno, il giorno della settimana, e anche le medie mobili di diverse finestre temporali.
- Una panoramica degli algoritmi di ottimizzazione a discesa del gradiente
- CS231n Reti Neurali Convoluzionali per il Riconoscimento Visivo
Se ti è piaciuto questo post potresti trovare interessanti anche i seguenti.
- Introduzione al rilevamento delle anomalie: Concetti e Tecniche
- Cronaca di Big Data: A Technical Comedy
Inoltre, controlla alcuni dei miei post più letti e i miei talk (video). Parlate con me a @srinath_perera o trovatemi.