Apprendimento automatico: funzionalità di ingegneria basata su dati di data / ora


45

Quali sono le pratiche migliori / comuni per gestire i dati temporali per l'applicazione di apprendimento automatico?

Ad esempio, se nel set di dati è presente una colonna con data / ora dell'evento, ad esempio "05-05-2014", come è possibile estrarre funzioni utili da questa colonna?

Grazie in anticipo!

Risposte:


44

Vorrei iniziare rappresentando graficamente la variabile temporale rispetto ad altre variabili e cercando tendenze.

Per esempio

inserisci qui la descrizione dell'immagine

In questo caso c'è una tendenza settimanale periodica e una tendenza al rialzo a lungo termine. Quindi vorresti codificare due variabili temporali:

  • day_of_week
  • absolute_time

In generale

Esistono diversi intervalli di tempo comuni in cui si verificano le tendenze:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Cerca le tendenze in tutti questi.

Tendenze bizzarre

Cerca anche tendenze strane. Ad esempio, potresti vedere tendenze basate sul tempo rare ma persistenti:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Questi spesso richiedono il riferimento incrociato dei dati a una fonte esterna che mappa gli eventi nel tempo.

Perché grafico?

Ci sono due motivi per cui penso che la rappresentazione grafica sia così importante.

  • Tendenze bizzarre
    Mentre le tendenze generali possono essere automatizzate abbastanza facilmente (basta aggiungerle ogni volta), le tendenze bizzarre richiedono spesso un occhio umano e la conoscenza del mondo da trovare. Questo è uno dei motivi per cui la rappresentazione grafica è così importante.

  • Errori nei dati
    Troppo spesso i dati contengono errori gravi. Ad esempio, potresti scoprire che le date sono state codificate in due formati e solo uno di essi è stato correttamente caricato nel tuo programma. Ci sono una miriade di tali problemi e sono sorprendentemente comuni. Questa è l'altra ragione per cui ritengo che la rappresentazione grafica sia importante, non solo per le serie storiche, ma per qualsiasi dato.


7

Dividi i dati in finestre e trova funzionalità per quelle finestre come coefficienti di autocorrelazione, wavelet, ecc. E usa quelle funzionalità per l'apprendimento.

Ad esempio, se si dispone di dati di temperatura e pressione, suddividerli in singoli parametri e calcolare funzioni come il numero di minimi locali in quella finestra e altri e utilizzare queste funzionalità per il modello.


7

Un'altra cosa da considerare, oltre a tutto ciò che Ben Haley ha detto, è quella di convertire l'ora locale dell'utente . Ad esempio, se si sta tentando di prevedere qualcosa che si verifica intorno alle 20:00 per tutti gli utenti, se si osserva l'ora UTC, sarà più difficile prevederlo.


6

In molti casi i dati e gli eventi all'interno di una serie storica sono stagionali. In tali casi, il mese e l'anno dell'evento contano molto. Pertanto, in tali scenari è possibile utilizzare variabili binarie per indicare se l'evento si verifica durante un determinato mese / anno o meno.

Spero che questo risponda alla tua domanda. Se non è gentile, sii un po 'più specifico su cosa stai esattamente cercando di ottenere


4

Come Ben e Nar hanno spiegato bene, suddividere l'oggetto data-ora in secchi di parti di data e ora aiuterebbe a rilevare le tendenze stagionali, dove l'oggetto data-ora completo (e di solito anche peggio - unico) lo mancherebbe

Non hai menzionato alcun algoritmo di apprendimento automatico specifico che ti interessa, ma nel caso in cui ti interessi anche il clustering basato sulla distanza, come k-medie, generalizzerei l'oggetto data-ora nel formato unix-time . Ciò consentirebbe un semplice confronto numerico della distanza per l'algoritmo, indicando semplicemente fino a che punto sono i valori di 2 date.

Nel tuo esempio generalizzerei il valore di sola data 2014-05-05 a 1399248000 (l'ora unix che rappresenta l'inizio del 5 maggio 2014, UTC).

