繁体   English   中英

在 Keras 中使用 LSTM 进行多元时间序列预测(关于未来数据)

[英]Multivariate time series forecasting with LSTMs in Keras (on future data)

所以我一直在使用 Keras 来预测多元时间序列。 该数据集是污染数据集。 第一列是我要预测的内容,其余 7 列是特征。 数据集可以在这里找到: https://github.com/sagarmk/Forecasting-on-Air-pollution-with-RNN-LSTM/blob/master/pollution.csv

所以我想做的是在没有“污染”列的测试集上执行以下代码。 假设有新的特征数据,但没有污染。 所以

  1. 如何在没有测试数据的情况下训练 model? (model.fit())
  2. 如果没有未来的污染数据,我如何预测新的污染数据? (模型。预测())

为了简单起见,最初可以将数据集拆分为训练和测试数据集,从测试数据集中删除“污染”列?

请参阅下面的简单代码。 这里我只是简单地导入和处理数据集。

import numpy as np
import pandas as pd
import matplotlib as plt
import seaborn as sns
import plotly.express as px

# Import data
dataset = pd.read_csv("pollution.csv")
dataset = dataset.drop(['date'], axis = 1)
label, layer = pd.factorize(dataset['wnd_dir'])
dataset['wnd_dir'] = pd.DataFrame(label)
dataset=dataset.fillna(dataset.mean())
dataset.head()

之后,我对数据集进行规范化。

from sklearn.preprocessing import MinMaxScaler

values = dataset.values
scaler = MinMaxScaler()
scaled = scaler.fit_transform(values)
scaled[0]

然后将归一化的数据转换为监督形式。

def to_supervised(dataset,dropNa = True,lag = 1):
    df = pd.DataFrame(dataset)
    column = []
    column.append(df)
    for i in range(1,lag+1):
        column.append(df.shift(-i))
    df = pd.concat(column,axis=1)
    df.dropna(inplace = True)
    features = dataset.shape[1]
    df = df.values
    supervised_data = df[:,:features*lag]
    supervised_data = np.column_stack( [supervised_data, df[:,features*lag]])
    return supervised_data

timeSteps = 2

supervised = to_supervised(scaled,lag=timeSteps)
pd.DataFrame(supervised).head()

现在数据集被分割和转换,以便 LSTM 网络可以处理它。

features = dataset.shape[1]
train_hours = round(dataset.shape[0]*0.7)
X = supervised[:,:features*timeSteps]
y = supervised[:,features*timeSteps]

x_train = X[:train_hours,:]
x_test = X[train_hours:,:]
y_train = y[:train_hours]
y_test = y[train_hours:]

print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)
#convert data to fit for lstm
#dimensions = (sample, timeSteps here it is 1, features )

x_train = x_train.reshape(x_train.shape[0], timeSteps, features)
x_test = x_test.reshape(x_test.shape[0], timeSteps, features)

print(x_train.shape,x_test.shape)

这里训练了 model

#define the model
from keras.models import Sequential
from keras.layers import Dense,LSTM

model = Sequential()
model.add( LSTM( 50, input_shape = ( timeSteps,x_train.shape[2]) ) )
model.add( Dense(1) )

model.compile( loss = "mae", optimizer = "adam")

history =  model.fit( x_train,y_train, validation_data = (x_test,y_test), epochs = 50 , batch_size = 72, verbose = 0, shuffle = False)
plt.pyplot.plot(history.history['loss'], label='train')
plt.pyplot.plot(history.history['val_loss'], label='test')
plt.pyplot.legend()
#plt.pyplot.yticks([])
#plt.pyplot.xticks([])
plt.pyplot.title("loss during training")
plt.pyplot.show()

最后我 plot 训练数据和测试数据。

y_pred = model.predict(x_test)
x_test = x_test.reshape(x_test.shape[0],x_test.shape[2]*x_test.shape[1])

inv_new = np.concatenate( (y_pred, x_test[:,-7:] ) , axis =1)
inv_new = scaler.inverse_transform(inv_new)
final_pred = inv_new[:,0]

plt.pyplot.figure(figsize=(20,10))
plt.pyplot.plot(dataset['pollution'])
plt.pyplot.plot([None for i in dataset['pollution']] + [x for x in final_pred])
plt.pyplot.show()

使用您的神经网络预测结果应该像下面的代码行一样简单。 传递与训练数据格式相同的新数据。

prediction = model.predict(features)

你有任何可以提供的代码吗? 你遇到了什么问题?

即,当“测试”数据集仅包含 8 个特征列而没有价格列时?

看起来你在问一个特征工程问题。 你真正的数据集在不同的列中有 nan 值,这使得预测失败,对吧?

在这种情况下,您可以采取常见的解决方案:

用 trainset 中对应列的中值/平均值填充 nan 值。

例如,您可以通过每种产品最近 14 天(聚合长度)价格的中位数/平均值来填充未来价格。

更新

在进行未来预测时,可能有很多特征只有历史(没有计划)。 在传统的机器学习中,如果你想预测一个依赖于所有特征的目标,你需要先预测这些特征的未来。

但是通过 LSTM,您可以一并进行预测,检查time_series#multi-output_models

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM