Laden...

Wie ein neuronales Netz entwerfen, das aus historischen Daten eine Prognose für die Zukunft abgibt?

Erstellt von Setso vor 7 Jahren Letzter Beitrag vor 7 Jahren 5.405 Views
S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren
Wie ein neuronales Netz entwerfen, das aus historischen Daten eine Prognose für die Zukunft abgibt?

Hallo,

bin gerade durch Google auf euch gestossen, und mir schon ein paar spannende Topics durchgelesen.

Also: ich möchte ein NN programmieren, welches aus historischen Daten eine Prognose für ein Datum in der Zukunft abgibt.

Hier ein (sehr kleiner) Teil des Datenbestandes.

2005-11-10 05:00:00.000 0
2005-11-10 05:30:00.000 0
2005-11-10 06:00:00.000 1
2005-11-10 06:30:00.000 3
2005-11-10 07:00:00.000 12
2005-11-10 07:30:00.000 36
2005-11-10 08:00:00.000 89
2005-11-10 08:30:00.000 120
2005-11-10 09:00:00.000 209
2005-11-10 09:30:00.000 233
2005-11-10 10:00:00.000 217
2005-11-10 10:30:00.000 199
2005-11-10 11:00:00.000 244

Was sehen wir?
Der linke Block besteht aus dem Eingangsdatum. Außerdem gehört noch ein Intervall Uhrzeit dazu. Der Rechte Block zeigt den numerischen Wert für die Eingegangene Anrufe.
Beispiel Zeile 6:
Zwischen 07:30 und 08:00 Uhr, am 2005-11-10 sind 36 Anrufe eingegangen.

Als erstes habe ich mir Gedanken gemacht, welche Merkmale ich als Input reinnehme.
Dazu habe ich mir überlegt gehabt: Kalenderwoche, Wochentag, Intervall.
Output: Anrufaufkommen

Da mir das mit dem Datum zu abstrakt war, und das nur ein Studienprojekt ist, hab ich mich dazu entschieden das Datum als KW und Wochentag reinzunehmen...

Außerdem hab ich die input werte normalisiert,und aus jedem input zwei inputs gebildet. Der Grund dafür ist, dass es zwischen Tag 2 und Tag 3, aber auch zwischen Tag 7 und Tag 1 eine 1-Tages-Differenz gibt. Wenn ich es als 1,2,3,4,5,6,7 belasse, wird der Abstand zwischen Tag 1 und 7 asymetrisch. So bleibt die Nachbarschaft beibehalten. Das selbe bei den Kalenderwochen, und Intervallen.

Alle inputs sind [-1,1] normalisiert.

Hier mal paar Zeilen nach dem reparsen:

-0.12053668-0.99270 -0.9009 -0.43388 6.1232339E-17 1.0 0
-0.120536680 -0.99270 -0.90096886 -0.4338837 -0.130526192 0.991444861 0
-0.120536680 -0.99270887 -0.90096886 -0.4338837 -0.258819 0.9659258 5
-0.1205366802 -0.992708874 -0.9009688679 -0.43388373 -0.38268343 0.9238795 8

Wie müsste ich hier drauf eine Zeitreihenanalyse aufbauen?, Darauf wirds wohl am ende hinaus laufen.

Da es ja ein Semester-Projekt ist, hat sich die Frage gestellt ob das alles überhaupt realisierbar wäre bis Januar...es sieht sehr komplex aus, und bin auch noch nicht so tief in der Materie..

6.911 Beiträge seit 2009
vor 7 Jahren

Hallo Setso,

und bin auch noch nicht so tief in der Materie..

dann ist wohl das Beste wenn du dich ein wenig einliest, sonst wird das ein sehr einseitiges Foren-Thema werden 😉