[Si potrebbe sostenere che è possibile raggiungere questo obiettivo inserendo la data-ora in ogni possibile parte della data-ora .. ma ciò aumenterebbe significativamente le dimensioni del set di dati. Quindi, suggerirei di combinare il tempo unix, per la misurazione della distanza e alcuni dei secchi data-ora]


3

Ben sta parlando delle funzionalità statiche e fa uso delle funzioni di data e ora.

Come estensione, introdurrò le funzionalità di ritardo , non sto parlando delle serie storiche, ma degli aggregati.

La parte più mistica è che il valore futuro è invisibile per noi, come possiamo usare quelle caratteristiche aggregate nei dati di addestramento?

Un piccolo esempio: ci sono dati annuali sul consumo elettrico dal 1991 al 2015, voglio prevedere il consumo elettrico nei prossimi 5 anni, dal 2016 al 2020. Calcolerò la media mobile degli ultimi 5 anni del consumo elettrico come valori caratteristici del 2020, ma dal 2016 al 2020 non ci è noto, quindi siamo in testa (di fronte al ritardo) della serie temporale a 5 anni, facciamo la media mobile dal 2010 al 2015, quindi usiamo questo valore come valori caratteristici del 2020. Quindi, possiamo costruire i dati sulle caratteristiche dei prossimi 5 anni.

Il prossimo passo è semplicemente usare la funzione di spostamento (count \ mean \ median \ min \ max.etc) e provare diverse finestre, quindi costruirai molte funzionalità!


2

A seconda di ciò che ti interessa con le informazioni sulla data / ora, potresti semplicemente volerle bin. Ad esempio, se sei interessato alla distanza da un punto di partenza (ad esempio, 1 gennaio 2015) e vuoi misurarlo in mesi, lo codificherei semplicemente come mese 1 (per 1-31 gennaio 2015), 2 (1-28 febbraio 2015), 3, 4, 5, 6, ecc. Poiché la distanza tra le date di inizio è approssimativamente la stessa, ciò rappresenta la distanza temporale in un formato continuo semplice. E dico continuo perché puoi dire il mese 6.5 e sapere che è a metà giugno 2015. Quindi non devi preoccuparti della codifica della data effettiva e puoi usare tutti i tuoi metodi di classificazione tipici.

Se vuoi misurare in giorni, so che MySql ha una funzione 'to_days', se ti capita di usarlo per estrarre i dati prima della classificazione. Python probabilmente ha qualcosa di simile, o usa il formato unix-time suggerito da Mork.

Spero che sia di aiuto!


1

Traccia grafici con diverse variazioni di tempo rispetto alla variabile di risultato per vederne l'impatto. È possibile utilizzare mese, giorno, anno come funzioni separate e poiché il mese è una variabile categoriale, è possibile provare un diagramma box / baffo e vedere se ci sono schemi. Per le variabili numeriche, è possibile utilizzare un diagramma a dispersione.


1

Non so se questa è una pratica comune / migliore, ma è un altro punto di vista della questione.

Se hai, diciamo, una data, puoi considerare ogni campo come una "variabile di categoria" anziché una "variabile continua". Il giorno avrebbe un valore nell'insieme {1, 2 ..., 31}, il mese avrebbe un valore in {1, ..., 12} e, per l'anno, scegli un valore minimo e uno massimo e costruisci un set.

Quindi, poiché i valori numerici specifici di giorni, mesi e anni potrebbero non essere utili per trovare tendenze nei dati, utilizzare una rappresentazione binaria per codificare i valori numerici, essendo ogni bit una caratteristica. Ad esempio, il mese 5 sarebbe 0 0 0 0 1 0 0 0 0 0 0 0(11 0 è un 1 in 5a posizione, ogni bit è una caratteristica).

Quindi, avendo, ad esempio, 10 anni nel "set di anni", una data verrebbe trasformata in un vettore di 43 caratteristiche (= 31 + 12 + 10). Usando "vettori sparsi", la quantità di funzionalità non dovrebbe essere un problema.

Qualcosa di simile potrebbe essere fatto per i dati temporali, il giorno della settimana, il giorno del mese ...

Tutto dipende dalla domanda a cui vuoi che il tuo modello di apprendimento automatico risponda.


