Hochwasser-Vorhersage mit NN

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
Post Reply
Anatol
Posts: 1
Joined: Mon 2. Feb 2009, 16:36

Hochwasser-Vorhersage mit NN

Post by Anatol »

Hallo zusammen

Ich bin absoluter Neuling was NN angeht, und wollte mich mal schlau machen, wie sich für eine Fachvertiefungsarbeit im Studium neuronale Netze zur Hochwasservorhersage einsetzen liessen - und wie man das mit MemBrain allenfalls umsetzen könnte.

Folgende Ausgangslage:
- Es sind Messungen des Niederschlags, der Temperatur (wird jeweils zusammen gemessen, an drei Stationen) in stündlicher Auflösung vorhanden
- Es sind Messungen des Abflusses in jeweils stündlicher Auflösung vorhanden:
  • Station 1 --> für diese Station sollen Vorhersagen gemacht werden
    Station 2 --> liegt oberhalb von Station 1
    Station 3 --> liegt oberhalb von Station 1, jedoch anderer Flussarm als Station 2
Hier ein Beispiel der Daten, wie sie für die Abflussstationen vorliegen:

Code: Select all

Station;DatumStundeVon-DatumStundeBis;Abfluss
2603;1990.01.01 01:00-1990.01.01 02:00;   1.078
2603;1990.01.01 02:00-1990.01.01 03:00;   1.076
2603;1990.01.01 03:00-1990.01.01 04:00;   1.075
2603;1990.01.01 04:00-1990.01.01 05:00;   1.074
2603;1990.01.01 05:00-1990.01.01 06:00;   1.073
2603;1990.01.01 06:00-1990.01.01 07:00;   1.071
2603;1990.01.01 07:00-1990.01.01 08:00;   1.070
Hier ein Beispiel der Daten, wie sie für den Niederschlag vorliegen (Temperatur analog):

Code: Select all

   
   Station Jahr Monat Tag Stunde Minute Niederschlag
   78 2001  4  6 20  0   0.3 
   78 2001  4  6 21  0   0.7 
   78 2001  4  6 22  0   1.4 
   78 2001  4  6 23  0   0.3 
   78 2001  4  7  0  0   0.1 
   78 2001  4  7  1  0   1.9 
   78 2001  4  7  2  0   1.6 
   78 2001  4  7  3  0   7.5 
   78 2001  4  7  4  0   3.7 
   78 2001  4  7  5  0   0.9 
   78 2001  4  7  6  0   1.1 
   78 2001  4  7  7  0   0.0 
   78 2001  4  7  8  0   0.0 
   78 2001  4  7  9  0   0.0  
Meine bisherigen Überlegungen:
  • - Alles Wasser, was von Abfluss-Station 2 und 3 kommt, passiert auch Station 1 mit einer geringen zeitlichen Verzögerung (1-3 h). Ein erster Ansatz wäre somit, zu kucken, was an Station 2 und 3 aktuell gemessen wird und daraus auf den Abfluss an Station 1 zum Zeitpunkt t+1h, t+2h, t+3h, t+n (n > 4h ist dann wohl eher nicht mehr sinnvoll, weil alles Wasser von den oberhalb liegenden Stationen bereits die Station 1 passiert hat) zu schliessen

    - Bereits für den Zeitschritt t+2 wird die Information der oberhalb liegenden Abflussmessstationen wohl nicht mehr ausreichend sein, hier müssen Informationen über den gefallenen Niederschlag her (ist wie oben erwähnt, an drei meteorologischen Stationen vorhanden). Wenn der Niederschlag als Schnee fällt, wird er nicht direkt abflusswirksam, darum sind auch Temperaturdaten notwendig. Durch den Einbezug von Niederschlag

    - Ich habe also 6 (3x Niederschlag, 3x Temperatur) Zeitreihen, die ich als Input-Neuronen definieren muss. Abflussstationen 2 und 3 nehmen Informationen der 6 Inputneuronen auf und geben seinerseits Infos an die Abflussstation 1 weiter. Die Abflussstation 1 ist das Output-Neuron und nimmt Infos von allen Neuronen auf. Mit Membrain hab ich das mal bildlich dargestellt (Bildanhang 1)