Schau mal:
Prognose/Vorhersage Verfahren
Und sonst noch ein paar Threads die zum Thema von mir hier im Forum umherschwirren. (In der Suche http://www.mycsharp.de/wbb2/search.php kannst du den Benutzernamen als Filterkriterium angeben.

Ich weiß jetzt nicht ob ich das im anderen (verlinkten) Thread habe -- hab das nicht erneut gelesen und genau hab ich es auch nicht mehr im Kopf --, aber du solltest du Daten "zyklisch" kodieren. Stell dir das vor wie in Polarkoordinaten mit Radius und Winkel. Das bietet sich bei Wochentagen (Montag kommt jede Woche, usw.) oft als hilfreich an.

Als Netz würde ich hier vermutlich auf eine SOM (Kohonen-Netz) tippen, da diese zusammen mit der zyklischen Kodierung und der Selbstorganisation am passendsten ist.

PS: (0,1)-Transformation -- auch (statistische) z-Transformation genannt -- passt, sonst haben nämlich die Komponenten des Eigangsvektors verschiedene Gewichtung im Ergebnis.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

neben allem anderen ist auch wichtig, dass alle Informationen/Kriterien, die das Anrufaufkommen beeinflussen als Input geliefert werden. So wird das Anrufaufkommen sicher auch davon beeinflusst werden, ob der Tag ein (nicht) bundeseinheitlicher (beweglicher) Feiertag ist. Bei beweglichen Feiertagen wird ein NN erst nach Jahren die Regel herausbekommen, auf welchen Tag der Feiertag im aktuellen Jahr fällt, falls überhaupt je. Aber selbst bei festen Feiertagen wird die Frage, auf welchen Wochentag sie fallen, Einfluss auf das Anrufaufkommen der angrenzenden Tage haben (Stichwort: Brückentag).

Außerdem werden Großereignisse wie Fußballweltmeisterschaft einen Einfluss haben. Wenn das Netz von wichtigen Einflussfaktoren nichts weiß, dann wird es diese auch nicht bei der Vorhersage berücksichtigen können.

Für andere Einflüsse, die festen zeitlichen Regeln folgen, kann das Netz vermutlich Features entwickeln. Dazu braucht es aber eine passende Struktur, also vor allem genug interne Layer (Stichwort: Deep Neural Networks).

Ich frage mich auch, ob ein neuronales Netz hier das beste Werkzeug ist. Ich denke, eine statistische (Korrelations-)Analyse hätte hier vielleicht bessere Chancen (Stichwort Big-Data).

herbivore

PS: Ein wichtiger Faktor für das Anrufaufkommen wird das Wetter sein. Ohne dass dem Netz (bzw. sonstigem Algorithmus) passende Informationen darüber zur Verfügung gestellt werden, wird es/er kaum angemessen vorhersagen können.

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Hallo,

ich wollte mich kurz zurück melden. Also ich bin nun soweit, dass ich ein MLP aufgebaut habe, welches eine Zeitreihenvorhersage macht.

Ich bin gerade in der "Kennenlern"- Phase, und habe es nun soweit programmiert, dass ich die letzten 3 tage nutze um einen multi-step vorhersage für den nächsten Tag zu machen.
(72 INputs, 24 Outputs)

Ohne irgendwelche features einzubauen sind die vorhergesagten Werte schon in Ordnung.
Es wird die reine Zeitreihe als Regressionsproblem gesehen.

Nun haben sich ein paar Fragen ergeben.

  1. Ich habe untersucht, wie sich das Netz mit normalisierten Daten und mit nicht normalisierten Daten verhält. Das Netz mit nicht normalisierten Daten zu trainieren, dauert sehr lange. Als ich die Daten normalisiert habe (0-1) und durch das Netz laufen lasse, ging es ziemlich flott. Als Aktivierungsfunktion nutze ich reLu. Mir ist klar, dass ich bei der Nutzung Sigmoider Aktivierungsfunktion die Daten sowieso normalisieren müsste. Nun frage ich mich, was ist der wissenschaftliche bzw mathematische Aspekt dahinter, dass ein MLP mit normalisierten Daten viel besser arbeiten kann?

Wie oben schon angesprochen, ist es wichtig features einzubauen. Es ist also wichtig, zu erkennen wie es mit Feiertagen usw aussieht, und dass das MLP ein Gewühl für die Wochentage bekommt. Die Frage ist nun, wie kann ich solche Merkmale dem Netz mitgeben? Einfach die Eingabe neuronen erweitern würde doch die zeitreihe durcheinander bringen?

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

zu 1. die Frage ist, was du unter Normalisierung verstehst. a) Alle Werte durch den maximalen je aufgetretenen Wert teilen oder b) alle Werte eines Tages durch den jeweils maximalen Wert dieses Tages teilen. Das letzteres die Situation verbessert liegt einfach daran, dass nicht mehr die absolute Anrufmenge erkannt und vorhergesagt werden muss, sondern nur noch die relative Verteilung der angehenden Anrufe auf die einzelnen Stunden des aktuellen Tages.

