Wahrscheinlichkeiten für Ereignisse berechnen

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
Gerrit2002
Posts: 2
Joined: Wed 14. Sep 2011, 09:50

Wahrscheinlichkeiten für Ereignisse berechnen

Post by Gerrit2002 » Wed 14. Sep 2011, 14:43

Hallo zusammen,

vorne weg muss ich sagen, dass ich kein Mathematiker, Programmierer oder ähnliches bin und von neuronalen Netzen auch erst seit ein paar Tagen einen Ansatz "verstehe". Das Programm Membrain habe ich mir runtergeladen und so weit auch verstanden von der Bedienung. Kann ein Netz generieren, Input, Output, etc. festlegen und über CSV-Dateien füttern und dann mit einem Training von Daten aus der Vergangenheit das Netz trainieren. Habe auch schon eine Kontrolle über X% der Daten gefahren (Splitting der Database), etc. um den Net Error zu "bestätigen".

Bzgl. des Netzaufbaus habe ich natürlich noch kaum Ahnung (bisher Input, eine Linie hidden mit verschieden vielen Neuronen und dann direkt Output "designt") und auch mit Delay-Neuronen usw. kaum gearbeitet aber das würde ich jetzt nach und nach versuchen mir anzueignen.


Mein Problem / Aufgabe ist folgende, die ich gerne mit einem neuronalen Netz abbilden würde (als ersten Test um das Prinzip zu verstehen):

Ich habe X Input-Faktoren, die aber diskret sind, sprich bei mir Mitspieler einer Hobby-Mannschaft (hoffe diskret ist der richtige Begriff! Also unabhängig von einander und nicht "fortlaufend" wie z.B. ein Temperaturskala). Die Daten habe ich mit Nummern versehen, also eine Liste Spieler 1-100 z.B.

Diese werden in verschiedenen Kombinationen verwendet (wobei nicht jeder Mitspieler immer spielt) und das Ergebnis ist dann im Output ein Ergebnis der Mannschaft (entweder z.B 6:2 oder nur Sieg / Unentschieden / Niederlage wobei bei 6:2 zwei Outputs wären (Punkte eigene und fremde Mannschaft)). Momentan habe ich die Aufstellung nur für die eigene Mannschaft würde es später aber gerne um den Gegner erweitern.

Nun folgende Fragen:

1. Gibt es eine Einstellung, dass Membrain weiß, dass die Daten diskret sind und nicht fortlaufend. Also dass Spieler 1 und 2 genau so unterschiedlich sind wie 1 und 100 (wo ja bei Skalen nebeneinander liegende Zahlen einen Bezug haben und somit 1 und 2 "näher" sind als 1 und 100)? Oder ist das automatisch richtig wenn ich die Input-Neuronen mit den Spielernr. "füttere"? Kann ich sonst auch Text als Input nehmen damit Membrain das weiß statt Nummern? Oder ist die Frage einfach nur "naiv"? :mrgreen:
2. Gibt es eine Möglichkeit, dass eine Spielernr. einen Einfluss auf das Ergebnis hat unabhängig von der Frage in welchem Input-Neuron er auftaucht? Nehmen wir an es spielen immer 2 Spieler (zur Vereinfachung). Dann hätte ich 2 Input-Neuronen (nennen wir sie N1 und N2). In einer Woche spielen Spieler 1 und 2 (N1=1 und N2=2), danach die Woche 1 und 3 (N1=1 und N2=3). Wenn jetzt in der nächsten Woche 2 und 3 spielen würde N1=2 und N2=3 sein. Da aber Spieler 2 vorher in Neuron 2 aufgetreten ist kann das Programm ja keinen Zusammenhang zur jetzigen Aufstellung wo Spieler 2 in Neuron 1 auftritt herstellen, oder? Für 2 Spieler ist das noch zu umgehen aber bei einer Mannschaft von 4 oder mehr eher nicht denke ich.

