Python 3.x 多层感知器预测

Python 3.x 多层感知器预测,python-3.x,keras,deep-learning,forecasting,mlp,Python 3.x,Keras,Deep Learning,Forecasting,Mlp,我需要一个MLP神经网络预测的帮助。我用keras实现了该网络,并用每月一次的太阳黑子数据集对其进行了训练: inputs = Input(shape=(look_back,)) inner = Dense(64)(inputs) inner = Activation("relu")(inner) inner = Dense(32)(inputs) inner = Activation("relu")(inner) inner = Dense(16)(inputs) inner = Activa

我需要一个MLP神经网络预测的帮助。我用keras实现了该网络,并用每月一次的太阳黑子数据集对其进行了训练:

inputs = Input(shape=(look_back,))
inner = Dense(64)(inputs)
inner = Activation("relu")(inner)
inner = Dense(32)(inputs)
inner = Activation("relu")(inner)
inner = Dense(16)(inputs)
inner = Activation("relu")(inner)
outputs = Dense(1)(inner)
outputs = Activation("linear")(outputs)
#outputs = ReLU(max_value=max_range)(outputs)
mlp_model = Model(inputs=inputs, outputs=outputs)
mlp_opt  = Adam(lr=0.001)
mlp_model.compile(mlp_opt, loss="mean_squared_error")
mlp_history = mlp_model.fit(X_train, y_train, epochs=100, verbose=2, validation_data=(X_test, y_test), shuffle=False, batch_size=1)
根据这一结果:

列车评分:0.00毫秒(0.06 RMSE)
测试分数:0.01毫秒(0.08 RMSE)

然后我绘制了序列集和测试集,结果良好:

问题是当我尝试使用新数据进行预测时。我创建了一个函数,用窗口方法从种子计算样本。这就是功能:

def forward(model, seed_start, steps=3, lib="keras"):
  assert seed_start.shape[0] == 1, "Insert only one element"
  predictions = []
  series = []
  seed_start = seed_start.copy()

  def shift_array(array, nb_pos=1, default_value="NaN", fill=True):
    indexes = list(np.arange(nb_pos))
    new_arr = []
    for index, element in enumerate(array):
      if(index in indexes):
        pass
      else:
        new_arr.append(element)
    if(fill is True):
      while(len(new_arr) < len(array)):
        new_arr.append(default_value)
    return new_arr

  if(len(seed_start.shape) == 3):
    series.append(seed_start[0].reshape(1, -1)[0])
    #Hese is for recurrent newtorks
    for _ in range(steps):
      res = model.predict(seed_start)[0][0]
      sub_arr = seed_start[0].reshape(1, -1)[0]
      predictions.append([res])
      new_arr = shift_array(sub_arr)
      new_arr[len(new_arr) - 1] = res
      new_arr = np.array(new_arr)
      series.append(new_arr)
      new_arr = np.expand_dims(new_arr, axis=0)
      new_arr = np.expand_dims(new_arr, axis=2)
      seed_start = new_arr
  elif(len(seed_start.shape) == 2):
    #Here is for multilayer perceptron networks
    for i in range(steps):
      if(lib=="keras"):
        res = model.predict(seed_start)[0][0]
      elif(lib=="sklearn"):
        res = model.predict(seed_start)[0]
      else:
        print("lib not managed")
        return
      sub_arr = seed_start[0]
      predictions.append([res])
      new_arr = shift_array(sub_arr)
      new_arr[len(new_arr) - 1] = res
      new_arr = np.array(new_arr)
      series.append(new_arr)
      new_arr = np.expand_dims(new_arr, axis=0)
      seed_start = new_arr
  else:
    print("Dimension not managed")

  predictions = np.array(predictions)
  series = np.array(series)
  return predictions, series
def-forward(模型,种子启动,步骤=3,lib=“keras”):
断言seed_start.shape[0]==1,“仅插入一个元素”
预测=[]
系列=[]
seed\u start=seed\u start.copy()
def shift_数组(数组,nb_pos=1,默认值为“NaN”,fill=True):
索引=列表(np.arange(nb_pos))
新的_arr=[]
对于索引,枚举(数组)中的元素:
如果(索引中的索引):
通过
其他:
新数组追加(元素)
如果(填充为真):
while(len(new_arr)
该函数的示例如下所示:

seed=[[1,2,3]==>prediction=[4]
新种子=[[2,3,4]==>预测=[5]
等等

问题是预测收敛到一个唯一的值:

知道为什么吗?
谢谢大家的回复。

您是否考虑过改变您的车型结构?一般来说,具有密集连接层的多层感知器在时间序列分析方面并不好。相反,您可能希望使用LSTM层查看RNN。我想,当前网络的问题可能是,它正在根据前一个窗口中错误的预测进行预测。是的,我尝试了许多模型。MLP、LSTM、GRU、双向GRU,所有模型都给出了相同的问题。如果我们能找到问题,我可以在其他模型上扩展解决方案。