Eine andere Variante wäre, dass wenn du unnormalisierte Werte an ein Netz legst, das aufgrund seines Aufbaus (z.B. eben der Aktivierungsfunktion) normalisierte Werte erwartet bzw. verlangt, für das Netz alle werte über eins einfach als eins interpretiert werden und nur die paar Werte zwischen 0 und 1 überhaupt differenziert werden.

Wenn keine der beschriebenen Möglichkeiten trifft, beschreib bitte genau, wie du normalisierst bzw. den genauen Unterschied zwischen normalisiert und nicht normalisiert.

zu 2. Deine Zeitreihe wird doch sowieso immer um 24 Neuronen auf einmal verschoben oder nicht? Wenn ja, dann kannst du doch für jeden Tag Neuronen für die zusätzlichen Features einbauen. Wenn du die neuen Neuronen zwischen die Tage packst (also z.B. immer bei 0 Uhr bzw. immer da, wo das Anrufaufkommen quasi 0 ist) sehe ich erstmal kein Problem.

Natürlich sind auch andere Verschaltungen denkbar. Zum Beispiel welche, bei denen Stunden- und Feature-Neuronen erst in einem internen Layer aufeinander treffen und ansonsten je einen eigenen Inputlayer haben, in dem sie nur unter ihresgleichen verbunden sind.

herbivore

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Hallo herbivore,

erstmal vielen Dank für die Antwort.

Also ich normalisiere nach Punkt a), ich habe meine Daten vor dem Trainieren durch folgende Funktion laufen lassen: Y = (x-min) /(max-min). und nicht normalisiert heißt, ich habe die Werte für das Anrufaufkommen so in das Netz gejagt.

Ja richtig, also sagst du, ich kann beispielsweise dem Input noch 3 Neuronen hinzufügen mit einem boolean feature um zu spezifizieren ob Feiertag oder nicht?Also nach jedem Tag (24 Werte) noch ein Neuron welches den Tag als Feiertag identifiziert oder nicht. Muss das selbe auch beim Output Layer passieren? Eigentlich ja nicht oder? es interessiert mich da ja nur welche Werte er für die einzelnen Intervalle vorheragt.
Jetzt fragt sich, welche Merkmale soll ich am besten mit reinnehmen? Bis dato gebe ich wie gesagt nur die Werte für das Anrufaufkommen mit, ohne jegliche Merkmale. Wochentag, Kalenderwoche, Feiertag ja/nein, und noch den Wert für den Intervall als Merkmal? Also zB 1 für 08:00-08:30, 2 für 08:30-09:00 usw... macht das so sinn?

Um nochmal zu erläutern wieso 72 Eingangsneuronen: Habe nur die Daten von 08-20 uhr genommen, und da halbstündlich, sind wir pro Tag bei 24 Neuronen, und da 3 Tage, 72 Eingangsneuronen. Was meinst du außerdem mit eigenem Input Layer? mehrere Input Layer, ist das überhupt möglich? Könnte mir das dann so vorstellen, dass ich dann ein neuen input Layer habe nur für die Features. Aber denke wenn ich die Feature nach jedem Tag als extra Neuronen einbaue, dann wäre das wohl auch ok. Beispielsweise füge noch 2 Merkmale hinzu, dann hat ein Tag keine 24 Neuronen mehr sondern 26, und wäre insgesamt bei 78 Eingangsneuronen.

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

also sagst du, ich kann beispielsweise dem Input noch 3 Neuronen hinzufügen mit einem boolean feature um zu spezifizieren ob Feiertag oder nicht? Also nach jedem Tag (24 Werte) noch ein Neuron welches den Tag als Feiertag identifiziert oder nicht.

ja, das wäre eine Möglichkeit.

Muss das selbe auch beim Output Layer passieren?

Nein

es interessiert mich da ja nur welche Werte er für die einzelnen Intervalle vorheragt.

Eben!

Jetzt fragt sich, welche Merkmale soll ich am besten mit reinnehmen? [...] Wochentag, Kalenderwoche, Feiertag ja/nein

