我正在尝试在Keras训练关于时间序列数据的ANN。我有三个数据向量分为滚动窗口序列(即向量l)。
np.array([l[i:i+window_size] for i in range( len(l) - window_size)])
目标矢量类似地加窗,因此神经网络输出是下一个window_size个时间步数的目标矢量的预测。所有数据均使用最小 - 最大缩放器进行标准化。它以shape =(nb_samples,window_size,3)的形式输入神经网络。这是3个输入向量的图。
我设法从ANN中获得的唯一输出是以下情节。蓝色的目标矢量,红色的预测(绘图被放大以使预测模式清晰可见)。以window_size间隔绘制预测向量,因此每个重复模式是来自网络的一个预测。
我尝试了许多不同的模型架构,时代数,激活功能,短网和胖网,瘦,高。这是我现在的那个(它有一点点)。
Conv1D(64,4, input_shape=(None,3)) ->
Conv1d(32,4) ->
Dropout(24) ->
LSTM(32) ->
Dense(window_size)
但是我尝试的任何东西都不会影响神经网络输出这个重复的模式。我一定是对Keras的时间序列或LSTM有些误解。但是我在这一点上非常失败,所以非常感谢任何帮助。我在这个存储库中附上了完整的代码。
答案 0 :(得分:1)
我玩了一些你的代码,我想我有一些建议让你走上正轨。代码似乎与您的图表不完全匹配,但我认为您从那时起已经调整了一下。无论如何,有两个主要问题:
最大的问题在于您的数据准备步骤。你基本上有数据形状向后,因为你有一个X的输入时间步和Y的时间序列。你的输入形状是(18830,1,8),当你真正想要的是(18830,30,8)这样就可以将完整的30个步骤输入LSTM。否则,LSTM仅在一个时间步上运行,并没有真正有用。要解决此问题,我更改了common.py
中的行
X = X.reshape(X.shape[0], 1, X.shape[1])
到
X = windowfy(X, winsize)
同样地,输出数据应该只有1个值,这是我从绘图函数中收集到的目标。肯定会有一些情况需要预测整个时间序列,但我不知道在这种情况下这是否是您想要的。我更改了Y_train
以使用fuels
而不是fuels_w
,因此它只需要预测时间序列的一个步骤。
对于这个简单的网络架构,100个时期的培训可能太过分了。在某些情况下,当我运行它时,看起来有一些过度拟合。观察网络损失的减少,似乎只需要3-4个时代。
以下是我提到的调整后3个训练时期后的预测图。这不是一个很好的预测,但它现在看起来至少在正确的轨道上。祝你好运!
编辑:预测多个输出时间步长的示例:
from sklearn import datasets, preprocessing
import numpy as np
from scipy import stats
from keras import models, layers
INPUT_WINDOW = 10
OUTPUT_WINDOW = 5 # Predict 5 steps of the output variable.
# Randomly generate some regression data (not true sequential data; samples are independent).
np.random.seed(11798)
X, y = datasets.make_regression(n_samples=1000, n_features=4, noise=.1)
# Rescale 0-1 and convert into windowed sequences.
X = preprocessing.MinMaxScaler().fit_transform(X)
y = preprocessing.MinMaxScaler().fit_transform(y.reshape(-1, 1))
X = np.array([X[i:i + INPUT_WINDOW] for i in range(len(X) - INPUT_WINDOW)])
y = np.array([y[i:i + OUTPUT_WINDOW] for i in range(INPUT_WINDOW - OUTPUT_WINDOW,
len(y) - OUTPUT_WINDOW)])
print(np.shape(X)) # (990, 10, 4) - Ten timesteps of four features
print(np.shape(y)) # (990, 5, 1) - Five timesteps of one features
# Construct a simple model predicting output sequences.
m = models.Sequential()
m.add(layers.LSTM(20, activation='relu', return_sequences=True, input_shape=(INPUT_WINDOW, 4)))
m.add(layers.LSTM(20, activation='relu'))
m.add(layers.RepeatVector(OUTPUT_WINDOW))
m.add(layers.LSTM(20, activation='relu', return_sequences=True))
m.add(layers.wrappers.TimeDistributed(layers.Dense(1, activation='sigmoid')))
print(m.summary())
m.compile(optimizer='adam', loss='mse')
m.fit(X[:800], y[:800], batch_size=10, epochs=60) # Train on first 800 sequences.
preds = m.predict(X[800:], batch_size=10) # Predict the remaining sequences.
print('Prediction:\n' + str(preds[0]))
print('Actual:\n' + str(y[800]))
# Correlation should be around r = .98, essentially perfect.
print('Correlation: ' + str(stats.pearsonr(y[800:].flatten(), preds.flatten())[0]))