Und jetzt kommen ganz viele Frage eines Anfängers....
  • - Macht die Definition der Units/Neuronen so Sinn?
    - Unsicher bin ich mir mit den Aktivitätsfunktionen: ich würde in einem ersten Wurf mal alles auf "Logistic" lassen - Einwände?
    - Für das Trainieren des Neuronalen Netzes muss ich die Daten (Beispiele siehe oben, ASCII-Textfiles) in MemBrain bringen. Wie gehe ich da genau vor?
    - Zeitreihen sind ja etwas besonderes für neuronale Netze. Im vorliegenden Fall hängt der Output (Abflussstation 1) ja vom Input (Abflussstationen 2+3 sowie Niederschläge und Temperatur) ab, der zu unterschiedlichen Zeitschritten vor dem aktuellen Zeitschritt ins System eingeht. Zudem muss beim Niederschlag noch berücksichtigt werden, dass dieser additiv ist (hypothetisches Beispiel: Summe des Niederschlages an Station x von Zeitschritt t-16h bis t-3h). Wie muss das berücksichtigt werden?
    - Schlussendlich möchte ich kucken, bis zu welchem Vorhersagezeitraum aufgrund der vorliegenden Messdaten halbwegs brauchbare Vorhersagen gemacht werden können. Ich brauche also Vorhersagen für Abflussstation 1 zum Zeitpunkt t+1h, t+2h, t+3h bis sagen wir mal t+10h. Wie gehe ich da am besten vor?
Schon jetzt besten Dank für Euren Input und Denkhilfen!

Gruss, Anatol
Attachments
bild1.png
(11.03 KiB) Downloaded 101 times
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Hochwasser-Vorhersage mit NN

Post by Admin »

Hallo Anatol,

das klingt interessant und ist prinzipiell mit NN und im speziellen auch mit MemBrain bestimmt umzusetzen. Schön auch, dass Du die Daten und Zusammenhänge so ausführlich erläutert hast, das macht es einfacher, Tipps zu geben.
- Ich habe also 6 (3x Niederschlag, 3x Temperatur) Zeitreihen, die ich als Input-Neuronen definieren muss. Abflussstationen 2 und 3 nehmen Informationen der 6 Inputneuronen auf und geben seinerseits Infos an die Abflussstation 1 weiter.
Die Stationen 2 und 3 sind ebenfalls Inputs, sie liefern ja Inputdaten, die zur Bestimmung des Outputs herangezogen werden sollen.
Du solltest also alle Eingaben als Input-Neuronen implementieren. Soweit ich das verstehe, sind das dann:
- N1(t), N2(t), N3(t)
- T1(t), T2(t), T3(t)
- A1(t), A2(t), A3(t)

also 9 input-Neuronen.

Als Outputs könntest Du z.B. 4 Neuronen nehmen, nämlich:
A1(t + 1), A1(t + 2), A1(t + 3), A1(t + 4).

Eine kleine Hidden-Schicht von vielleicht Anfangs 3 - 4 Neuronen kannst Du auch gleich mit einfügen.
Unsicher bin ich mir mit den Aktivitätsfunktionen: ich würde in einem ersten Wurf mal alles auf "Logistic" lassen - Einwände?
Lass erst mal alles auf 'Logistic', das sollte für einen ersten Wurf passen. Später kann man noch versuchen, mit TanHyp zu spielen, bringt aber nur manchmal Vorteile.
Für das Trainieren des Neuronalen Netzes muss ich die Daten (Beispiele siehe oben, ASCII-Textfiles) in MemBrain bringen. Wie gehe ich da genau vor?
MemBrain unterstützt den Im- und Export von CSV-Dateien im Lesson-Editor. Es verwendet dabei als Listen- und Dezimaltrenner immer die Einstellungen der Windowsinstallation, die sprachabhängig sind. Allerdings verwenden Tabellenkalkulationsprogramme wie z.B. Excel auch diese Einstellungen, so dass immer Kompatibilität sichergestellt ist, solange man mit den csv-Files nur zwischen Anwendungen unter ein und derselben Windows-Sprachinstallation jongliert. Du gehst dabei am besten so vor:
Importierte die Daten in z.B. Excel und bereite sie dort so vor, dass sie zum Training passen (siehe Informationen zu den nächsten Fragen). Dann speicherst Du das Tabellenblatt, das die vorbereiteten Daten enthält, als csv ab. Dann kannst Du es in MemBrain im Lesson-Editor importieren. Denke dabei daran, dass die Summe der Anzahlen der Ein- und Ausgänge, die im Lesson-Editor eingestellt sind, mit der Gesamt-Anzahl der Spalten im csv-File übereinstimmen muss, sonst kann MemBrain den Import nicht durchführen, da es nicht wissen kann, wie die Aufteilung zwischen Inputs und Outputs beim csv sein soll. Input-Spalten stehen immer links, alle Output-Spalten müssen sich rechts anschließen.
Allein deshalb ist es übrigens sinnvoll, nach dem Import die Daten im nativen Lesson-Format (+.mbl) abzuspeichern, da dieses bereits Definitionen über Anzahl In/Outputs usw. enthält. Auch wenn Du Dateien mit anderen MemBrain Usern oder mit mir austauschst, dann am besten immer im mbl Format und nicht als csv.
Zeitreihen sind ja etwas besonderes für neuronale Netze.
Das stimmt, es gibt dazu prinzipiell drei Ansätze:
1.) Rekursives Netz
2.) Feed-Forward-Netz mit parallelen Eingangsdaten von unterschiedlichen Zeitpunkten
3.) Feed-Forward-Netz mit ausschließlich Eingangsdaten vom aktuellen Zeitpunkt, in Verbindung mit speziellen Netz-Elementen, die vergangene Eingangsdaten zwischenspeichern.

