Costruzione ottimale della funzionalità giornaliera nelle reti neurali


19

Lavorando sul problema della regressione, ho iniziato a pensare alla rappresentazione della funzione "giorno della settimana". Mi chiedo quale approccio avrebbe prestazioni migliori:

  • una caratteristica; valore 1/7 per lunedì; 2/7 per martedì ...
  • 7 caratteristiche: (1, 0, 0, 0, 0, 0, 0) per lunedì; (0, 1, 0, 0, 0, 0, 0) per martedì ...

È difficile misurarlo a causa delle differenze di configurazione della rete. (Credo che ulteriori sei funzioni dovrebbero riflettersi nel numero di nodi nascosti.)

Numero di tutte le funzionalità è di circa 20. Uso un semplice backprop per apprendere la normale rete neurale feed-forward.


Che dire dell'utilizzo della codifica binaria per il giorno della settimana? 3 funzioni, dove (0, 0, 0) è domenica. (0, 0, 1) per lunedì e così via?
Shamoon

Questo ha l'ulteriore vantaggio di ridurre le funzionalità a qualcosa di più significativo per ridurre i tempi di calcolo
Shamoon

Risposte:


23

La tua seconda rappresentazione è più tradizionale per variabili categoriche come il giorno della settimana.

Questo è anche noto come creazione variabili fittizie ed è un metodo ampiamente utilizzato per la codifica di variabili categoriali. Se hai usato la codifica 1-7 stai dicendo al modello che i giorni 4 e 5 sono molto simili, mentre i giorni 1 e 7 sono molto diversi. In effetti, i giorni 1 e 7 sono simili ai giorni 4 e 5. La stessa logica regge per la codifica 0-30 per i giorni del mese.

Il giorno del mese è un po 'più complicato, perché mentre ogni settimana ha gli stessi 7 giorni, non tutti i mesi hanno gli stessi 30 giorni: alcuni mesi hanno 31 giorni e alcuni mesi hanno 28 giorni. Poiché sia ​​le settimane che i mesi sono ciclici, è possibile utilizzare trasformazioni di Fourier per convertirle in variabili lineari regolari.

Ad esempio ( usando R, il mio linguaggio di programmazione preferito ):

day_of_month = c(1:31, 1:28, 1:30)
day_of_year <- 1:length(day_of_month)
s = sin((2*pi)/30*day_of_month)
c = cos((2*pi)/30*day_of_month)
plot(day_of_month ~ day_of_year)
lines(15*s+15 ~ day_of_year, col='blue')
lines(15*c+15 ~ day_of_year, col='red')
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

crudo vs peccato vs coseno

(Ho ridimensionato le variabili seno / coseno in modo che siano 0/30, anziché -1/1 in modo che il grafico appaia migliore)

Come puoi vedere, mentre la "variabile del giorno del mese" grezza torna a zero alla fine di ogni mese, le trasformazioni seno e coseno effettuano una transizione graduale che consente al modello di sapere che i giorni alla fine di un mese sono simili a giorni all'inizio del mese successivo.

Puoi aggiungere il resto dei termini di Fourier come segue:

for(i in 1:3){
  s = sin((2*pi)/30*day_of_month + 30 * i/4)
  c = cos((2*pi)/30*day_of_month + 30 * i/4)
  lines(15*s+15 ~ day_of_year, col='blue')
  lines(15*c+15 ~ day_of_year, col='red')
}
legend(10, 30, c('raw', 'sin', 'cos'), c('black', 'blue', 'red'))

Trasformazioni complete

Ogni coppia di onde seno / coseno fa un cerchio:

m <- lapply(1:4, function(i){
  as.matrix(
    data.frame(
    s = sin((2*pi)/30*day_of_month + 30 * i/4),
    c = cos((2*pi)/30*day_of_month + 30 * i/4)
    )
  )
})
m <- do.call(cbind, m)
pairs(m)

cerchio Questa pagina ha una spiegazione davvero utile su come manipolare le onde sinusoidali e coseno.


C'è qualche motivo specifico per farlo? Mi chiedo come possa influire sulla convergenza. Il mio secondo dubbio è quando una variabile è ancora categorica - che dire del giorno del mese? (0-30)
0-30 Oepas Dost,

Stessa cosa; utilizzare le variabili dell'indicatore. La prima codifica induce una misura di somiglianza che potrebbe non essere appropriata; ad esempio, la domenica è davvero il giorno più diverso dal lunedì? Ecco cosa implica la codifica ...
Emre,

@OepasDost Se il mio post risponde alla tua domanda, sentiti libero di votarlo e / o accettarlo facendo clic sul segno di spunta.
Zach,

@Zach perché dovresti considerare il giorno della settimana (che può essere codificato da 0 a 6) come categorico e il giorno del mese come ciclico ordinale (e quindi utilizzare la trasformata di Fourier). E non entrambi come ciclici ordinali e quindi una trasformata di Fourier anche per il giorno della settimana?
zipp,

1
@zipp Puoi usare un Fourier anche per il giorno della settimana. Nella mia esperienza, il valore principale del giorno della settimana è la differenza tra giorni feriali e fine settimana, che è molto semplice da acquisire con variabili fittizie (o una variabile indicatore).
Zach,
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.