Ziel soll es später sein nicht nur die eigene, sondern auch fremde Mannschaften abzubilden und somit dann im Vergleich die beste Aufstellung zu finden, die die größten "Siegchancen" hat gegen den Gegner.

Ist eigentlich eine Spielerei aber als Einstieg für mich ganz interessant und gut um was über neuronale Netze zu lernen, die mich echt begeistern (wie auch das einfach zu bedienende Programm Membrain).

Letzten Fragen: Wie interpretiert man den MSOE? Klar ist, je niedriger desto besser aber gibt es da Werte, die man erreichen sollte damit eine Prognose sinnvoll ist? Und gibt es eine Quelle wo man für bestimmte Probleme gute Ansätze findet wie man Netze aufbaut oder ist das Versuch und Irrtum über den Error? Gibt es da Standard-Konstruktionen die sinnvoll sind?


Vielen Dank für jedwede Hilfe an einen Noob wie mich :mrgreen: Vielleicht passt meine Testaufgabe auch gar nicht zum Programm oder zu neuronalen Netzen oder ich stell mir das alles viel zu einfach vor... :?

User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Wahrscheinlichkeiten für Ereignisse berechnen

Post by Admin » Thu 15. Sep 2011, 19:35

Hallo,

vorab: Bitte nicht verwirren lassen, ich habe das Thema in den Bereich 'Hilfe zu konkreten Projekten' verschoben, es schint mir da besser hinzupassen.
Gerrit2002 wrote:Nun folgende Fragen:

1. Gibt es eine Einstellung, dass Membrain weiß, dass die Daten diskret sind und nicht fortlaufend. Also dass Spieler 1 und 2 genau so unterschiedlich sind wie 1 und 100 (wo ja bei Skalen nebeneinander liegende Zahlen einen Bezug haben und somit 1 und 2 "näher" sind als 1 und 100)? Oder ist das automatisch richtig wenn ich die Input-Neuronen mit den Spielernr. "füttere"? Kann ich sonst auch Text als Input nehmen damit Membrain das weiß statt Nummern? Oder ist die Frage einfach nur "naiv"? :mrgreen:
2. Gibt es eine Möglichkeit, dass eine Spielernr. einen Einfluss auf das Ergebnis hat unabhängig von der Frage in welchem Input-Neuron er auftaucht? Nehmen wir an es spielen immer 2 Spieler (zur Vereinfachung). Dann hätte ich 2 Input-Neuronen (nennen wir sie N1 und N2). In einer Woche spielen Spieler 1 und 2 (N1=1 und N2=2), danach die Woche 1 und 3 (N1=1 und N2=3). Wenn jetzt in der nächsten Woche 2 und 3 spielen würde N1=2 und N2=3 sein. Da aber Spieler 2 vorher in Neuron 2 aufgetreten ist kann das Programm ja keinen Zusammenhang zur jetzigen Aufstellung wo Spieler 2 in Neuron 1 auftritt herstellen, oder? Für 2 Spieler ist das noch zu umgehen aber bei einer Mannschaft von 4 oder mehr eher nicht denke ich.

