Vorhersage von Zeitreihendaten mit PyBrain Neural Networks

8

Problem

Ich versuche, 5 Jahre aufeinanderfolgende historische Daten zu verwenden, um Werte für das folgende Jahr zu prognostizieren.

Datenstruktur

Meine Eingabedaten input_04_08 sehen so aus: Die erste Spalte ist der Tag des Jahres (1 bis 365) und die zweite Spalte ist die aufgezeichnete Eingabe.

%Vor%

Meine Ausgabedaten output_04_08 sieht so aus, eine einzelne Spalte mit der aufgezeichneten Ausgabe an diesem Tag des Jahres.

%Vor%

Ich normalisiere dann die Werte zwischen 0 und 1, so dass das erste Beispiel für das Netzwerk aussehen würde wie

%Vor%

Vorgehensweise (n)

Feed Forward-Netzwerk

Ich habe den folgenden Code in PyBrain implementiert

%Vor%

und das gab mir das folgende Ergebnis mit final error von 0.00153840123381

Zugegeben, das sieht gut aus. Nachdem ich jedoch mehr über neuronale LSTM (Long Short-Term Memory) -Netzwerke und ihre Anwendbarkeit auf Zeitreihendaten gelesen habe, versuche ich, eine zu bauen.

LSTM-Netzwerk

Unten ist mein Code

%Vor%

Dies führt zu einem endgültigen Fehler von 0,000939719502501 , aber dieses Mal, wenn ich die Testdaten einspeise, sieht das Ausgabe-Diagramm schrecklich aus.

Mögliche Probleme

Ich habe hier so ziemlich alle PyBrain-Fragen gesehen, diese stachen hervor, aber haben mir nicht geholfen, die Dinge herauszufinden

Ich habe ein paar Blogposts gelesen, diese halfen mir mein Verständnis ein wenig, aber offensichtlich nicht genug

Natürlich habe ich auch die PyBrain-Dokumente durchgelesen, konnte aber nicht viel für die sequentielle Dataset-Leiste finden hier .

Irgendwelche Ideen / Tipps / Anweisungen wären willkommen.

    
Philip O'Brien 04.12.2015, 12:11
quelle

1 Antwort

7

Ich denke, was hier passiert ist, dass Sie versucht haben, Hyperparameterwerte nach einer Faustregel zuzuordnen, die für den ersten Fall funktioniert, aber nicht für den zweiten.

1) Die Fehlerschätzung, die Sie betrachten, ist eine optimistische Vorhersagefehlerschätzung des Trainingssatzes. Der tatsächliche Vorhersagefehler ist hoch, aber weil Sie Ihr Modell nicht mit ungesehenen Daten getestet haben, gibt es keine Möglichkeit, es zu kennen. Elemente des statistischen Lernens gibt eine schöne Beschreibung dieses Phänomens. Ich kann dieses Buch wärmstens empfehlen. Sie können es kostenlos online bekommen.

2) Um einen Schätzer mit einem niedrigen Vorhersagefehler zu erhalten, müssen Sie eine Hyperparameter-Optimierung durchführen. Z.B. Die Anzahl der versteckten Knoten, die Lernrate und der Impuls sollten variiert und an den ungesehenen Daten getestet werden, um zu wissen, welche Kombination zu dem niedrigsten Vorhersagefehler führt. scikit-learn hat GridSearchCV und RandomizedSearchCV , um genau das zu tun, aber sie arbeiten nur an Sklearns Schätzern. Sie können jedoch Ihren eigenen Schätzer rollen, der in der Dokumentation beschrieben wird . Ich persönlich denke, dass Modellauswahl und Modellbewertung zwei verschiedene Aufgaben sind. Für den ersten können Sie einfach eine einzelne GridSearchCV oder RandomizedSearchCV ausführen und eine Reihe von besten Hyperparametern für Ihre Aufgabe erhalten. Für die Modellbewertung müssen Sie eine komplexere Analyse durchführen, z. B. verschachtelte Kreuzvalidierung oder sogar wiederholte verschachtelte Kreuzvalidierung, wenn Sie eine noch genauere Schätzung wünschen.

3) Ich weiß nicht viel über LSTM-Netzwerke, aber ich sehe, dass Sie im ersten Beispiel 25 versteckte Knoten zugewiesen haben, aber für LSTM nur 5 bereitstellen. Vielleicht ist es nicht genug, um das Muster zu lernen. Sie können auch den Ausgabe-Bias wie in im Beispiel ablegen .

P.S. Ich denke, diese Frage gehört eigentlich zu Ссылка , wo Sie wahrscheinlich eine detailliertere Antwort auf Ihr Problem bekommen.

BEARBEITEN : Ich habe gerade bemerkt, dass du das Modell für 10 Millionen Epochen lehrst! Ich denke, es ist viel und wahrscheinlich ein Teil des Überanpassungsproblems. Ich denke, es ist eine gute Idee, frühes Stoppen zu implementieren, d. H. Das Training zu beenden, wenn ein vordefinierter Fehler erreicht wird.

    
abudis 04.12.2015, 12:36
quelle