为时间序列预测构建正确的ANN

这是我第一次使用Python,所以我有很多疑问。

我正在尝试使用Pybrain创建一个简单的ANN用于预测。这是一个2输入-1输出的网络。输入数据中,第一列是年份,第二列是月份。输出是与每个月份相关的正常降雨量。

我不知道自己做错了多少事情,但当我绘制结果时,出现了错误。

这是我的代码:

from pybrain.datasets import SupervisedDataSetfrom pybrain.tools.shortcuts import buildNetworkfrom pybrain.supervised.trainers import BackpropTrainerfrom pybrain.tools.validation import ModuleValidatorfrom pybrain.structure import SigmoidLayer, LinearLayer,TanhLayerfrom pybrain.utilities import percentErrorimport matplotlib.pyplot as pltimport numpy as npimport math#----------------------------------------------------------------------------------------------------------------------if __name__ == '__main__':    ds = SupervisedDataSet(2,1)      input = np.loadtxt('entradas.csv', delimiter=',')    output = np.loadtxt('salidas.csv', delimiter=',')    for x in range(0, len(input)):        ds.addSample(input[x], output[x])    print (ds['input'])    print ("Hay una serie de",len(ds['target']),"datos")    #print(ds)    # Definicion topologia de la Red Neuronal      n = buildNetwork(ds.indim,5,ds.outdim,recurrent=True,hiddenclass=SigmoidLayer)      #ENTRENAMIENTO DE LA RED NEURONAL    trndata,partdata=ds.splitWithProportion(0.60)    tstdata,validata=partdata.splitWithProportion(0.50)    print ("Datos para Validacion:",len(validata))    print("Datos para Test:", len(tstdata))    print("Datos para Entrenamiento:", len(trndata))    treinadorSupervisionado = BackpropTrainer(n, dataset=trndata,momentum=0.1,verbose=True,weightdecay=0.01)     numeroDeEpocasPorPunto = 100    trnerr,valerr=treinadorSupervisionado.trainUntilConvergence(dataset=trndata,maxEpochs=numeroDeEpocasPorPunto)    max_anno = input.max(axis=0)[0]      min_anno = input.min(axis=0)[0]    max_precip = output.max()    min_precip = output.min()    print("El primer año de la serie temporal disponible es:", min_anno)    print("El ultimo año de la serie temporal disponible es:", max_anno)    print("La máxima precipitación registrada en la serie temporal es:", max_precip)    print("La mínima precipitación registrada en la serie temporal es:", min_precip)    fig1 = plt.figure()    ax1 = fig1.add_subplot(111)    plt.xlabel('número de épocas')      plt.ylabel(u'Error')      plt.plot(trnerr,'b',valerr,'r')    plt.show()    treinadorSupervisionado.trainOnDataset(trndata,50)    print(treinadorSupervisionado.totalepochs)    out=n.activateOnDataset(tstdata).argmax(axis=1)    print(percentError(out,tstdata))    out=n.activateOnDataset(tstdata)    out=out.argmax(axis=1)    salida=n.activateOnDataset(validata)    salida=salida.argmax(axis=1)    print(percentError(salida,validata))    print ('Pesos finales:', n.params)    #Parametros de la RNA:    for mod in n.modules:        print("Module:", mod.name)        if mod.paramdim > 0:            print("--parameters:", mod.params)        for conn in n.connections[mod]:            print("-connection to", conn.outmod.name)            if conn.paramdim > 0:                print("- parameters", conn.params)        if hasattr(n, "recurrentConns"):            print("Recurrent connections")            for conn in n.recurrentConns:                print("-", conn.inmod.name, " to", conn.outmod.name)                if conn.paramdim > 0:                    print("- parameters", conn.params)

这是运行代码后得到的图表:

Error vs Epochs

其中蓝色线条是训练误差,红色线条是验证误差。

这没有任何意义。我已经查看了其他问题,但我仍然不知道为什么会得到这样的结果。

我希望的结果是预测,例如,未来几年每个月的降雨量,例如2010年(该系列从1851年到2008年)。


回答:

在检查了您的数据集后,我注意到这是一个时间序列数据。通常在这种情况下,使用时间(月份和年份)作为特征效果并不好。

预测时间序列最常见的架构是RNN及其升级版本LSTM。在http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/上有一个关于使用Keras进行LSTM的很好的教程

我尝试使用您的数据集训练了一个LSTM(基于该教程),得到了更好的验证损失趋势:

loss chart

我训练了一个LSTM(100个epoch)来根据前12个月的数据预测降雨量:

...

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注