Dies ist eine gute Frage, mit der ich mich beim ersten Versuch, eine ANN zu codieren, auseinandergesetzt habe.
Im Folgenden finden Sie eine gute Allzwecklösung, die ich in meinem Code implementiert habe, um zu versuchen, gut verhaltene numerische Daten vorherzusagen. Wenn sich Ihre Daten nicht gut verhalten (dh mit Ausreißern behaftet sind), müssen Sie möglicherweise mehr Arbeit leisten, um die Ein- und Ausgänge zu normalisieren. Einige der fortgeschritteneren Methoden werden beschrieben hier .
Hinweis: Ich gehe davon aus, dass Sie f (x) = tanh (x) als Aktivierungsfunktion verwenden. Wenn dies nicht der Fall ist, sollten Sie nach dem Lesen noch in der Lage sein, zu überlegen, wie Sie Ihre Daten normalisieren können.
So bereiten Sie die Eingabedaten vor:
Die Grundidee ist, dass eine signifikante Variation in jedem Eingabeparameter sich in einer signifikanten Variation in der Aktivierung des Neurons widerspiegeln soll, in das diese Eingaben eingespeist werden. Wenn Sie sich ein Diagramm der Ableitung der tanh (x) -Aktivierungsfunktion ansehen, werden Sie feststellen, dass sich der Bereich mit signifikanter Steigung in einem Abstand von eins oder zwei vom Ursprung befindet. Dies bedeutet, dass unabhängig davon, ob die Eingabe für die Aktivierungsfunktion 2000 oder 3000 beträgt (Werte von x, für die die Ableitung vernachlässigbar klein ist), die Ausgabe der Aktivierung nahezu identisch ist ... sodass der Zustand Ihres Neurons unabhängig von der Differenz zwischen ist 2000 und 3000, und Ihr Netzwerk wird niemals Vorhersagekraft aus Werten in diesem Bereich erzeugen.
Wenn Sie also die Quadratmeterzahl des Hauses in ein Neuron eingeben möchten, müssen Sie die Quadratmeterzahl normalisieren, damit das Netzwerk den Unterschied zwischen 2000 und 3000 erkennen kann Daten werden vom Neuron "bemerkt", um die Eingaben durch Z-Score-Normalisierung zu normalisieren .
Sammeln Sie alle Ihre Quadratmeterwerte (aus Ihrem Trainingssatz) und berechnen Sie den Mittelwert und die Standardabweichung. Speichern Sie den Mittelwert und die Standardabweichung. Diese Informationen benötigen Sie, um beim Testen neue Quadratmeterwerte zu normalisieren.
Normalisieren Sie den Vektor der Quadratmeterwerte, indem Sie den Mittelwert subtrahieren und dann das Ergebnis durch die Standardabweichung dividieren (natürlich alle Operationen elementweise). Durch Subtrahieren des Mittelwerts werden Ihre Daten am Ursprung zentriert, und durch Teilen durch die Standardabweichung wird sichergestellt, dass der größte Teil zwischen -1 und 1 liegt, wobei die Ausgabe des Neurons am empfindlichsten für die Eingabe ist. Dies wird als Z-Score-Normalisierung bezeichnet, da jeder Eingabewert durch seinen Z-Score ersetzt wird .
Führen Sie die obigen Schritte für jede Eingabevariable aus.
Wenn Sie nun jeden Eingabewert durch ein Neuron setzen, ist die Ausgabe des Neurons eine Aktivierung zwischen -1 und 1 (siehe Bild von tanh (x)). Da dies bereits im "sensitiven" Bereich der Aktivierungsfunktion liegt, müssen Sie sich keine Gedanken über die Änderung der Ausgabe der Neuronen der Eingangsschicht machen, bevor Sie sie an die erste verborgene Schicht senden. Geben Sie einfach allen Neuronen der verborgenen Ebene die Ausgaben der vorherigen Ebene direkt - sie können sie problemlos verarbeiten.
Wenn Sie die letzte Schicht (das Ausgangsneuron (die Ausgangsneuronen)) erreichen, erhalten Sie erneut eine Aktivierung zwischen -1 und 1. Sie müssen diese wieder in einen Wert für das betreffende Haus umwandeln , ob dieser Wert als verwendet wird eine Vorhersage in einem Testsatz oder zur Berechnung des Fehlers während des Trainings. Wie auch immer Sie dies tun, Sie müssen nur konsistent sein und beim Training und Testen dasselbe De-Normalisierungsverfahren anwenden. Eine Möglichkeit, darüber nachzudenken, ist: Wenn das Ausgangsneuron (die Ausgangsneuronen) 1 zurückgibt, bedeutet dies, dass das Netzwerk den maximal möglichen Hauswert als Vorhersage zurückgibt . Was sollte der höchste Wert sein, den das Netzwerk schätzen kann? Der richtige Ansatz hängt einfach von Ihrer Anwendung ab. Das habe ich getan:
- Berechnen Sie den Mittelwert der Ausgabevariablen [die / jede] und speichern Sie sie.
- Berechnen Sie die maximale Abweichung der Ausgangsvariablen vom Mittelwert. Python:
MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
- Wenn das Netzwerk Ausgaben zwischen -1 und 1 zurückgibt, multiplizieren Sie die Ausgabe mit
MaxDev
und addieren Sie sie zum Mittelwert.
Zwei grundlegende Schnellprüfungen, mit denen Sie feststellen können, ob Ihr Normalisierungs- / Renormierungsschema geeignet ist (dies sind notwendige, aber möglicherweise nicht ausreichende Bedingungen):
- Wenn alle Eingabewerte durchschnittlich sind (z. B. durchschnittliche Anzahl der Schlafzimmer, durchschnittliche Quadratmeter usw.), entspricht die Netzwerkausgabe auch dem Durchschnitt der Ausgabevariablen (z. B. Hauswert)? (Es sollte sein.)
- Wenn alle Eingabewerte ungewöhnlich hoch / niedrig sind, ist die Netzwerkausgabe auch ungewöhnlich hoch / niedrig? (Dies funktioniert nur, wenn alle Eingänge positiv mit dem Ausgang verbunden sind. Wenn einige davon in umgekehrter Beziehung zueinander stehen, müssen Sie etwas mehr darüber nachdenken.)
Beachten Sie, dass das hier vorgestellte Schema diese beiden Bedingungen erfüllt.
Beachten Sie, dass Ihr Netzwerk mit diesem Schema nur Hauswerte innerhalb des Bereichs der Hauswerte in Ihrem Trainingsdatensatz vorhersagen kann. Abhängig von der Anwendung kann dieses Verhalten wünschenswert oder unerwünscht sein.
Beispiel: Möglicherweise möchten Sie Ihrem Netzwerk die Vorhersage negativer Hauswerte unmöglich machen. Überlegen Sie, wie Sie dies tun würden. De-Normalisieren Sie die Ausgabe so, dass -1 auf 0 abgebildet wird.
Wenn Sie keine Begrenzung für die Werte festlegen möchten, die Ihr Netzwerk vorhersagen kann, können Sie die Netzwerkausgabe über eine Funktion ausführen, die den Bereich [-1,1] allen reellen Zahlen zuordnet ... wie arctanh (x)! Solange Sie dies während des Trainings tun, passt Ihr Netzwerk seine Gewichte an, um dies zu berücksichtigen.
Ich hoffe das war hilfreich. Lassen Sie mich wissen, wenn Sie weitere Fragen haben. Mein ANN-Modul befindet sich übrigens in Python, daher habe ich möglicherweise sprachspezifische Ratschläge.