Ja, Wochentag und Feiertag ist sinnvoll. Statt Kalenderwoche würde ich wohl eher Kalendermonat oder sogar nur Jahreszeit nehmen. Oder mit etwas Präprozessing vielleicht sogar eher sowas wie Urlaubzeit ja/nein und Vor-und Nachsaison ja/nein.

Je eher und je klarer es einen kausalen Zusammenhang zwischen den Features und dem Anrufaufkommen gibt, desto besser.

Weiter oben hatte ich ja schon geschrieben, welche Features ich als relevant ansehe.

Was meinst du außerdem mit eigenem Input Layer? mehrere Input Layer, ist das überhupt möglich?

Man kann die Neuronen in einem Netz ja theoretisch beliebig verschalten. Eine typische Möglichkeit ist, dass alle Neuronen im Input-Layer mit alle Neuronen im Hidden-Layer verbunden sind und alle Neuronen des Hidden-Layer mit allen Neuronen des Output-Layer. Aber es sind eben auch andere Strukturen denkbar und je nach Anwendungsfall auch sinnvoll.

Im Anhang findest du ein Bild, das etwas zeigt, was ich persönlich als zwei (zunächst getrennte) Input-Layer bezeichnen würde. Ich weiß aber weder, ob man das auch im Allgemeinen so nennt, noch ob das in deinem Fall irgendwelche Vorteile bringt. Ich wollte nur die Möglichkeit als solches erwähnen, falls sich deine Befürchtung bewahrheiten sollte, dass das Einfügen der Features zwischen den Neuronen für die (Halb-)Stunden die Zeitreihe durcheinander bringt.

Welche (abweichenden) Arten der Verschaltung die verwende Bibliothek erlaubt oder auch nicht erlaubt, steht auf einem anderen Blatt.

Beispielsweise füge noch 2 Merkmale hinzu, dann hat ein Tag keine 24 Neuronen mehr sondern 26,

Eventuell brauchst du pro Merkmal mehr als ein Neuron. Zum Beispiel würde ich für die Monate nicht ein einzelnes Neuron verwenden, an das je nach Monat die Werte 1/12, 2/12, 3/12, ... 12/12 angelegt werden, sondern z.B. 12 Neuronen bei denen nur an das Neuron des aktuellen Monats eine 1 angelegt wird und an alle anderen eine 0.

herbivore

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Hallo Herbivore,

wow vielen vielen Dank für die detaillierte Rückmeldung.

Der Ansatz mit den mehreren Input Layer gefällt mir, das würde ich gerne untersuchen. Nur weiß ich gerade nicht ob das Framework, welches ich gerade nutze solch etwas anbietet.

Ich werde mich diesbezüglich nochmal mit meinen (falls es welche gab) Ergebnissen melden.

Also, das einbringen der Features steht jetzt erstmal zunächst an. Gut, ich werde das wohl so machen, wie du vorgeschlagen hast. Für bspsweise Monat und Wochentag 12 und 7 Extra Neuronen die sich binär verhalten. Feiertag wäre ein extra Neuron, auch binär.

Leider seh ich das ganze noch ziemlich kritisch an bezüglich der Zeitreihe. Gerade ist es so, dass ich ja ein "Moving Window" von der Breite 72 habe, dort einfach nach jedem Tag extra Neuronen einzubauen würde doch vielleicht die Werte für die eigentliche Zeitreihe verunstalten? Muss ich dem MLP irgendwie sagen, hier schau jetzt kommen Features/Merkmale für dich damit du einen Zusammenhang in den Daten bildest. Oder muss ich mir dazu keine Gedanken machen? Und eine Frage ist auch, die Feature Neuronen zwischen den Tagen, oder alle am ende nach den 72 Eingangsneuronen ranhängen..? Also:

WERTE TAG1 - FEATURES TAG 1 - WERTE TAG2 - FEATURES TAG2 - WERTE TAG3 - FEATURES TAG3

oder

 WERTE TAG1 - WERTE TAG2 - WERTE TAG3 - FEATURES TAG1 -  FEATURES TAG2 -  FEATURES TAG3. 

-Mit WERTE sind die tatsächtlichen Zeitreihendaten gemeint, in meinem Fall das Callvolumen.

  • Wie siehts mit der Normaliserung der Merkmale aus? Ja/nein? Ich würde sagen nein, da ich das meiste ja sowieso mit 0/1 aufbauen werde.
    Die nächste Hürde ist dann erstmal, wie ich meine Datenaufbereitung diesbezüglich mache. Ich hoffe das klappt alles so wie ich es mir vorstelle.