Mein erster Vorschlag wäre Folgender:
- Für jeden Spieler ein eigenes Input-Neuron anlegen. Dabei steht ein bestimmtes Input-Neuron immer für den selben Spieler
- Die Input-Neuronen mit der Aktivierungsfunktion 'IDENTICAL' versehen. Damit erlauben sie (ohne zusätzliche spezielle Normalisierungseinstellungen) einen Wertebereich von -1 bis +1
- Wenn ein Spieler nicht am Spiel teilnimmt, den Wert 0 für das entsprechende Input-Neuron vergeben.
- Wenn ein Spieler in Mannschaft 1 spielt +1 vergeben
- Wenn der Spieler in Mannschaft 2 spielt -1 vergeben
- Zwei Output-Neuronen (LOGISTIC) für die Punktzahlen, eines für jede Mannschaft (= Spielstand)
- Die Normalisierung für die Output-Neuronen so wählen, dass ein Worst-Case Maximalpunktestand 'Platz' darin findet, also z.B. 0..10?
Gerrit2002 wrote:Letzten Fragen: Wie interpretiert man den MSOE? Klar ist, je niedriger desto besser aber gibt es da Werte, die man erreichen sollte damit eine Prognose sinnvoll ist?
Am besten gar nicht. Das ist auch nicht relevant. Der Fehler ist nur dem Verlauf nach von Interesse: Wenn man eine passable Netzarchitektur und Datencodierung gefunden hat, sollte man unbedingt so trainieren, dass man während des Trainings bereits den Fehler bzgl. der Validierungsdaten visualisiert. Wenn dieser sein Minimum erreicht hat, sollte man das Training abbrechen (irgendwann steigt der Fehler bzgl. der Validierung nämlich oft wieder an, die Generalisierung lässt also nach, das Netz wird übertrainiert).
Ob das Netz gut ist oder nicht, macht sich einzig und allein an der zielgerichteten Bewertung der Validierungsergebnisse (also der vorhergesagten Spielstände) fest. Die einzige Frage ist hier: Wie gut erfüllt mein Netz meinen Prognosezweck. Eine generische Aussage kann es hier per Definition nicht geben, da sie völlig vom Anwendungszweck und den eigenen Akzeptanzkriterien abhängt.
Gerrit2002 wrote:Und gibt es eine Quelle wo man für bestimmte Probleme gute Ansätze findet wie man Netze aufbaut oder ist das Versuch und Irrtum über den Error? Gibt es da Standard-Konstruktionen die sinnvoll sind?
Ich kenne keine guten Quellen. Aber auch hier wieder die Aussage: Immer vom Anwendungsfall abhängig. Allerdings auch die klare Aussage: Wenn die Daten gut sind und Regeln dahinterstecken, dann ist die Netzarchitektur relativ irrelevant, man kann gar nicht so viel falsch machen bzw. optimieren wie man vielleicht vermutet.
Das gilt zumindest bei einem zeitinvarianten Netz wie in diesem Fall (Decay-Neuronen und Delay-Links können hier getrost entfallen).

Ich empfehle eine bis zwei Hiddenschichten, beginnen würde ich bei 100 Spieler-Neuronen mit 5-10 Neuronen in der ersten und drei Neuronen in der zweiten Hidden-Schicht (alles LOGISTIC). Bei Bedarf Anzahl sukzessive erhöhen.

Viele Grüße und viel Erfolg
Thomas Jetter

Gerrit2002
Posts: 2
Joined: Wed 14. Sep 2011, 09:50

Re: Wahrscheinlichkeiten für Ereignisse berechnen

Post by Gerrit2002 » Fri 16. Sep 2011, 09:57

Admin wrote:Hallo,

vorab: Bitte nicht verwirren lassen, ich habe das Thema in den Bereich 'Hilfe zu konkreten Projekten' verschoben, es schint mir da besser hinzupassen.
Kein Problem. Wusste nicht ob mein kleiner Start schon als Projekt gilt :mrgreen:

Admin wrote:Mein erster Vorschlag wäre Folgender:
- Für jeden Spieler ein eigenes Input-Neuron anlegen. Dabei steht ein bestimmtes Input-Neuron immer für den selben Spieler
- Die Input-Neuronen mit der Aktivierungsfunktion 'IDENTICAL' versehen. Damit erlauben sie (ohne zusätzliche spezielle Normalisierungseinstellungen) einen Wertebereich von -1 bis +1
- Wenn ein Spieler nicht am Spiel teilnimmt, den Wert 0 für das entsprechende Input-Neuron vergeben.
- Wenn ein Spieler in Mannschaft 1 spielt +1 vergeben
- Wenn der Spieler in Mannschaft 2 spielt -1 vergeben
- Zwei Output-Neuronen (LOGISTIC) für die Punktzahlen, eines für jede Mannschaft (= Spielstand)
- Die Normalisierung für die Output-Neuronen so wählen, dass ein Worst-Case Maximalpunktestand 'Platz' darin findet, also z.B. 0..10?
OK von der Seite hatte ich es noch nicht gesehen. Je nach Anzahl der Spieler wird das Netz dann natürlich sehr hoch aber so müsste es funktionieren. Vor allem wenn ich später noch gegnerische Spieler mit einpflege und das über mehrere Saisons (wobei dann natürlich der Input sehr hoch wird). Aber man wächst an den Herausforderungen ;o)

