Data / ora di codifica (dati ciclici) per reti neurali


12

Come codificare la data e l'ora di un evento per una rete neurale?

Non ho una serie temporale continua, ma alcuni eventi con data e ora e analizzo un qualche tipo di interesse. Questo interesse differisce tra mattina e sera e differisce tra i giorni feriali e tra estate e inverno, prima di Natale e Pasqua e così via. E gli eventi stessi hanno una forte distribuzione non uniforme nel tempo (più di giorno che di notte, alcuni più durante la settimana, altri durante il fine settimana).

Ho provato a codificarlo come numero di settimana dell'anno, come giorno 1-7 e come ora del giorno. Ma giocare con un autoencoder sparso mi ha dato l'impressione che i miei dati non abbiano alcun senso per una rete neurale, non potevano nemmeno riprodurre nulla vicino all'ingresso anche con un grande strato nascosto. Né come 0-1 categoriale né come valori normalizzati.

Ma cercare la codifica del tempo per una rete neurale fornisce principalmente informazioni sulle serie temporali, quindi sono un po 'bendato dalla foresta ma alla ricerca dell'albero.

Certo, potrei guardare i dati e classificarli approssimativamente in modo più o meno dispotico. Ma il concetto di Deep Learning sembra spazzare via tutta l'estrazione manuale manuale delle caratteristiche. E la categorizzazione inserirebbe grandi salti in una variabile di input naturalmente continua.

La mia "codifica naturale" nel mio cervello è più simile a un'appartenenza sfocata ad alcune categorie come "notte", "mattina", "giorno della settimana" e così via.

Per rendere il tutto più interessante, anche la variabile di dipendenza contiene quei dati di data / ora, ma questa è una domanda diversa.

EDIT: in qualche modo legati al tipo ciclico di dati ci sono alcune domande recenti, come

Quali test statistici sono ragionevoli con questo set di dati dell'ora del giorno?

Risposte:


7

Stavo cercando una risposta a un problema simile e mi sono imbattuto in questo thread. L'idea di codifica sinusoidale viene esplorata in questo post del blog:

Codifica di funzioni cicliche continue - 24 ore

La risposta di Ian ha pienamente soddisfatto le mie esigenze, quindi ho pensato di pubblicarla qui per la memoria futura.


Mi chiedo come questo possa essere usato stackoverflow.com/questions/59653862/… - specialmente quando sono le funzionalità.
user4581

1

Potresti provare a rappresentare il tempo come una grande matrice, ovvero un 365 per 24, per rappresentare i giorni dell'anno e le ore del giorno, e quindi "srotolarlo" in un vettore 1 per 8760. Il tempo corrisponderebbe quindi alla posizione all'interno di questo vettore e il valore in questa posizione è il valore in quel momento.


2
Hai provato e riuscito con una codifica del genere? Sarei sorpreso se una rete neurale "imparasse" le posizioni esatte della domenica mattina in questa codifica. Ma sorprendere l'ingenuo è uno dei punti di forza delle reti neurali, quindi non scommetterei contro il mio scotch. ;-)
flaschenpost,

Questo potrebbe essere utile se si desidera rilevare eventi ciclici entro la stessa ora in vari anni, ma mi sembra che la correlazione sia molto debole. Riesco a vedere una maggiore probabilità di una correlazione tra la stessa ora ogni settimana o la stessa ora ogni giorno, per la maggior parte dei dati delle serie temporali.
thekingoftruth,

1

Suggerirei di creare più funzioni di input dalle serie storiche utilizzando relazioni che conosci (o ritieni) già esistenti nei dati. Ad esempio, dichiari che l'output di destinazione varierà:

tra mattina e sera, e differisce tra i giorni feriali e tra estate e inverno, ...

Quindi perché non creare un insieme di funzionalità che descrivono ciascuno di questi "cicli". Questo può aiutare a stuzzicare le variazioni di micro e macro piuttosto che una singola caratteristica che descrive tutto.

Per esempio...

Se hai una tendenza in base alla quale si verifica qualcosa di interessante intorno a mezzogiorno ogni giorno, crea una funzione da 1 a che descriva le ore del giorno. Ora la rete imparerà a innescarsi verso le 12. Confronta questo con il caso in cui hai gli stessi dati codificati come ore in una settimana . Ora la rete deve provare a imparare a innescare il che è significativamente più complesso.1..168 12 , 36 , 60 ...1..241..16812,36,60...


Sì, anche questa è stata la mia prima idea. Ma il concetto circolare di tempo (23:59 è seguito da 00:00) viene quindi nascosto e un'altra cosa che mi preoccupa è il salto tra i numeri apparentemente interi - un evento alle 09:55 è molto simile alle 10:05, ma la mattina alle 06:10 è molto diverso dalle 06:55. Potrei immaginare di cercare i centri del tempo (ottica o simili?) E poi misurare e dare la distanza a quei centri. Quindi 04:30 è la notte più profonda, mentre 05:30 è più "mattutino", ma completamente non come la sera.
flaschenpost,

1
Bene, in quel caso potresti provare a codificare come sinusoide o coseno, o in effetti entrambi.
CatsLoveJazz,
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.