Ich bin außerdem am überlegen ob eine Vorhersage auf den nächsten Tag zu machen überhaupt durch die letzten 3 Tage so sinnvoll ist, würdest du mir da konzeptionell zu was anderem raten?

Nun ist es so, dass ich von den Rekkurenten NN gehört habe, welche eine Rückkopplung in den Neuronen besitzen, besonders LSTM ist ja derzeit "das aktuellste überhaupt". Lohnt es sich deiner Meinung nach sich da einzuarbeiten, würde so eine Art Netz in meinem Fall zu besseren Ergebnissen führen?

und Sorry für die "vielen" blöden Fragen, aber ich merke ich kann viel von dir Lernen 😃

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

Gerade ist es so, dass ich ja ein "Moving Window" von der Breite 72 habe, dort einfach nach jedem Tag extra Neuronen einzubauen würde doch vielleicht die Werte für die eigentliche Zeitreihe verunstalten?

Vielleicht machst du dir da ein bisschen zu viele Sorgen. Normalerweise sind ja eh alle Input-Neuronen mit allen Neuronen des folgenden Layers verbunden. Insofern gibt es eh keine wirkliche Nachbarschaftsbeziehung zwischen den Input-Neuronen. Man könnte (bevor das Training beginnt) die Neuronen des Input-Layers beliebig umsortierten und das Verhältnis der Input-Neuronen untereinander wäre strukturell immer noch exakt das gleiche wie vorher. Anders sähe es aus, wenn das Input-Neuron Ij z.B. jeweils nur mit den Hiden-Neuron Hj-1, Hj und Hj+1 verbunden wäre. Dann würde es eine Rolle spielen, welche Input-Neuronen benachbart sind. Aber eben nicht bei vollständigen Verbindungen.

Muss ich dem MLP irgendwie sagen, hier schau jetzt kommen Features/Merkmale für dich damit du einen Zusammenhang in den Daten bildest.

Nein. Du musst dir nur Gedanken machen, welche Features du bereitstellst. Zum Beispiel noch das Wetter. Und eben alle relevanten Einflussfaktoren.

Und eine Frage ist auch, die Feature Neuronen zwischen den Tagen, oder alle am ende nach den 72 Eingangsneuronen ranhängen?

Ist bei vollständiger Verbindung vollkommen egal.

Wie siehts mit der Normalisierung der Merkmale aus?

Das hatten wir schon besprochen. Kommt auf das Netz (insbes. die Aktivierungsfunktion) an. Und bei deinem war mit Normalisierung besser.

Ich bin außerdem am überlegen ob eine Vorhersage auf den nächsten Tag zu machen überhaupt durch die letzten 3 Tage so sinnvoll ist, würdest du mir da konzeptionell zu was anderem raten?

Gute Frage! Irgendwie hab ich mich von dir vielleicht etwas auf die falsche Fährte locken lassen. 😃 Eigentlich brauchst das Anrufaufkommen über den Tag gar nicht als Input. Das ist ja dein gewünschter Output. Der Input sind die Features. Und eigentlich auch da nur die Features des Tages, für den vorhergesagt werden soll.

Du hast dein Trainingsset mit Daten aus der Vergangenheit. Du legst die Features an den Input und das tatsächliche damalige Anrufaufkommen an den Output und lässt das Netz jetzt per Backpropagation lernen, eben diesen Output zu liefern.

Dann brauchst du auch keine Zeitreihen, sondern fragst das Netz quasi nur, wie wird das Anrufaufkommen an einem Tag mit den Features xyz aussehen.

Wenn du doch mit mehreren Tagen auf einmal arbeiten willst, wäre meine Vermutung, dass du wegen des wohl vorhanden Wochenzyklus mindestens mit sieben Tagen arbeiten musst.

Nun ist es so, dass ich von den Rekkurenten NN gehört habe, welche eine Rückkopplung in den Neuronen besitzen, besonders LSTM ist ja derzeit "das aktuellste überhaupt". Lohnt es sich deiner Meinung nach sich da einzuarbeiten, würde so eine Art Netz in meinem Fall zu besseren Ergebnissen führen?

