【发布时间】:2015-12-04 12:11:15
【问题描述】:
问题
我正在尝试使用连续 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
诚然,这看起来不错。但是,在阅读了有关 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,但是这一次,当我输入测试数据时,输出图看起来很糟糕。
可能的问题
我在这里查看了几乎所有 PyBrain 问题,这些问题很突出,但并没有帮助我解决问题
- Training an LSTM neural network to forecast time series in pybrain, python
- Time Series Prediction via Neural Networks
- Time series forecasting (eventually with python)
我看了几篇博文,对我的理解有所帮助,但显然还不够
当然,我也浏览了 PyBrain 文档,但对于顺序数据集栏 here 找不到太多帮助。
欢迎任何想法/提示/方向。
【问题讨论】:
标签: python neural-network forecasting pybrain lstm