Mit den Funktionen (identical, etc.) habe ich auch schon etwas rumgespielt. Scheint mir sehr logisch der Ansatz hier.
Admin wrote:Am besten gar nicht. Das ist auch nicht relevant. Der Fehler ist nur dem Verlauf nach von Interesse: Wenn man eine passable Netzarchitektur und Datencodierung gefunden hat, sollte man unbedingt so trainieren, dass man während des Trainings bereits den Fehler bzgl. der Validierungsdaten visualisiert. Wenn dieser sein Minimum erreicht hat, sollte man das Training abbrechen (irgendwann steigt der Fehler bzgl. der Validierung nämlich oft wieder an, die Generalisierung lässt also nach, das Netz wird übertrainiert).
Ob das Netz gut ist oder nicht, macht sich einzig und allein an der zielgerichteten Bewertung der Validierungsergebnisse (also der vorhergesagten Spielstände) fest. Die einzige Frage ist hier: Wie gut erfüllt mein Netz meinen Prognosezweck. Eine generische Aussage kann es hier per Definition nicht geben, da sie völlig vom Anwendungszweck und den eigenen Akzeptanzkriterien abhängt.
OK also trainieren bis der Fehler einen ca. statischen Wert im Diagramm annimmt. Nur: Wenn ich dann mit den Testreihen den Net Error prüfe kriege ich ja wieder einen Wert. Ist dann dieser in der Höhe auch irrelevant und nur im Verhältnis zum vorher trainierten Net Error zu setzen? Und wann ist der Wert "aussagekräftig".

Ich hatte z.B. ein Netz wo der Error im Training knapp unter 0,2 gefallen ist und dann beim Test auf 0,24 errechnet wurde. Was kann ich jetzt aus diesen Werten herauslesen?
Admin wrote:Ich kenne keine guten Quellen. Aber auch hier wieder die Aussage: Immer vom Anwendungsfall abhängig. Allerdings auch die klare Aussage: Wenn die Daten gut sind und Regeln dahinterstecken, dann ist die Netzarchitektur relativ irrelevant, man kann gar nicht so viel falsch machen bzw. optimieren wie man vielleicht vermutet.
Das gilt zumindest bei einem zeitinvarianten Netz wie in diesem Fall (Decay-Neuronen und Delay-Links können hier getrost entfallen).

Ich empfehle eine bis zwei Hiddenschichten, beginnen würde ich bei 100 Spieler-Neuronen mit 5-10 Neuronen in der ersten und drei Neuronen in der zweiten Hidden-Schicht (alles LOGISTIC). Bei Bedarf Anzahl sukzessive erhöhen.

Viele Grüße und viel Erfolg
Super dann fang ich mit einer solchen Konstruktion an. Verbindungen wären dann alle Input zu allen Hidden der ersten Schicht, die jeweils zur jeden der zweiten und die jeweils zu den Outputs, richtig?

Wie ist das jetzt wenn ich noch eine Zeitkomponente einbauen möchte (dass ein Spieler z.B. die letzten 5 Spiele gewonnen hat ist signifikanter als dass er 5 vor 2 Jahren verloren hat). Reicht es da ein Datums-Neuron im Input zu setzen was fortlaufend ist oder muss ich da mit Delay-Neurons arbeiten? Oder reicht es vielleicht sogar die Input-Lessons in Reihenfolge "ordered" ablaufen zu lassen?

Vielen vielen Dank für die schnelle und ausführliche Hilfe. Finde ich super, dass sich jemand so gut im Support hier kümmert! Ich habe das Programm kostenlos, da ich es rein für private Zwecke nutze. Gibt es eine Möglichkeit zumindest eine kleine Spende an Sie zu schicken für Ihre Hilfe und das tolle Programm?

