LSTM ANN läuft durch, die Voraussagen sind aber alle in (fast) derselben Größe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
d_s_2024
User
Beiträge: 2
Registriert: Mittwoch 11. September 2024, 17:35

Hallo an alle,

ich habe ein LSTM Model erstellt und lasse damit Daten analysieren. Es handelt sich um eine Datei mit einem DateTime Element als Index, 72 Datenspalten und einer Spalte Labels, die (normalisiert mit MinMaxScaler) die diskreten Werte 0, 0.25, 0.5, 0.75 und 1 annehmen können.
Das Model läuft inzwischen klaglos durch, die Vorhersagen für die Labels der Testdaten liegt jedoch immer um 0.495 (+/-0.001). Nun erwarte ich nicht, dass die Vorhersage perfekt ist, aber das Ergebnis verwundert mich dann doch. Was könnte die Ursache sein?

Hier der Code:

model = Sequential()
model.add(LSTM(64,input_shape=(10, 72), return_sequences=True)) # Input-Layer
model.add(LSTM(64, return_sequences=True)) # Hidden Layer 1
model.add(Dropout(0.05))
model.add(LSTM(64, return_sequences=True)) # Hidden Layer 2
model.add(Dropout(0.05))
model.add(LSTM(64)) # Hidden Layer 3
model.add(Dense(1, activation='sigmoid')) # Output-Layer


# Kompilieren des Modells
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=[tf.keras.metrics.Precision(),
tf.keras.metrics.Recall()])


# Trainieren des Modells
#model.fit(features, label, epochs=100, batch_size=32, validation_split=0.2)
model.fit(X_train, y_train,validation_data = (X_test,y_test), epochs=10, batch_size=32, validation_split=0.2)


# Vorhersagen auf dem Validierungsdatensatz erhalten

validation_predictions = model.predict(X_test)


# Erstellen eines Pandas DataFrame mit den Validierungsergebnissen

validation_results = pd.DataFrame({'actual_label': y_test.flatten(), 'predicted_label': validation_predictions.flatten()})

print(validation_results)

actual_label predicted_label
0 0.00 0.494990
1 0.25 0.495035
2 0.50 0.495570
3 0.00 0.495152
4 0.75 0.495622
.. ... ...
369 1.00 0.495035
370 0.00 0.495625
371 1.00 0.495055
372 0.00 0.494984
373 0.25 0.495717
Benutzeravatar
ThomasL
User
Beiträge: 1377
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hi,

binary_crossentropy passt da nicht. Schau mal hier: https://www.tensorflow.org/api_docs/pyt ... ossentropy
Da müssen die Labels entweder 0 oder 1 sein, das Wort binary ist dir ein Begriff?

Hier alle Loss Funktionen von Tensorflow https://www.tensorflow.org/api_docs/pyt ... ras/losses
Probier mal MeanSquaredError.

Aber du hast ja Klassen als Labels, bei dir die Werte 0, 0.25, 0.5, 0.75, 1.0.
Also wären die CategoricalCrossentropy Loss Funktionen das was du nehmen solltest.
Dazu musst du die Labels aber aber entweder in One-Hot Vektoren umwandeln für CategoricalCrossentropy
oder in Integerwerte für SparseCategoricalCrossentropy .

Viel Erfolg.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
d_s_2024
User
Beiträge: 2
Registriert: Mittwoch 11. September 2024, 17:35

Hi,

vielen Dank für die schnelle Antwort und die Hinweise.

>> binary_crossentropy passt da nicht. Schau mal hier: https://www.tensorflow.org/api_docs/pyt ... ossentropy
Da müssen die Labels entweder 0 oder 1 sein, das Wort binary ist dir ein Begriff?

Ähm, ja, da war irgendetwas. :-) Sorry, dass ich die Loss Funktion hier mit reinkopiert habe. Es war eher eine sinnlose Verzweiflungstat, da ich andere z.B.
MeanSquaredError schon probiert hatte. Das Ergebnis war mehr oder weniger dasselbe. Ich wollte einfach wissen, ob ich irgendeine Änderung in irgendeiner Form provozieren kann.
Könnte es noch eine andere Ursache als die Loss-Funktion geben?

>> Aber du hast ja Klassen als Labels, bei dir die Werte 0, 0.25, 0.5, 0.75, 1.0.
Also wären die CategoricalCrossentropy Loss Funktionen das was du nehmen solltest.
Dazu musst du die Labels aber aber entweder in One-Hot Vektoren umwandeln für CategoricalCrossentropy
oder in Integerwerte für SparseCategoricalCrossentropy .

Das schaue ich mir am Wochenende mal an.

Vielen Dank für die Anregungen!
Antworten