Construction optimale de la caractéristique du jour dans les réseaux de neurones


19

En travaillant sur le problème de régression, j'ai commencé à penser à la représentation de la fonction "jour d'une semaine". Je me demande quelle approche fonctionnerait mieux:

  • une caractéristique; valeur 1/7 pour lundi; 2/7 pour mardi ...
  • 7 fonctionnalités: (1, 0, 0, 0, 0, 0, 0) pour lundi; (0, 1, 0, 0, 0, 0, 0) pour mardi ...

Il est difficile de le mesurer en raison des différences de configuration réseau. (Je pense que six fonctionnalités supplémentaires devraient se refléter dans le nombre de nœuds cachés.)

Le nombre de toutes les fonctionnalités est d'environ 20. J'utilise un backprop simple pour apprendre le réseau neuronal à action directe ordinaire.


Qu'en est-il de l'utilisation de l'encodage binaire pour le jour de la semaine? 3 fonctionnalités, où (0, 0, 0) est dimanche. (0, 0, 1) pour lundi et ainsi de suite?
Shamoon

Cela a l'avantage supplémentaire de réduire les fonctionnalités à quelque chose de plus significatif pour réduire le temps de calcul
Shamoon

Réponses:


23

Votre deuxième représentation est plus traditionnelle pour les variables catégorielles comme le jour de la semaine.

Ceci est également connu sous le nom de création de variables fictives et est une méthode largement utilisée pour coder des variables catégorielles. Si vous avez utilisé l'encodage 1-7, vous dites au modèle que les jours 4 et 5 sont très similaires, tandis que les jours 1 et 7 sont très différents. En fait, les jours 1 et 7 sont tout aussi similaires que les jours 4 et 5. La même logique est valable pour l'encodage 0-30 pour les jours du mois.

Le jour du mois est un peu plus délicat, car si chaque semaine a les mêmes 7 jours, chaque mois n'a pas les mêmes 30 jours: certains mois ont 31 jours et certains mois ont 28 jours. Comme les semaines et les mois sont cycliques, vous pouvez utiliser des transformations de Fourier pour les convertir en variables linéaires lisses.

Par exemple (en utilisant R, mon langage de programmation de choix ):

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'))

brut vs péché vs cosinus

(J'ai mis à l'échelle les variables sinus / cosinus pour qu'elles soient de 0/30, plutôt que de -1/1 pour que le graphique soit meilleur)

Comme vous pouvez le voir, alors que la variable "jour du mois" revient à zéro à la fin de chaque mois, les transformations sinus et cosinus font une transition en douceur qui permet au modèle de savoir que les jours à la fin d'un mois sont similaires à jours au début du mois suivant.

Vous pouvez ajouter le reste des termes Fourier comme suit:

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'))

Transformations complètes

Chaque paire d'ondes sinus / cosinus forme un cercle:

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)

cercle Cette page a une explication très pratique sur la façon de manipuler les ondes sinus et cosinus.


Y a-t-il une raison spécifique de le faire? Je me demande comment cela pourrait affecter la convergence. Mon deuxième doute est quand une variable est toujours catégorique - qu'en est-il du jour du mois? (
0-30

Même chose; utiliser des variables indicatrices. Le premier codage induit une mesure de similitude qui peut ne pas être appropriée; Par exemple, le dimanche est-il vraiment le jour le plus différent du lundi? C'est ce que l'encodage implique ...
Emre

@OepasDost Si mon message répond à votre question, n'hésitez pas à le voter et / ou à l'accepter en cliquant sur la coche.
Zach

@Zach pourquoi considéreriez-vous le jour de la semaine (qui peut être encodé de 0 à 6) comme catégorique et le jour du mois comme ordinal cyclique (et utilisez donc la transformée de Fourier). Et pas tous les deux comme cycliques ordinaux et donc faire une transformation de Fourier pour le jour de la semaine aussi?
zipp

1
@zipp Vous pouvez également utiliser un Fourier pour le jour de la semaine. D'après mon expérience, la valeur principale du jour de la semaine est la différence entre les jours de la semaine et les week-ends, ce qui est très simple à saisir avec des variables fictives (ou une variable indicatrice).
Zach
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.