Optimale Konstruktion von Tagesmerkmalen in neuronalen Netzen

18

Während ich an einem Regressionsproblem arbeitete, begann ich über die Darstellung des Merkmals "Wochentag" nachzudenken. Ich frage mich, welcher Ansatz besser abschneiden würde:

  • ein Merkmal; Wert 1/7 für Montag; 2/7 für Dienstag ...
  • 7 Funktionen: (1, 0, 0, 0, 0, 0, 0) für Montag; (0, 1, 0, 0, 0, 0, 0) für Dienstag ...

Es ist schwierig, dies zu messen, da es Unterschiede in der Netzwerkkonfiguration gibt. (Weitere sechs Funktionen sollten sich meiner Meinung nach in der Anzahl der ausgeblendeten Knoten widerspiegeln.)

Die Anzahl aller Funktionen beträgt ungefähr 20. Ich verwende einfaches Backprop, um das normale neuronale Feed-Forward-Netzwerk zu erlernen.

Oepas Dost
quelle
Was ist mit der binären Codierung für Wochentage? 3 Funktionen, wobei (0, 0, 0) Sonntag ist. (0, 0, 1) für Montag und so weiter?
Shamoon
Dies hat den zusätzlichen Vorteil, dass die Funktionen auf etwas Bedeutsameres reduziert werden, um die Rechenzeit zu verkürzen
Shamoon,

Antworten:

22

Ihre zweite Darstellung ist traditioneller für kategoriale Variablen wie Wochentag.

Dies wird auch als Erstellen von Dummy-Variablen bezeichnet und ist eine weit verbreitete Methode zum Codieren von kategorialen Variablen. Wenn Sie die Codierung 1-7 verwendet haben, sagen Sie dem Modell, dass die Tage 4 und 5 sehr ähnlich sind, während die Tage 1 und 7 sehr unterschiedlich sind. Tatsächlich sind die Tage 1 und 7 genauso ähnlich wie die Tage 4 und 5. Dieselbe Logik gilt für die 0-30-Kodierung für die Tage des Monats.

Der Tag des Monats ist etwas kniffliger, denn während jede Woche die gleichen 7 Tage hat, hat nicht jeder Monat die gleichen 30 Tage: Einige Monate haben 31 Tage und einige Monate haben 28 Tage. Da sowohl Wochen als auch Monate zyklisch sind, können Sie Fourier-Transformationen verwenden , um sie in glatte lineare Variablen umzuwandeln.

Zum Beispiel ( mit R, der Programmiersprache meiner Wahl ):

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

roh gegen Sünde gegen Cosinus

(Ich habe die Sinus / Cosinus-Variablen auf 0/30 skaliert und nicht auf -1/1, damit das Diagramm besser aussieht.)

Wie Sie sehen, springt die rohe "Tag-des-Monats-Variable" am Ende jedes Monats auf Null zurück. Die Sinus- und Cosinus-Transformationen bilden jedoch einen reibungslosen Übergang, mit dem das Modell erkennt, dass die Tage am Ende eines Monats ähnlich sind Tage zu Beginn des nächsten Monats.

Sie können den Rest der Fourier-Terme wie folgt hinzufügen:

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

Komplette Transformationen

Jedes Sinus / Cosinus-Wellenpaar bildet einen Kreis:

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)

Kreis Auf dieser Seite finden Sie eine praktische Erklärung zum Manipulieren von Sinus- und Cosinuswellen.

Zach
quelle
Gibt es einen bestimmten Grund dafür? Ich frage mich, wie sich dies auf die Konvergenz auswirken könnte. Mein zweiter Zweifel ist, wann eine Variable noch kategorisch ist - was ist mit dem Tag des Monats? (0 - 30)
Oepas Dost
Gleiche Sache; Indikatorvariablen verwenden. Die erste Codierung führt zu einem Ähnlichkeitsmaß, das möglicherweise nicht geeignet ist. zB ist Sonntag wirklich der unähnlichste Tag von Montag? Das ist, was die Kodierung impliziert ...
Emre
@OepasDost Wenn mein Beitrag Ihre Frage beantwortet, können Sie ihn durch Klicken auf das Häkchen abstimmen und / oder annehmen.
Zach
@Zach, warum sollten Sie Wochentag (der von 0 bis 6 codiert werden kann) als kategorial und Tag des Monats als ordinal zyklisch betrachten (und daher die Fourier-Transformation verwenden). Und nicht beide als ordinal zyklisch und deshalb auch für Wochentag eine Fouriertransformation?
Zipp
1
@zipp Sie können auch einen Fourier für den Wochentag verwenden. Meiner Erfahrung nach ist der primäre Wert für Wochentag der Unterschied zwischen Wochentagen und Wochenenden, der mit Dummy-Variablen (oder einer Indikatorvariablen) sehr einfach zu erfassen ist.
Zach