【发布时间】:2014-11-08 19:59:09
【问题描述】:
我正在尝试编写一个可以预测一些数据的神经网络。因此我将 PyBrain 用于 python。我发现SupervisedDataset 非常适合这项任务。我取了一些股票数据,并将其中的 5 个值作为输入,将第 6 个值作为目标。然后我用buildNetwork 函数构建了一个前馈网络,并用BackpropTrainer 对其进行了训练。
无论如何,错误不会减少。它停留在~0.6,似乎在那里振荡。我试图调整动量和学习率,但没有帮助。我做错了什么?
from pybrain.datasets import SupervisedDataSet
DS = SupervisedDataSet(5, 1)
DS.addSample((44.055, 44.54, 44.04, 43.975, 43.49), (42.04,))
DS.addSample((44.54, 44.04, 43.975, 43.49, 42.04), (42.6,))
DS.addSample((44.04, 43.975, 43.49, 42.04, 42.6), (42.46,))
DS.addSample((43.975, 43.49, 42.04, 42.6, 42.46), (41.405,))
DS.addSample((43.49, 42.04, 42.6, 42.46, 41.405), (42.385,))
DS.addSample((42.04, 42.6, 42.46, 41.405, 42.385), (42.655,))
DS.addSample((42.6, 42.46, 41.405, 42.385, 42.655), (41.53,))
DS.addSample((42.46, 41.405, 42.385, 42.655, 41.53), (40.09,))
DS.addSample((41.405, 42.385, 42.655, 41.53, 40.09), (39.8,))
DS.addSample((42.385, 42.655, 41.53, 40.09, 39.8), (40.2,))
DS.addSample((42.655, 41.53, 40.09, 39.8, 40.2), (39.915,))
DS.addSample((41.53, 40.09, 39.8, 40.2, 39.915), (40.21,))
DS.addSample((40.09, 39.8, 40.2, 39.915, 40.21), (40.34,))
DS.addSample((39.8, 40.2, 39.915, 40.21, 40.34), (41.195,))
DS.addSample((40.2, 39.915, 40.21, 40.34, 41.195), (41.595,))
DS.addSample((39.915, 40.21, 40.34, 41.195, 41.595), (41.975,))
DS.addSample((40.21, 40.34, 41.195, 41.595, 41.975), (42.045,))
DS.addSample((40.34, 41.195, 41.595, 41.975, 42.045), (40.13,))
DS.addSample((41.195, 41.595, 41.975, 42.045, 40.13), (38.99,))
DS.addSample((41.595, 41.975, 42.045, 40.13, 38.99), (39.81,))
DS.addSample((41.975, 42.045, 40.13, 38.99, 39.81), (40.23,))
DS.addSample((42.045, 40.13, 38.99, 39.81, 40.23), (40.47,))
DS.addSample((40.13, 38.99, 39.81, 40.23, 40.47), (40.45,))
DS.addSample((38.99, 39.81, 40.23, 40.47, 40.45), (40.01,))
DS.addSample((39.81, 40.23, 40.47, 40.45, 40.01), (40.23,))
DS.addSample((40.23, 40.47, 40.45, 40.01, 40.23), (40.2,))
DS.addSample((40.47, 40.45, 40.01, 40.23, 40.2), (41.605,))
DS.addSample((40.45, 40.01, 40.23, 40.2, 41.605), (42.1,))
DS.addSample((40.01, 40.23, 40.2, 41.605, 42.1), (42.135,))
DS.addSample((40.23, 40.2, 41.605, 42.1, 42.135), (41.95,))
DS.addSample((40.2, 41.605, 42.1, 42.135, 41.95), (41.145,))
DS.addSample((41.605, 42.1, 42.135, 41.95, 41.145), (40.635,))
DS.addSample((42.1, 42.135, 41.95, 41.145, 40.635), (41.25,))
DS.addSample((42.135, 41.95, 41.145, 40.635, 41.25), (41.19,))
DS.addSample((41.95, 41.145, 40.635, 41.25, 41.19), (42.065,))
DS.addSample((41.145, 40.635, 41.25, 41.19, 42.065), (42.025,))
DS.addSample((40.635, 41.25, 41.19, 42.065, 42.025), (42.09,))
DS.addSample((41.25, 41.19, 42.065, 42.025, 42.09), (41.79,))
DS.addSample((41.19, 42.065, 42.025, 42.09, 41.79), (43.11,))
from pybrain.tools.shortcuts import buildNetwork
FNN = buildNetwork(DS.indim, 15, DS.outdim, bias=True)
from pybrain.supervised.trainers import BackpropTrainer
TRAINER = BackpropTrainer(FNN, dataset=DS, learningrate = 0.005, \
momentum=0.1, verbose=True)
for i in range(1000):
TRAINER.train()
编辑:一些 cmets 怀疑这些数据是否适合一般的神经网络。因此我在 MATLAB 中做了同样的网络,它工作得很好。经过 11 个训练 epoch 后,误差小于 0.002。
此外,我尝试使用 PyBrain 的 SupervisedDataset,但这也不起作用。我现在没有主意了。
【问题讨论】:
-
虽然我对您的问题没有明确的答案,但我想指出您不一定会做任何错误。您的数据可能不仅仅包含要预测的信息 - 如果您可以使用 FFNN 来预测您的特定股票市场以实现盈利,那么其他人已经这样做了。如果您怀疑自己的代码,我的建议是先在更简单的数据上测试您的网络,然后从那里开始
-
另外,您没有提到您将哪个五个值用作训练数据。假设它是您要预测的值之前的 5 个连续值,请注意,提供 NN 原始数据是不寻常的。我所知道的大部分工作都是处理数据和更高级别的统计数据
-
谢谢。那只是为了学习目的。事实上,我只是想为我的预测获得比使用前一天的值更好的结果。我将尝试使用更简单的数据来测试网络。
-
您还可以更改之前用作输入的天数。我不确定 NN 是否是预测具有绝对值的时间序列的正确工具。您可能还想尝试其他目标。也许只是用 Plus 和 Minus 来预测股票是上涨还是下跌。
-
如果您坚持使用股票数据,您可以使用历史上倾向于同时上涨和下跌的股票(例如同一行业的六只股票)。但是几十年来人们一直在尝试使用基本的神经网络来预测股票价格,我记得在 90 年代初读过它。如果它奏效了,它将被广泛传播,这意味着它将停止工作。甚至人类大脑中的神经网络也无法始终如一地做到这一点,而且它们比您的软件神经网络要大得多。