在定义我的神经网络并训练我的模型后:
net = tflearn.input_data(shape=[None, 1, 1])tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0)net = tflearn.lstm(net, timesteps, dropout=0.8)net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm)net = tflearn.regression(net, optimizer='adam', learning_rate=0.001, loss='mean_square', metric='R2')# 定义模型model = tflearn.DNN(net, clip_gradients=0.)model.fit(X, y, n_epoch=nb_epoch, batch_size=batch_size, shuffle=False, show_metric=True)score = model.evaluate(X, y, batch_size=128)model.save('ModeSpot.tflearn')
我现在遇到了一个问题,我找到的大多数关于时间序列预测的教程都使用测试集来进行预测(他们将测试集传递给.predict())。问题是,在现实中我们并不知道这些,因为这是我们想要预测的内容。
目前我使用的是这个方法:
def forecast_lstm(model, X): X = X.reshape(len(X), 1, 1) yhat = model.predict(X) return yhat[0, 0]# 将数据分割成训练集和测试集 train, test = supervised_values[0:-10000], supervised_values[-10000:] # 转换数据的尺度 scaler, train_scaled, test_scaled = scale(train, test) # 构建神经网络 net = tflearn.input_data(shape=[None, 1, 1]) tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0) net = tflearn.lstm(net, 1, dropout=0.3) net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm) net = tflearn.regression(net, optimizer='adam', learning_rate=0.001, loss='mean_square', metric='R2') lstm_model = tflearn.DNN(net, clip_gradients=0.) lstm_model.load('ModeSpot.tflearn') # 预测整个训练数据集以建立预测状态 train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1) lstm_model.predict(train_reshaped) # 对测试数据进行逐步验证 predictions = list() error_scores = list() for i in range(len(test_scaled)): # 进行一步预测 X, y = test_scaled[i, 0:-1], test_scaled[i, -1] yhat = forecast_lstm(lstm_model, X) # 反转缩放 yhat2 = invert_scale(scaler, X, yhat) # 反转差分 yhat3 = inverse_difference(raw_values, yhat2, len(test_scaled) + 1 - i) # 存储预测结果 predictions.append(yhat3)
但这只适用于我的测试集。我该如何预测接下来的x个值?我记得在某处看到过,要预测时间T的值,我需要使用时间T-1的值进行预测(然后用T的值预测T+1的值,依此类推,直到达到我想要的预测数量)。这是个好方法吗?
我尝试过这样做:
def forecast_lstm2(model, X): X = X.reshape(-1, 1, 1) yhat = model.predict(X) return yhat[0, 0]test = list()X, y = train_scaled[0, 0:-1], train_scaled[0, -1]test.append(X)for i in range(len(test_scaled)): # 进行一步预测 yhat = forecast_lstm2(lstm_model, test[i]) test.append(yhat) # 反转缩放 yhat2 = invert_scale(scaler, test[i+1], yhat) # 反转差分 yhat3 = inverse_difference(raw_values, yhat2, len(test) + 1 - i) # 存储预测结果 predictions.append(yhat3)
但这并没有达到预期的效果(在一些预测之后,它总是给出相同的结果)。
感谢您的关注和时间。
回答:
最后,这似乎有效:# 进行一步预测 def forecast_lstm2(model, X): X = X.reshape(-1, 1, 1) yhat = model.predict(X) return yhat[0, 0]
def prediction(spotId): epoch = [5, 15, 25, 35, 45, 50, 100] for e in epoch: tf.reset_default_graph() # 加载CSV文件,指示第一列代表标签 data = read_csv('nowcastScaled'+str(spotId)+'.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # 转换数据为平稳数据 raw_values = data.values diff_values = difference(raw_values, 1) # 转换数据为监督学习 supervised = timeseries_to_supervised(diff_values, 1) supervised_values = supervised.values # 将数据分割成训练集和测试集(我从Excel文件中移除了测试数据) train = supervised_values[x:] # 转换数据的尺度(并移除了与测试集相关的所有内容) scaler, train_scaled = scale(train) # 构建神经网络 net = tflearn.input_data(shape=[None, 1, 1]) tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0) net = tflearn.lstm(net, 1, dropout=0.8) net = tflearn.fully_connected(net, 1, activation='linear', weights_init=tnorm) net = tflearn.regression(net, optimizer='adam', learning_rate=0.0001, loss='mean_square', metric='R2') lstm_model = tflearn.DNN(net, clip_gradients=0.) lstm_model.load('ModeSpot'+str(spotId)+'Epoch'+str(e)+'.tflearn') # 预测整个训练数据集以建立预测状态 train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1) lstm_model.predict(train_reshaped) # 对测试数据进行逐步验证 predictions = list() predictionFeeder = list() X, y = train_scaled[0, 0:-1], train_scaled[0, -1] predictionFeeder.append(X) for i in range(0, 10000): # 进行一步预测 yhat = forecast_lstm2(lstm_model, predictionFeeder[i]) predictionFeeder.append(yhat) # 反转缩放 yhat2 = invert_scale(scaler, predictionFeeder[i + 1], yhat) yhat3 = inverse_difference(raw_values, yhat2, 10000 + 1 - i) predictions.append(yhat3)