Mit MemBrain sind alle drei Ansätze möglich. Rekursive Netze neigen allerdings prinzipiell zur Instabilität und sind schwer zu handeln, davon würde ich Dir eher abraten. Bleiben 2.) und 3.), welche beide gut funktionieren. 2.) ist am einfachsten zu handeln, benötigt aber mehr Aufbereitung der Daten. Auch nachher in der Anwendung des trainierten Netzes musst Du immer parallel Daten von unterschiedlichen Zeitpunkten einspeisen. Außerdem erhält das Netz dadurch viele Eingangsneuronen. Alles nicht so schön. Zu guter letzt beschränkt man sich dabei automatisch darauf, die letzten wenigen Zeitschritte als Vergangenheit zu verwenden. Das mag in Deinem Fall sehr gut ausreichen. Wenn man mit einem Ansatz wie 3.) arbeitet, kann man allerdings auch Netzelemente einfügen, die die Vergangenheit langsam abklingend im Netz repräsentieren und somit weiter in die Vergangenheit zurückreichen können.
Alles in Allem würde ich Dir dazu raten, mit Ansatz 3.) loszulegen. Dazu solltest Du unbedingt zuerst einmal das Beispiel 'Mackey-Glass Time Series Prediction' durchspielen, das es auf der Homepage zum Download gibt (als Teil des Zip-Files 'Netzbeispiele', eine kleine Hilfe mit einem entsprechenden Tutorial zu diesem Beispiel ist auch enthalten). Das sollte erst einmal vieles klären, was ich hier sonst mühsam wiederholen müsste.
Zudem muss beim Niederschlag noch berücksichtigt werden, dass dieser additiv ist (hypothetisches Beispiel: Summe des Niederschlages an Station x von Zeitschritt t-16h bis t-3h)
Wie der Niederschlag in Dein Netz eingeht, solltest Du getrost dem Netz bzw. dem Trainingsalgorithmus selbst überlassen. Du möchtest ja gerade keine Bewusste Rechnung einbringen, das Netz soll die Regeln hinter den Daten ja gerade selbst erlernen ;)
Schlussendlich möchte ich kucken, bis zu welchem Vorhersagezeitraum aufgrund der vorliegenden Messdaten halbwegs brauchbare Vorhersagen gemacht werden können. Ich brauche also Vorhersagen für Abflussstation 1 zum Zeitpunkt t+1h, t+2h, t+3h bis sagen wir mal t+10h. Wie gehe ich da am besten vor?
Wenn Du bis t+10h gehen willst, dann solltest Du tatsächlich 10 Ausgangsneuronen implementieren. Jedes Trainingsmuster besteht dann aus den Eingangsdaten des Zeitpunkts t (siehe 9 Eingangsneuronen oben) und den zukünftigen 10 Abflussdaten der Station 1 als Ausgangsdaten. Du musst also Deine Trainings- und auch Deine Validierungsdaten so vorbereiten, dass Du darin die Gegenwart mit allen erwünschten Werten aus der Zukunft zusammenbringst und diese Pattern dem Netz in der richtigen Reihenfolge(!) präsentierst. Die richtige Reihenfolge ist extrem wichtig, da Du ja ein zeitabhängiges Netz haben wirst, das Reihenfolgebeziehungen zwischen den Pattern erlernen soll. Deshalb ist eine absolut notwendige Einstellung des verwendeten Teachers in MemBrain die Option 'Lesson Pattern Selection' = 'ORDERED'! Die aktuelle MemBrain-Version sollte Dich aber auch automatisch warnen, wenn Du versuchst, ein zeitabhängiges Netz mit einem Teacher zu trainieren, der diese Einstellung nicht hat.

So, nun erst mal viel Erfolg mit dem Beispiel-Tutorial 'Mackey-Glass' und Deinen ersten Schritten in MemBrain. Melde Dich wieder, wenn die nächsten Fragen/Probleme auftauchen oder wenn etwas nicht verständlich war!

Ach ja, eines noch: Hast Du genügend verlässliche Daten? Also z.B. einige Hundert oder besser einige Tausend Zeitpunkte? Denke auch daran, die Lesson für das Training nicht mit allen zur Verfügung stehenden Daten zu bestücken. Du solltest 10% - 25% der Daten übrig lassen für die Validierung Deines Netzes. Nur an der Reaktion des Netzes auf untrainierte Daten kannst Du letztlich seine Güte bzw. Praxistauglichkeit bestimmen!

Viele Grüße
Thomas Jetter
Post Reply