Ich weiß, dass es diese Art Netze gibt, habe damit aber viel weniger beschäftigt als mit "normalen" neuronalen Netzen. Und habe erst recht keine Erfahrung damit. Wenn du das ganze wirklich als Zeitreihe siehst, dann wäre so ein Netz vermutlich besser als ein normales Netz an das du die Daten mehrere Tage gleichzeitig anlegst. Aber das ist mehr eine Vermutung als eine belastbare Aussage.

herbivore

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Gute Frage! Irgendwie hab ich mich von dir vielleicht etwas auf die falsche Fährte locken lassen. 😃 Eigentlich brauchst das Anrufaufkommen über den Tag gar nicht als Input. Das ist ja dein gewünschter Output. Der Input sind die Features. Und eigentlich auch da nur die Features des Tages, für den vorhergesagt werden soll.

Du hast dein Trainingsset mit Daten aus der Vergangenheit. Du legst die Features an den Input und das tatsächliche damalige Anrufaufkommen an den Output und lässt das Netz jetzt per Backpropagation lernen, eben diesen Output zu liefern.

Dann brauchst du auch keine Zeitreihen, sondern fragst das Netz quasi nur, wie wird das Anrufaufkommen an einem Tag mit den Features xyz aussehen.

Wenn du doch mit mehreren Tagen auf einmal arbeiten willst, wäre meine Vermutung, dass du wegen des wohl vorhanden Wochenzyklus mindestens mit sieben Tagen arbeiten musst.

herbivore

Wow, das ist ein ziemlich guter Einwand. Eigentlich hast du ja recht, am besten wäre es doch, wenn ich wirklich nur anhand der Features die Vohersage mache, aber das würde doch alle meine Recherchen zu Zeitreihen und dem Sliding Window verfahren rausschmeissen, und ich müsste meine Dokumentation bezüglich des Projektes nochmal sehr bearbeiten. Wenn ich das so implementieren würde, zählt dies dann noch als eine "Zeitreihenvorhersage"?
Geht das dann nicht in die Richtung "klassifizieren"?

Die Dimensionen ändern sich jetzt auch, wenn du sagst am besten mit 7 Tagen arbeiten, dann wird mein Output irgendwie sowas wie...168 Neuronen (24*7), für mich ist diese Zahl erschreckend, aber denke in der Praxis wohl vollkommend normal (?)

Als Input Feature habe ich mir nun überlegt:
-Kalendermonat
-Wochentag
-Intervall
-Feiertag
Das wären dann um 7 Tage vorherzusagen, (127)+(77)+(247)+(17) = 308 Inputs.

Besser wäre es doch, irgendwie nur einen numerischen Wert für jeweils Kalendermonat, Wochentag und Intervall einzuführen, ohne das schalten von einem Eingang bei zB bestimmten Monat, das würde auch später bei der Benutzung leichter gehen.
In meinem ersten Post habe ich erwähnt wie ich mir das gedacht hatte.

Außerdem hab ich die input werte normalisiert,und aus jedem input zwei inputs gebildet. Der Grund dafür ist, dass es zwischen Tag 2 und Tag 3, aber auch zwischen Tag 7 und Tag 1 eine 1-Tages-Differenz gibt. Wenn ich es als 1,2,3,4,5,6,7 belasse, wird der Abstand zwischen Tag 1 und 7 asymetrisch. So bleibt die Nachbarschaft beibehalten. Das selbe bei den Kalenderwochen, und Intervallen.

Alle inputs sind [-1,1] normalisiert.

Klingt das für dich so umsetzbar? Ich bin etwas in zeitdruck, und habe leider keine Zeit mehr für große Experimente.

Vielen Dank nochmal für deine nützlichen Tipps!

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

Wenn ich das so implementieren würde, zählt dies dann noch als eine "Zeitreihenvorhersage"?

meine Vermutung war ja von Anfang an, dass es einem Netz, dass sich nur auf die Zeitreihe stützen darf, sehr schwer fallen würde, Regeln für z.B. Feiertage zu erkennen. Und den Einfluss des Wetters würde es wohl bei keiner noch so langen Zeitreihe je ermitteln können. Insofern hatte ich schon von Anfang dafür plädiert, von einer reinen Zeitreihenvorhersage abzuweichen. Wenn man nun am Ende ganz davon abkommt, würde es mich persönlich nicht stören.

