Negative Leistung der Regression des neuronalen Netzwerks

Sep 18 2020

Ich habe ein Problem mit der Leistung eines mehrschichtigen Perzeptron-Regressors (neuronales Netzwerk) und kann nicht herausfinden, warum.

Aufgabe: Ich versuche eine Zeitreihenvorhersage zu verbessern. Ich habe Vorhersagen eines physikalischen Parameters der letzten 4 Jahre zusammen mit den quasi wahren Werten. Ich trainiere die NN mit den Vorhersagen für -7 Tage bis +1 Tage um den Tag, an dem ich als Features interessiert bin, um eine bessere Vorhersage für diesen Tag zu erhalten.

Problem: Die Ausgabe des NN ist schlechter als die Funktion für den Tag, an dem ich interessiert bin, sowohl für die Trainings- als auch für die Testdaten. Sowohl in Bezug auf RMSE als auch in Bezug auf MAE. Ich habe erwartet, dass die Ausgabe mindestens auf dem gleichen Niveau liegt wie die Funktion, die ich in das NN eingegeben habe.

Methode: Python mit sklearn. Ich verwende eine Rastersuche mit Kreuzvalidierung, um gute Hyperparameter zu erhalten. Ich teste auf verschiedene Konfigurationen versteckter Schichten, Aktivierungsfunktionen, Lernrate und Stärken der Regularisierungsstrafe. Ich habe die Daten für das Training in 66% und die restlichen Daten für das Testen aufgeteilt.

Ich bin sehr dankbar für Tipps, wie ich herausfinden kann, was mein Problem hier ist.

BEARBEITEN: Ich verwende sklearn.neural_network.MLPRegressor, das 'Identität', 'Logistik', 'Tanh' und 'Relu' als Aktivierungsfunktionen bereitstellt, und habe alle in der Rastersuche getestet.

Ich habe die Feature-Matrix NICHT skaliert, da sich alle Features in derselben Einheit wie die gewünschte Ausgabe befinden und zwischen -1 und +1 liegen.

EDIT2:

tuned_parameters = [{'hidden_layer_sizes': [int(2/3*number_features),
                                        (int(2/3*number_features), int(4/9*number_features)),
                                        (int(2/3*number_features), int(4/9*number_features), int(8/27*number_features))],
                 'alpha': 10.0 ** -np.arange(1, 4),
                 'activation': ["identity", "relu", "logistic", "tanh"],
                 'learning_rate': ['adaptive', "invscaling"],
                 'solver': ['lbfgs'],
                 'early_stopping': [True],
                 'max_iter': [600]}]
                 

regr = GridSearchCV(MLPRegressor(), tuned_parameters, n_jobs=3, verbose=2)
regr.fit(feature_training_matrix, combined_training_target_vector)

Daten : Die von mir verwendeten Vorhersagedaten haben die folgende Struktur: Für jeden Tag der letzten ~ 4 Jahre wurden Vorhersagen für die nächsten 90 Tage gemacht. Ich habe eine Textdatei mit -90d bis + 90d Daten für jeden Tag. Ich versuche, die NN zu trainieren, um eine bessere Vorhersage für die nächsten 10 Tage abzuschätzen. Dafür nehme ich -7 bis zu +1 Tage um den aktuellen Vorhersage-Tag (1-10 Tage, nachdem die aktuell verwendete Vorhersage beginnt) als Merkmale. Dies bedeutet, dass die Vorhersage des Tages, an dem ich interessiert bin, als Feature enthalten ist.

feature example: [0.16272058, 0.13296574, 0.14213905, 0.25064893, 0.23302285,
   0.21019931, 0.20733988, 0.1466959 , 0.17029025, 0.15876942]

corresponding target: 0.174652

Antworten

gergelybat Sep 28 2020 at 00:00

Es ist durchaus möglich, dass das Originalmodell bereits sehr gute Arbeit leistet - es ist nicht möglich, es zu verbessern. Beispielsweise kann die wahre Beziehung zwischen den ursprünglichen Eingabevariablen und dem Ziel linear sein, sodass ein neuronales Netzwerk nichts hinzufügt.

Als Test würde ich hidden_layer_sizes erhöhen und Early_stopping = False setzen und sogar nur eine Rastersuche durchführen (ohne Lebenslauf): RMSE-Training sollte besser werden als RMSE-Funktion. Höchstwahrscheinlich wird der RMSE-Test schlechter sein, aber zumindest haben Sie Beweise dafür, dass keine anderen unerwarteten Umstände vorliegen (z. B. ein Fehler im Code).

Es ist sinnvoll, Vorhersagen eines Basismodells als Eingaben zu verwenden. Insbesondere, wenn das ursprüngliche Basismodell irgendwie eingeschränkt ist und Sie erwarten, dass Ihr neues Modell das ursprüngliche Modell übertrifft, da Sie im neuen Modell diese Einschränkung nicht haben. Zum Beispiel könnte das ursprüngliche Modell linear sein (ARIMA oder ARIMAX), während Ihr Modell nichtlinear ist - ein neuronales Netzwerk.

Selbst wenn die wahre Beziehung zwischen Eingaben und Ziel nichtlinear ist, haben Sie hier nicht zu viel Spielraum für ein neuronales Netzwerk (denken Sie daran, dass wir ein Basismodell übertreffen möchten). Soweit ich weiß, haben Sie nur ~ 4 * 365 Beobachtungen. Sie können mit vielen Neuronen leicht übertrainieren, aber mit nur wenigen Neuronen kann das Training in lokalen Minima stecken bleiben.