这是我第一次使用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)
这是运行代码后得到的图表:
其中蓝色线条是训练误差,红色线条是验证误差。
这没有任何意义。我已经查看了其他问题,但我仍然不知道为什么会得到这样的结果。
我希望的结果是预测,例如,未来几年每个月的降雨量,例如2010年(该系列从1851年到2008年)。
回答:
在检查了您的数据集后,我注意到这是一个时间序列数据。通常在这种情况下,使用时间(月份和年份)作为特征效果并不好。
预测时间序列最常见的架构是RNN及其升级版本LSTM。在http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/上有一个关于使用Keras进行LSTM的很好的教程
我尝试使用您的数据集训练了一个LSTM(基于该教程),得到了更好的验证损失趋势:
我训练了一个LSTM(100个epoch)来根据前12个月的数据预测降雨量:
...