Python MLP赢得';t使用滑动窗口技术进行正确的预测

Python MLP赢得';t使用滑动窗口技术进行正确的预测,python,tensorflow,machine-learning,mlp,Python,Tensorflow,Machine Learning,Mlp,我需要使用MLP进行短期风速预测。培训似乎很好,还可以预测下面的单步值、图片和代码。 def create_dataset(df, interval=15, out=1, step=1, out_interval=15, sampling_rate=5): ''' single value output ''' dff = pd.DataFrame() if type(df) != pd.DataFrame: dff['val'] = df.reshape(-1)

我需要使用MLP进行短期风速预测。培训似乎很好,还可以预测下面的单步值、图片和代码。

def create_dataset(df, interval=15, out=1, step=1, out_interval=15, sampling_rate=5):
  '''
  single value output
  '''
  dff = pd.DataFrame()
  if type(df) != pd.DataFrame:
      dff['val'] = df.reshape(-1)
  else: dff = df
  xs, ys, yp = [], [], []
  for i in tqdm(range(0, len(dff)-(interval+out+out_interval), sampling_rate)):
      index = [idx for idx in range(i, i+interval, step)]
      x = dff.iloc[index].values.reshape(-1)
      y = dff.iloc[i+interval].values.reshape(-1)
      
      index = [idx for idx in range(i+interval, i+interval+out_interval, step)] 
      y_out = dff.iloc[index].values.reshape(-1)
      
      xs.append(x)
      ys.append(y)
      yp.append(y_out)
  return shuffle(np.array(xs), np.array(ys), np.array(yp))

data = test_df
scaler = MinMaxScaler(feature_range=(0,1))
scaled = pd.DataFrame()
scaled['AI_202_1_Anemomentr1'] = scaler.fit_transform(data).reshape(-1)
train_size = int(len(scaled)*0.8)
train, test = scaled.iloc[:train_size], scaled.iloc[train_size:]
xtrain, ytrain, _ = create_dataset(train)
xtest, ytest, yptest = create_dataset(test)
del _
num_neurons = [xtrain.shape[1]]
hists = {}
predicts = {}
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
for num in num_neurons:
  print('neurons: ', num)
  model = Sequential()
  model.add(Dense(num, activation='sigmoid', input_dim=xtrain.shape[1]))
  model.add(Dense(16, activation='sigmoid'))
  model.add(Dense(1))
  model.compile(loss='mse', optimizer=optimizers.SGD(momentum=0.9))
  
  his = model.fit(xtrain, ytrain,
                 batch_size=32,
                 epochs=35,
                 shuffle=True,
                 validation_split=0.2,
                 callbacks=[early_stopping],
                 verbose=0)
  hists[str(num)] = his.history
  
  prediction = model.predict(xtest)
  predicts[str(num)] = prediction

inv_yhat = scaler.inverse_transform(predicts[k])
inv_ytest = scaler.inverse_transform(ytest)
inv_xtest = scaler.inverse_transform(xtest)

i=int(random.uniform(0, len(ytest)))

preds = []
interval = xtest[i]

for _ in range(15):
  y = model.predict(interval.reshape(1, -1))[0][0]
  interval = np.append(interval[1:], y)
  preds.append(y)

predicted = scaler.inverse_transform(np.array(preds).reshape(-1, 1))
actual = scaler.inverse_transform(yptest[i].reshape(-1, 1))

concat_predicted = [np.nan]*(len(inv_xtest[i])-1) + [inv_xtest[i][-1]] + predicted.reshape(-1).tolist()
concat_actual = [np.nan]*(len(inv_xtest[i])-1) + [inv_xtest[i][-1]] + actual.reshape(-1).tolist()

plt.figure(figsize=(15,7))
plt.plot(inv_xtest[i], color='tab:blue', label='past')
plt.plot(concat_predicted, color='red', label='predicted', marker='o')
plt.plot(concat_actual, color='blue', label='actual', marker='o')
plt.legend()
plt.show()
图片:


网络似乎总是输出上升序列。Courius的事实是,当我在序列的最开始添加预测值时,就像下面这样,突然网络似乎输出了某种精确的值,我不知道为什么。谁能解释一下是怎么回事,因为我觉得第一种方法更正确。
for _ in range(15):
    y = model.predict(interval.reshape(1, -1))[0][0]
    interval = np.append(y, interval[:-1])
    preds.append(y)