User avatar
TJetter
Posts: 318
Joined: Sat 13. Oct 2012, 12:04

Re: Wahrscheinlichkeiten für Ereignisse berechnen

Post by TJetter » Fri 16. Sep 2011, 16:55

Gerrit2002 wrote:OK also trainieren bis der Fehler einen ca. statischen Wert im Diagramm annimmt. Nur: Wenn ich dann mit den Testreihen den Net Error prüfe kriege ich ja wieder einen Wert. Ist dann dieser in der Höhe auch irrelevant und nur im Verhältnis zum vorher trainierten Net Error zu setzen? Und wann ist der Wert "aussagekräftig".
Nein, was ich meinte: Bereits WÄHREND des Trainings den Netzfehler nicht über die Trainingsdaten sondern gleich über eine unabhängige Validierungslesson berechnen lassen. MemBrain kann das: Man kann im Lesson-Editor mehrere Lessons laden (hier also zwei) und bestimmen, welche davon die Trainingslesson sein soll und über welche der NetError berechnet werden soll. Man bricht das Training also dann ab, wenn der Fehler bzgl. der Validierungsdaten minimal wird, da man diesen Fehler bereits WÄHREND des Trainings betrachtet.
Gerrit2002 wrote:Verbindungen wären dann alle Input zu allen Hidden der ersten Schicht, die jeweils zur jeden der zweiten und die jeweils zu den Outputs, richtig?
So würde ich anfangen, ja. Was man dann immer noch tun kann: Zusätzlich Links einfügen, die eine oder mehrere Schichten überspringen (also z.B: von Inputs direkt zu Outputs).
Gerrit2002 wrote:Wie ist das jetzt wenn ich noch eine Zeitkomponente einbauen möchte (dass ein Spieler z.B. die letzten 5 Spiele gewonnen hat ist signifikanter als dass er 5 vor 2 Jahren verloren hat). Reicht es da ein Datums-Neuron im Input zu setzen was fortlaufend ist oder muss ich da mit Delay-Neurons arbeiten?
Ich würde, besonders bei der bereits hohen Komplexität des Eingangsdatenraums, auf zeitaghängige Elemente ganz verzichten. Das ist wesentlich einfacher zu beherrschen und meist erfolgversprechender.
Bzgl. der angesprochenen Zahl an gewonnenen Spielen: Vielleicht lässt sich ja für jeden Spieler eine Skalierung 0..1 festlegen, die abbildet, in wie vielen Spielen im letzten Jahr der Spieler in einer Gewinnmannschaft gespielt hat? Dann würde man für jedes Inputneuron nicht 0 oder 1 sondern 0 bis 1 (als variablen Wert) anlegen und würde somit die 'kürzliche Güte' eines Spielers zusätzlich einbringen. (Je nach Mannschaftszugehörigkeit müsste man natürlich auch symmetrisch Werte 0 bis -1 vergeben, wenn die Spieler in Mannschaft 2 eingesetzt werden).
Gerrit2002 wrote:Ich habe das Programm kostenlos, da ich es rein für private Zwecke nutze. Gibt es eine Möglichkeit zumindest eine kleine Spende an Sie zu schicken für Ihre Hilfe und das tolle Programm?
Wenn Sie wollen, können sie eine 'Non-Commercial License' erstehen, die ist sehr preisgünstig und unterdrückt den Startbildschirm von MemBrain als kleinen 'Mehrwert'. Das geht über die Homepage im Bereich 'Lizenzierung'. Ist aber natürlich kein Muss, MemBrain ist für nicht-kommerzielle Zwecke absolut kostenlos.

Ansonsten bin ich natürlich immer dankbar, wenn jemand - z.B. in anderen Foren - die 'Webetrommel' rührt, wenn er mit MemBrain gute Erfahrungen macht ;-)

Viele Grüße
Thomas Jetter

Post Reply