我有一个问题,此时我完全迷失了如何解决它。我使用带有LSTM图层的Keras投影时间序列。我试图使用之前的10个数据点来预测第11个数据。
以下是代码:
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
def _load_data(data):
"""
data should be pd.DataFrame()
"""
n_prev = 10
docX, docY = [], []
for i in range(len(data)-n_prev):
docX.append(data.iloc[i:i+n_prev].as_matrix())
docY.append(data.iloc[i+n_prev].as_matrix())
if not docX:
pass
else:
alsX = np.array(docX)
alsY = np.array(docY)
return alsX, alsY
X, y = _load_data(df_test)
X_train = X[:25]
X_test = X[25:]
y_train = y[:25]
y_test = y[25:]
in_out_neurons = 2
hidden_neurons = 300
model = Sequential()
model.add(LSTM(in_out_neurons, hidden_neurons, return_sequences=False))
model.add(Dense(hidden_neurons, in_out_neurons))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05)
predicted = model.predict(X_test)
所以我取输入数据(两列数据帧),创建X是一个n乘10乘2的数组,y是一个n乘2的数组,比最后一行提前一步在每个X数组中(用直接在其前面的点标记数据。
预测正在回归
[[ 7.56940445, 5.61719704],
[ 7.57328357, 5.62709032],
[ 7.56728049, 5.61216415],
[ 7.55060187, 5.60573629],
[ 7.56717342, 5.61548522],
[ 7.55866942, 5.59696181],
[ 7.57325984, 5.63150951]]
但我应该
[[ 73, 48],
[ 74, 42],
[ 91, 51],
[102, 64],
[109, 63],
[ 93, 65],
[ 92, 58]]
原始数据集只有42行,所以我想知道是否还有不足以使用?或者我错过了建模过程中的关键步骤?我已经看过一些使用嵌入层等的例子,那是我应该看的东西吗?
提前感谢您的帮助!
答案 0 :(得分:12)
我知道现在已经很晚了,但我刚刚遇到了你的问题,希望现在还不晚,或者你仍然在这里找到一些知识。
首先,Stackoverflow可能不是这类问题的最佳位置。第一个原因是你有一个概念性问题,而不是这个网站的目的。此外,您的代码运行所以它甚至不是一般编程的问题。 查看stats 。
从我看到的第二没有概念错误。你正在使用所有必要的东西:
return_sequences=false
就在Dense
图层mse
费用/损失/目标函数第三但是,我发现您的网络极不可能通过如此少的数据来学习任何内容。您必须了解这里的数据少于参数!对于绝大多数的监督学习算法,你需要的第一件事就是不是一个好的模型,它是很好的数据。您无法从如此少的示例中学习,特别是对于LSTM网络等复杂模型。
第四您的目标数据似乎是由相对较高的值组成的。这里预处理的第一步可能是标准化数据:将其置于零左右 - 即按平均值转换数据 - 并按标准偏差重新缩放。这真的有助于学习!
第五一般来说,您应该考虑以下几点来改进学习并减少过度拟合:
最后但并非最不重要我建议您查看此tutorial on Github,尤其是recurrent tutorial for time series with keras。
PS:Daniel Hnyk更新了他的post;)