如何使用Pybrain对新数据进行预测?

4
我想做的是让Pybrain预测新数据,例如predict(0,1,0,1,1,0),并输出其所认为的答案。问题是,我需要粘贴什么代码才能实现这一点?
额外的信息:Pybrain正在学习的weather.csv文件有6个属性,而答案只能是1或0。没有其他数字。
再次强调,我想做的就是在Pybrain学会后询问它对我给出的数字进行预测。例如:predict(0,1,0,1,1,0) ,然后输出一个答案。我对Python和Pybrain非常陌生。
这是我的代码:
from pybrain.datasets import SupervisedDataSet
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer

from pybrain.datasets            import ClassificationDataSet
from pybrain.utilities           import percentError
from pybrain.tools.shortcuts     import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure.modules   import SoftmaxLayer

from pylab import ion, ioff, figure, draw, contourf, clf, show, hold, plot
from scipy import diag, arange, meshgrid, where
from numpy.random import multivariate_normal

ds = SupervisedDataSet(6,1)

tf = open('weather.csv','r')

for line in tf.readlines():
    try:
        data = [float(x) for x in line.strip().split(',') if x != '']
        indata =  tuple(data[:6])
        outdata = tuple(data[6:])
        ds.addSample(indata,outdata)
    except ValueError,e:
            print "error",e,"on line"


n = buildNetwork(ds.indim,8,8,ds.outdim,recurrent=True)
t = BackpropTrainer(n,learningrate=0.001,momentum=0.05,verbose=True)
t.trainOnDataset(ds,3000)
t.testOnData(verbose=True)

更新:
我的weather.csv文件只有7个观测值(目前仅用于测试)。它在csv文件中的样子如下所示(数据是从1970年的一周提取的):
1   0   1   1   1   1   1
0   0   0   1   1   1   0
1   0   1   1   1   1   1
0   0   0   1   1   1   0
0   0   0   1   1   1   0
0   0   0   1   1   1   0
0   0   0   1   1   1   0

最后一列(最右边)是Pybrain需要预测的列。当我运行代码并告诉Pybrain在这个小数据集上训练3000次(我想过度拟合)。我得到的输出是:

Total error: 0.0140074590407
Total error: 0.0139930126505
Total error: 0.0139796724323
Total error: 0.0139656881439

Testing on data:
out:     [  0.732]
correct: [  1.000]
error:  0.03581333
out:     [  0.101]
correct: [  0.000]
error:  0.00511758
out:     [  0.732]
correct: [  1.000]
error:  0.03581333
out:     [  0.101]
correct: [  0.000]
error:  0.00511758
out:     [  0.101]
correct: [  0.000]
error:  0.00511758
out:     [  0.101]
correct: [  0.000]
error:  0.00511758
out:     [  0.101]
correct: [  0.000]
error:  0.00511758

现在我只想告诉PyBrain,用过拟合的模型预测2014年的新数据。但是我不知道怎么做。我的目标是看看过度拟合的模型在2014年的新数据上表现如何。


那么,当您运行此代码时会发生什么?它与您的期望有何不同?最后一行是否没有给出预测? - rossdavidh
最后一行给了我一个预测结果(如果我将最后一列留空),但它仍然是在已有数据上进行训练的。这正是我想要避免的。 - ben olsen
1个回答

5
如果我理解你的问题正确,你想要使用activate函数。例如,如果你在以上代码的末尾添加这两行代码:
data2014 = n.activate([0,1,0,1,0,1])
print 'data2014',data2014

...它将输出一行的结果。当然,您可能想要对多个行进行预测,因此您需要读取第二个csv文件,在循环中使用激活函数等。但这应该给你基本的思路。


谢谢,我想这就是了。 - ben olsen
我有一个快速的问题要问。当我上传包含4000个数据点的完整weather.csv文件时,速度非常慢,你知道如何加快它吗?目前我拥有8G内存和i7处理器。 - ben olsen
你指的是多慢? - rossdavidh
当 weather.csv 文件只有 7 个数据点时,我训练了 3000 次。它能够在 5 分钟内完成该过程。现在新的 weather.csv 文件有 4000 个数据点,需要 7 小时才能完成。 - ben olsen
如果完成7个点需要5分钟,那可能是真实的(即不是由于内存耗尽等原因导致的)。你需要对整个数据集进行训练吗?尝试在随机选择的子集上进行训练,并查看预测是否有意义上的不同。也许在50、100或500个数据点之后,你已经得出了更多或更少的最终答案。此外,你可以使用trainUntilConvergence而不是trainOnDataset,这样你可能不需要3000次迭代就能收敛到最终答案。 - rossdavidh
我尝试过trainUntilConvergence,结果(输出)总是在50%左右。我的想法是使用Amazon AWS EC2实例。你了解Amazon AWS吗?如果是的话,你能推荐一个速度快的吗? - ben olsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接