python - 使用 PyBrain 神经网络预测时间序列数据

标签 python neural-network forecasting pybrain lstm

问题

我正在尝试使用连续 5 年的历史数据来预测下一年的值。

数据结构

我的输入数据 input_04_08 如下所示,其中第一列是一年中的第几天(1 到 365),第二列是记录的输入。

1,2
2,2
3,0
4,0
5,0

我的输出数据 output_04_08 看起来像这样,一列包含一年中那一天的记录输出。

27.6
28.9
0
0
0

然后我将 0 和 1 之间的值归一化,因此提供给网络的第一个样本看起来像

Number of training patterns:  1825
Input and output dimensions:  2 1
First sample (input, target):
[ 0.00273973  0.04      ] [ 0.02185273]

方法

前馈网络

我已经在 PyBrain 中实现了以下代码

input_04_08 = numpy.loadtxt('./data/input_04_08.csv', delimiter=',')
input_09 = numpy.loadtxt('./data/input_09.csv', delimiter=',')
output_04_08 = numpy.loadtxt('./data/output_04_08.csv', delimiter=',')
output_09 = numpy.loadtxt('./data/output_09.csv', delimiter=',')

input_04_08 = input_04_08 / input_04_08.max(axis=0)
input_09 = input_09 / input_09.max(axis=0)
output_04_08 = output_04_08 / output_04_08.max(axis=0)
output_09 = output_09 / output_09.max(axis=0)
ds = SupervisedDataSet(2, 1)

for x in range(0, 1825):
    ds.addSample(input_04_08[x], output_04_08[x])

n = FeedForwardNetwork()
inLayer = LinearLayer(2)
hiddenLayer = TanhLayer(25)
outLayer = LinearLayer(1)
n.addInputModule(inLayer)
n.addModule(hiddenLayer)
n.addOutputModule(outLayer)
in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)
n.addConnection(in_to_hidden)
n.addConnection(hidden_to_out)
n.sortModules()

trainer = BackpropTrainer(n, ds, learningrate=0.01, momentum=0.1)

for epoch in range(0, 100000000): 
    if epoch % 10000000 == 0:
        error = trainer.train()  
        print 'Epoch: ', epoch
        print 'Error: ', error


result = numpy.array([n.activate(x) for x in input_09])

这给了我以下结果,最终错误为 0.00153840123381

enter image description here

不可否认,这看起来不错。然而,在阅读了更多有关 LSTM(长短期内存)神经网络的信息以及对时间序列数据的适用性后,我正在尝试构建一个。

LSTM 网络

下面是我的代码

input_04_08 = numpy.loadtxt('./data/input_04_08.csv', delimiter=',')
input_09 = numpy.loadtxt('./data/input_09.csv', delimiter=',')
output_04_08 = numpy.loadtxt('./data/output_04_08.csv', delimiter=',')
output_09 = numpy.loadtxt('./data/output_09.csv', delimiter=',')

input_04_08 = input_04_08 / input_04_08.max(axis=0)
input_09 = input_09 / input_09.max(axis=0)
output_04_08 = output_04_08 / output_04_08.max(axis=0)
output_09 = output_09 / output_09.max(axis=0)
ds = SequentialDataSet(2, 1)

for x in range(0, 1825):
    ds.newSequence()
    ds.appendLinked(input_04_08[x], output_04_08[x])


fnn = buildNetwork( ds.indim, 25, ds.outdim, hiddenclass=LSTMLayer, bias=True, recurrent=True)
trainer = BackpropTrainer(fnn, ds, learningrate=0.01, momentum=0.1)

for epoch in range(0, 10000000): 
    if epoch % 100000 == 0:
        error = trainer.train()  
        print 'Epoch: ', epoch
        print 'Error: ', error

result = numpy.array([fnn.activate(x) for x in input_09])

这会导致最终错误为 0.000939719502501,但这一次,当我输入测试数据时,输出图看起来很糟糕。

enter image description here

可能出现的问题

我在这里查看了几乎所有 PyBrain 问题,这些问题很突出,但没有帮助我解决问题

我看了一些博文,这些对我的理解有所帮助,但显然还不够

当然,我也浏览了 PyBrain 文档,但找不到对顺序数据集栏有多少帮助 here .

欢迎任何想法/提示/方向。

最佳答案

我认为这里发生的事情是您尝试根据一些经验法则分配超参数值,该经验法则适用于第一种情况,但不适用于第二种情况。

1) 您正在查看的误差估计是训练集的乐观预测误差估计。 实际 预测误差很高,但因为您没有在看不见的数据上测试您的模型,所以无法知道它。 Elements of statistical learning很好地描述了这种现象。我强烈推荐这本书。您可以免费在线获取它。

2) 要获得具有低预测误差的估计器,您需要执行超参数调整。例如。隐藏节点的数量、学习率和动量应该变化,并在看不见的数据上进行测试,以了解哪种组合会导致最低的预测误差。 scikit-learnGridSearchCVRandomizedSearchCV 来做到这一点,但它们只适用于 sklearn 的估计器。不过,您可以推出自己的估算器,这在 the documentation 中有描述。 .我个人认为模型选择和模型评估是两个不同的任务。对于第一个,您可以只运行一个 GridSearchCV 或 RandomizedSearchCV 并为您的任务获得一组最佳超参数。对于模型评估,您需要运行更复杂的分析,例如嵌套交叉验证,如果您想要更准确的估计,甚至需要重复嵌套交叉验证。

3) 我对 LSTM 网络了解不多,但我看到在第一个例子中你分配了 25 个隐藏节点,但对于 LSTM 你只提供了 5 个。可能学习模式还不够。您也可以像 the example 中所做的那样降低输出偏差。 .

附言我觉得这个问题其实属于http://stats.stackexchange.com ,在那里您可能会得到更详细的问题答案。

编辑:我刚刚注意到您正在对模型进行 1000 万次训练!我认为这很多而且可能是过度拟合问题的一部分。我认为实现 early stopping 是个好主意,即如果达到某个预定义的错误,则停止训练。

关于python - 使用 PyBrain 神经网络预测时间序列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088115/

相关文章:

python - 使用 Keras 和 TensorFlow 找到最大化神经网络输出的输入

c# - 反向传播算法给出不好的结果

r - 如何告诉先知不要预测负值

r - 在没有循环的情况下找到时间序列中最大的下降/上升(最好使用 tidy/dplyr)?

python - 在我使用 PyInstaller 将 PY 转换为 EXE 后,它抛出错误

python - 如何在Python中获取日志文件中的运行命令

python - 从哪里开始编写用于将本地目录同步到 Google Drive 的 Python 脚本?

python - Python中的Selenium下载文件: even after setting Firefox Profile the Download Window opens

machine-learning - 梯度下降本身可以解决ANN中的非线性问题吗?

r - 使用 tsDyn 进行预测 - R 中的错​​误