首页 文章

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

提问于
浏览
8

问题

我试图使用5年的连续历史数据来预测下一年的 Value .

数据结构

我的输入数据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])

这给了我以下结果 final error of 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])

这导致 final error of 0.000939719502501 ,但这次,当我提供测试数据时,输出图看起来很糟糕 .

enter image description here

可能的问题

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

我已经阅读了一些博客文章,这些有助于我进一步理解,但显然还不够

当然,我也经历了PyBrain文档,但找不到太多帮助顺序数据集栏here .

任何想法/提示/方向都将受到欢迎 .

1 回答

  • 7

    我想这里发生的事情是你试图根据一些经验法则分配超参数值,这对于第一种情况是有效的,但对于第二种情况却没有 .

    1)您正在查看的误差估计是训练集的乐观预测误差估计 . 实际预测误差很高,但因为你没有办法知道它 . Elements of statistical learning给出了这种现象的一个很好的描述 . 我强烈推荐这本书 . 您可以免费在线获取 .

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

    3)我不足以学习这种模式 . 你也可以像the example中那样放弃输出偏差 .

    附:我认为这个问题实际上属于http://stats.stackexchange.com,您可能会对问题得到更详细的解答 .

    EDIT :我刚刚注意到你很多,可能是过度拟合问题的一部分 . 我认为实施early stopping是一个好主意,即如果实现了一些预定义的错误就停止训练 .

相关问题