Geht das dann nicht in die Richtung "klassifizieren"?

Wenn es nicht um eine Semesterarbeit mit einem vorgegeben oder zumindest feststehenden Titel gehen würde, würde nur zählen, dass die Voraussage möglichst gut ist, nicht auf welche Weise sie erfolgt und auch nicht, wie man diese Weise dann nennen würde. Wenn die Vorhersagegenauigkeit bei Einhaltung des Themas deutlich schlechte ausfällt würde ich das Thema wohl lieber verletzen als unter Einhaltung des Themas ein suboptimales Ergebnis abzuliefern.

Wie gesagt alles unter der Voraussetzung, dass ich damit Recht habe, dass sich aus der Zeitreihe des Anrufaufkommens alleine eh zu wenig für die Zukunft ableiten lässt.

herbivore

PS: Zu deinem Edit kann ich nicht viel sagen. Was am Ende funktioniert, wirst du wohl selbst herausfinden müssen. Ich könnte nur spekulieren und selbst das nur sehr vage, und das nützt am Ende nichts, weil da nur die Realität zählt. Welche Einflussfaktoren ich grundsätzlich sehe, habe ich ja schon geschrieben.

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Heyo herbivore,

kurze Rückmeldung:

mein Netz macht ziemlich gute Vorhersagen, und das sogar ohne irgendwelche Exogene Faktoren drin zu haben.

Als Merkmal habe ich, Kalendermonat, Wochentag, Intervall, und Feiertag. Ich bin echt erstaunt.
Er kann einen Samstag/Sonntag/Feiertag gut vorhersagen (Da ist das Anruf aufkommen natürlich viel geringer als an den anderen regulären Wochentagen).

Ich bin am überlegen ob ich die 48 Intervalle durch "Tagesparts" ersetze, sowas wie: über nacht, früh morgens, prime time, abends. Aber ob das so eine gute Idee ist.

Außerdem hat mir mal jemand geraten, zyklische Elemente auf einen Einheitskreis zu codieren. Beispielweise wird der Wochentag als zwei Parameter anstatt von einem mitgegeben:
cos(day_of_week2pi/7) und sin(day_of_week2pi/7).
Das gleiche habe ich für Monat und intervall gemacht.
Leider ist mir nicht ganz klar wieso ich das eigentlich mache. Es wurde mir empfohlen, und ich hab es umgesetzt. Die Frage die ich mir stelle ist, wieso hat es Vorteile, beispielsweise den Wochentag als zwei Parameter zu übergeben, anstatt es als 1,2,3,4,5,6,7 zu codieren?

49.485 Beiträge seit 2005
vor 7 Jahren

Hallo Setso,

Ich bin am überlegen ob ich die 48 Intervalle durch "Tagesparts" ersetze, sowas wie: über nacht, früh morgens, prime time, abends. Aber ob das so eine gute Idee ist.

wenn es mit den bisherigen Intervallen gut klappt, würde ich es lassen. Wenn der Leiter seine Schichten planen muss, kann er die Einzeldaten leicht selbst zu größeren Intervallen zusammenfassen (z.B. in einer Tabellenkalkulation) und kommt dabei bei Bedarf an zusätzliche Informationen wie Min, Max, Mittelwert und Median der größeren Intervalle. Außerdem kann er besser sehen, wo Schichtwechsel sinnvoll wären, als wenn du die durch die Wahl deiner größeren Intervalle womöglich zementierst.

Die Frage die ich mir stelle ist, wieso hat es Vorteile, beispielsweise den Wochentag als zwei Parameter zu übergeben, anstatt es als 1,2,3,4,5,6,7 zu codieren?

Also der Vorteil liegt aus meiner Sicht vor allem gegenüber der Übergabe an nur ein Neuron. Denn der größte und der kleinste Wert liegen bei zyklischen Werten trotz ihrer großen arithmetischen Differenz inhaltlich oft ganz nah beieinander. Deshalb ist es im allgemeinen nicht sinnvoll, einen zyklischen Wert an nur ein Neuron zu übergeben.

Der Vorteil gegenüber (im Beispiel) sieben Werten liegt m.E. nur darin, das Netz nicht möglicherweise zu groß werden zu lassen, vor allem wenn man viele solche Werte übergeben muss. Man spart einfach Neuronen.