Questo non riesce a catturare relazioni che probabilmente esistono, come, che il 14 e il 15 del mese sono "simili". Nella misura in cui credi che ogni giorno sia letteralmente diverso, credi anche che la previsione di domani non sia possibile. Inoltre, non è necessario codificare categorici a caldo, non necessariamente.
Sean Owen,

Non riesco a capire perché non riesca a catturare la "vicinanza" di date vicine. Se, ad esempio, dai il vettore binario a un NN, lo capirà da solo dopo l'addestramento appropriato. L'uso dei vettori binari è solo un modo di rappresentare le categorie.
Paco Barter

In questo caso, hai effettivamente colonne come "is_12th" e "is_13th" che sono, nello spazio di input, non correlate e non correlate a "is_1st", ecc. Come caratteristica continua, catturerebbe correttamente che il 12 ° e il 13 ° sono in un certo senso sono più vicini del 1 ° e del 12 °. Stai facendo appello a ciò che un modello potrebbe dedurre, ma sto parlando di ciò che codificano le funzionalità di input.
Sean Owen

Ok capisco. Hai ragione, una funzione continua cattura meglio la qualità "di prossimità" delle date. Il mio punto è che potrebbero esserci tendenze nei dati per ciò che i valori numerici delle date sono irrilevanti (ad esempio, un certo modello di acquisto da parte dei clienti solo di sabato). Quindi offre un altro punto di vista per gestire le date.
Paco Barter

Come ha detto @PacoBarter, la codifica one-hot ignora la diversa distanza tra le categorie. Ciò non è così facile da affrontare poiché queste funzionalità sono intrinsecamente informazioni di fase, mentre la maggior parte dei modelli di apprendimento automatico non ha input di tipo di fase. Tuttavia, potrebbero essere utili alcune metriche DIY sulla distanza.
plpopk,

0

Contesto della mia risposta : finora ci sono state grandi risposte. Ma voglio estendere la conversazione assumendo che tu stia parlando di un'applicazione di machine learning per prevedere i valori futuri di questa particolare serie temporale. Con questo contesto in mente, il mio consiglio è sotto.

Consiglio : esaminare prima le tradizionali strategie di previsione statistica (ad es. Smoothing esponenziale, SARIMAX o Regressione dinamica) come base per le prestazioni di previsione. Sebbene l'apprendimento automatico abbia mostrato grandi promesse per una varietà di applicazioni, per le serie storiche, esistono metodi statistici collaudati che possono servire meglio per la tua applicazione. Vorrei attirare la vostra attenzione su due articoli recenti:

  1. Metodi di previsione statistica e dell'apprendimento automatico: preoccupazioni e vie da seguire di Spyros Makridakis et al. L'articolo sottolinea che per molte serie storiche, l'analisi tradizionale delle serie storiche supera i modelli di machine learning (ML). In sostanza, ML ha la tendenza a sovrautilizzare e viene violata qualsiasi ipotesi di modello ML relativa a voci indipendenti.
  2. Previsioni semplici contro complesse: le prove di Kesten C Green et al. L'articolo confronta ed esamina l'output delle serie temporali di articoli periodici sottoposti a revisione paritaria che riportano l'analisi delle serie temporali con e senza confronti con una varietà di modelli. In conclusione, i ricercatori hanno complicato le loro analisi con modelli più difficili da interpretare e con prestazioni peggiori. Comunemente, ciò si verifica a causa di scarse strutture di incentivazione.

Se stai cercando buone prestazioni, scegli una metrica da confrontare con diversi modelli (es. Come MASE) e fai scorrere vari modelli statistici (riferimenti sotto) e di apprendimento automatico (con le strategie di sviluppo delle funzionalità sopra menzionate).

Saluti,

Risorse per l'apprendimento delle previsioni statistiche : vorrei iniziare esaminando il libro di testo gratuito di Rob J Hyndman qui: https://otexts.org/fpp2/ . Il testo è basato su un pacchetto R che puoi facilmente integrare nella tua analisi: https://otexts.org/fpp2/appendix-using-r.html . Infine, si prega di essere consapevoli della differenza tra la validazione incrociata trasversale e la validazione incrociata di serie storiche come spiegato qui: https://robjhyndman.com/hyndsight/tscv/ .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.