Keras LSTM时间序列

Rya*_*len 12 python machine-learning

我有一个问题,在这一点上,我完全迷失了如何解决它.我正在使用带有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)
Run Code Online (Sandbox Code Playgroud)

所以我正在获取输入数据(两列数据帧),创建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]]
Run Code Online (Sandbox Code Playgroud)

但我应该得到

[[ 73,  48],
[ 74,  42],
[ 91,  51],
[102,  64],
[109,  63],
[ 93,  65],
[ 92,  58]]
Run Code Online (Sandbox Code Playgroud)

原始数据集只有42行,所以我想知道是否有足够的工作吗?或者我错过了建模过程中的关键步骤?我已经看过一些使用嵌入层等的例子,是我应该看的东西吗?

在此先感谢您的帮助!

ted*_*ted 13

嘿瑞恩!

我知道现在已经很晚了,但我刚刚遇到了你的问题,希望现在还不算太晚,或者你仍然在这里找到一些知识.

首先,Stackoverflow可能不是这类问题的最佳位置.第一个原因是你有一个概念性问题,而不是这个网站的目的.此外,您的代码运行所以它甚至不是一般编程的问题.看看统计数据.

从我看到的第二个没有概念错误.您正在使用以下所需的一切:

  • lstm与propper尺寸
  • return_sequences=false就在你的Dense图层之前
  • 线性激活输出
  • mse 成本/损失/目标函数

第三,我发现你的网络极不可能用这么少的数据来学习任何东西.您必须了解这里的数据少于参数!对于绝大多数的监督学习算法,你需要的第一件事就是不是一个好的模型,它是很好的数据.您无法从如此少的示例中学习,特别是对于LSTM网络等复杂模型.

第四,您的目标数据似乎是由相对较高的值组成的.这里预处理的第一步可能是标准化数据:将其置于零左右 - 即按平均值转换数据 - 并按标准偏差重新缩放.这真的有助于学习!

第五,一般来说,您应该考虑一些改进学习和减少过度拟合的事情:

最后但并非最不重要的是我建议您在Github上查看本教程,特别是关于keras时间序列循环教程.

PS:Daniel Hnyk更新了他的帖子 ;)