Ob und wie sehr die Ersparnis die Qualität des (trainierten) Netzes verschlechterte (oder in anderen Fällen vielleicht sogar verbessert) hängt wohl von Einzelfall und der Art und dem Einflusses der zyklischen Daten ab. Vor allen davon, ob der Zyklus der Eingabewerte sich auch in einem Zyklus der Ausgabewerte bemerkbar macht oder nicht.

Wenn nicht, also wenn z.B. der Montag stark einsetzen würde und das Anrufaufkommen über die Woche stetig sinken würde, bis es Sonntag hypothetisch fast nicht mehr vorhanden wäre, es also einen Sprung da gäbe, wo sich der Zyklus schließt, wäre sogar eine Codierung als ein einzelner (ggf. negierter) Wert wohl am günstigsten. Mit anderen Worten, es kommt immer darauf an. 😃

Grundsätzlich sollte man seine Codierung so wählen, dass die Eingaben da ähnliche Werte annehmen, wo ähnliche Ausgaben gewünscht sind. Bzw. andersherum formuliert Sprünge der Eingabewerte vermieden werden, wo ähnliche Ausgaben gewünscht sind.

Und nochmal andersherum sollte die Codierung da für möglichst unterschiedliche Eingabewerte sorgen, wo unterschiedliche Ausgabewerte gewünscht sind.

Klappt das in die eine oder andere Richtung nicht, oder kennt man den Zusammengang zwischen Ein- und Ausgabe nicht (ausreichend), dann codiert man die Werte besser als binäre Neuronen für die einzelnen vorkommenden Werte. Dann kann das Netz nach meinem Verständnis (ggf. zum Preis eines erhöhten Aufwands) jeden denkbaren Zusammenhang zwischen den Eingabe- und Ausgabewerten erkennen und realisieren.

herbivore

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Hallo,

es gibt noch ein paar Unklarheiten bzw Fragen...

1)
Ist es möglich, ein NN darauf zu trainieren Feiertage automatisch zu erkennen ohne dass ich dies als Merkmal mitgebe? Feste Feiertage kann ich mir vorstellen, dass er die auch ohne extra Merkmal nun schon drauf haben würde. Wie sieht es aus mit Beweglichen Feiertagen?

Eine Idee wäre es, zwei NN zu trainieren. Das erste Netz nimmt nur jeweils ein Datum und entscheidet ob Feiertag oder nicht. Anhand der Erkentniss wird dies dann automatisiert ins nächste NN gegeben.

Jedoch wäre rein theoretisch ja ein NN für die Feiertagserkennung überflüssig oder? Gibt es für jeden Beweglichen Feiertag eine Berechnungsfunktion?

2)
Ich möchte nun Exogene Faktoren einbauen, sowas wie Wetter und Ereignisse.
Wie löse ich dies am besten?
Eine Idee wie ich beispielsweise das Wetter miteinbeziehe?

Beste Grüße,
Setso

P
1.090 Beiträge seit 2011
vor 7 Jahren

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren


>

Oh Super! Danke dir! dann hat sich dieser Punkt schon erledigt 😃

D
985 Beiträge seit 2014
vor 7 Jahren

Trotz allem würde ich eine Liste vorsehen, wo man besondere Tage vermerken kann.

Geschlossen wegen Reichtum, Wasserschaden, etc. Muss ja nicht unbedingt immer ein Feiertag sein.
Interessante Tage sind auch die Brückentage (Montag, wenn Dienstag ein Feiertag; Freitag, wenn Donnerstag ein Feiertag).

Aber auch wenn das Wochende durch einen oder zwei Feiertage verlängert ist, dann ist der letzte Werktag vor diesem Ereignis auch besonders (für den Lebensmittel-Einzelhandel, denn die Leute haben Angst, dass die nie wieder aufmachen)

S
Setso Themenstarter:in
9 Beiträge seit 2016
vor 7 Jahren

Brückentage sind natürlich interessant, jedoch habe ich eben mal geschaut wie mein NN auf Brückentage reagiert. Ich habe keine unnormalen Abschweifungen sehen können. Es scheint so, als hätte er Zusammenhänge nach und vor einem Feiertag erkannt.