0

Ich habe versucht, ein grundlegendes mehrschichtiges LSTM-Regressionsnetzwerk zu implementieren, um Korrelationen zwischen Kryptowährungspreisen zu finden.Warum verallgemeinert Keras meine Daten nicht?

Nachdem ich zu unbrauchbaren Trainingsergebnissen gekommen bin, habe ich beschlossen, mit etwas Sandbox-Code herumzuspielen, um sicherzugehen, dass ich die Idee richtig verstanden habe, bevor ich erneut an meinem vollen Dataset versuche.

Das Problem ist Keras kann ich nicht bekommen, meine Daten zu verallgemeinern.

ts = 3 
in_dim = 1 

data = [i*100 for i in range(10)] 

# tried this, didn't accomplish anything 
# data = [(d - np.mean(data))/np.std(data) for d in data] 

x = data[:len(data) - 4] 
y = data[3:len(data) - 1] 

assert(len(x) == len(y)) 

x = [[_x] for _x in x] 
y = [[_y] for _y in y] 

x = [x[idx:idx + ts] for idx in range(0, len(x), ts)] 
y = [y[idx:idx + ts] for idx in range(0, len(y), ts)] 

x = np.asarray(x) 
y = np.asarray(y) 

x sieht wie folgt aus:

[[[ 0] 
    [100] 
    [200]] 

[[300] 
    [400] 
    [500]]] 

und y:

[[[300] 
    [400] 
    [500]] 

[[600] 
    [700] 
    [800]]] 

und das funktioniert gut, wenn ich mit einer sehr ähnlichen Datenmenge vorhersagen, aber verallgemeinert nicht, wenn Ich versuche eine ähnliche Sequenz mit skalierten Werten

model = Sequential() 

model.add(BatchNormalization(
    axis = 1, 
    input_shape = (ts, in_dim))) 

model.add(LSTM(
    100, 
    input_shape = (ts, in_dim), 
    return_sequences = True)) 

model.add(TimeDistributed(Dense(in_dim))) 
model.add(Activation('linear')) 
model.compile(loss = 'mse', optimizer = 'rmsprop') 

model.fit(x, y, epochs = 2000, verbose = 0) 

p = np.asarray([[[10],[20],[30]]]) 
prediction = model.predict(p) 
print(prediction) 

druckt

[[[ 165.78544617] 
    [ 209.34489441] 
    [ 216.02174377]]] 

Ich mag

[[[ 40.0000] 
    [ 50.0000] 
    [ 60.0000]]] 

wie kann ich dieses Format, so dass, wenn ich in einer Folge mit Werten stecken, die aus einem ganz anderen Maßstab sind, wird die Netzwerkausgabe noch seinen vorhergesagten Wert? Ich habe versucht, meine Trainingsdaten zu normalisieren, aber die Ergebnisse sind immer noch völlig unbrauchbar.

Was habe ich hier falsch gemacht?

+0

Ich fand auch diese Diskussion über die Verwendung von LSTM für Autoregression auf univariaten Daten nützlich: https://machinelearningmastery.com/uitability-long-short-term-memory-networks Time-Series-Forecasting/- kann nicht sagen, dass es meine Fragen vollständig beantwortet hat, aber es bietet einige Einblicke, wie manchmal LSTMs Erwartungen an Zeitreihenprognosen nicht gerecht werden. – Phil

+0

Sie überschätzen die Kraft des tiefen Lernens. Sie geben nur Multiplikationen von 100 als Eingabe und erwarten, dass es auch auf ein Vielfaches von 10 verallgemeinert wird. Da 10 keine spezielle Nummer ist, sollte dieses Übertragungslernen auch für Vielfache einer beliebigen Zahl gelten. Aber wie sollte Ihr Modell wissen, dass dies die Aufgabe ist, die es tun soll? Deine Trainingsdaten sagen das in keiner Weise. Die Aufgabe könnte auch sein, einfach 100 zu der Eingabe zu dem gegenwärtigen Zeitschritt hinzuzufügen. Um verallgemeinern zu können, müssen Sie dem Modell Trainingsdaten geben, die Beispiele für Generalisierungen enthalten. –

Antwort

0

Wie wäre es mit der Transformation Ihrer Eingabedaten vor dem Senden in Ihr LSTM, verwenden Sie etwas wie sklearn.preprocessing.StandardScaler? nach Vorhersage können Sie scaler.inverse_transform (Vorhersage)

Verwandte Themen