lstm多变量预测

前言:

    由于工程项目需要使用lstm模型进行预测未来数天变化,所以使用lstm模型进行实验。由于项目是内部数据,所以使用公开数据集显示结果。参考的基础模型和数据集的地址在最底部。本篇先对基础模型进行简单的介绍。下一篇介绍调整之后的模型结构。下一篇地址:

lstm 预测未来多天_wh来啦的博客-CSDN博客https://blog.csdn.net/qq_52200688/article/details/121435352?spm=1001.2014.3001.5501

模型总体结构:

使用公开数据集:

Beijing PM2.5 Data Set

下载数据集地址:

http://archive.ics.uci.edu/ml/datasets/Beijing+PM2.5+Data

或者百度直接搜索Beijing PM2.5 Data Set,也可以找到数据集。

数据预处理:

  对数据进行清洗,得到可以使用的数据。数据清洗时需要根据数据本身的特点,进行针对性的清洗。

数据划分:

首先将数据划分为X,Y。代码如下:

def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
     # convert series to supervised learning
    	n_vars = 1 if type(data) is list else data.shape[1]
    	df = pd.DataFrame(data)
    	cols, names = list(), list()
    	# input sequence (t-n, ... t-1)
    	for i in range(n_in, 0, -1):
    		cols.append(df.shift(i))
    		names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    	# forecast sequence (t, t+1, ... t+n)
    	for i in range(0, n_out):
    		cols.append(df.shift(-i))
    		if i == 0:
    			names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
    		else:
    			names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    	# put it all together
    	agg = pd.concat(cols, axis=1)
    	agg.columns = names
    	# drop rows with NaN values
    	if dropnan:
    		agg.dropna(inplace=True)
    	return agg

选择需要预测的数据,这里选择预测变量1(var1)。代码如下:


def cs_to_sl():
    # load dataset
    dataset = pd.read_csv('pollution.csv', header=0, index_col=0)
    values = dataset.values
    # integer encode direction
    encoder = LabelEncoder()
    values[:,4] = encoder.fit_transform(values[:,4])
    # ensure all data is float
    values = values.astype('float32')
    # normalize features
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled = scaler.fit_transform(values)
    # frame as supervised learning
    reframed = series_to_supervised(scaled, 1, 1)
    # drop columns we don't want to predict
    reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)
    print(reframed.head())

然后将数据划分为训练集(train),测试集(test)。代码如下:

def train_test(reframed):
    # split into train and test sets
    values = reframed.values
    n_train_hours = 365 * 24
    train = values[:n_train_hours, :]
    test = values[n_train_hours:, :]
    # split into input and outputs
    train_X, train_y = train[:, :-1], train[:, -1]
    test_X, test_y = test[:, :-1], test[:, -1]
    # reshape input to be 3D [samples, timesteps, features]
    train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
    test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
    print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
    return train_X,train_y,test_X,test_y

构建模型并训练:

模型只有一层简单的lstm层

def fit_network(train_X,train_y,test_X,test_y,scaler):
    model = Sequential()
    model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
    model.add(Dense(1))
    model.compile(loss='mae', optimizer='adam')
    # fit network
    history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)
    # plot history
    pyplot.plot(history.history['loss'], label='train')
    pyplot.plot(history.history['val_loss'], label='test')
    pyplot.legend()
    pyplot.show()
    # make a prediction
    yhat = model.predict(test_X)
    test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))
    # invert scaling for forecast
    inv_yhat = concatenate((yhat, test_X[:, 1:]), axis=1)
    inv_yhat = scaler.inverse_transform(inv_yhat)
    inv_yhat = inv_yhat[:,0]
    # invert scaling for actual
    inv_y = scaler.inverse_transform(test_X)
    inv_y = inv_y[:,0]
    # calculate RMSE
    rmse = sqrt(mean_squared_error(inv_y, inv_yhat))
    print('Test RMSE: %.3f' % rmse)

下一篇将会讲述改进基础模型。改进之后,可以使模型接收多天的多变量的历史数据,预测一个变量在未来几天的值。

参考链接:

原文地址:https://machinelearningmastery.com/multi-step-time-series-forecasting-long-short-term-memory-networks-python/
翻译博客     浅笑古今
原文链接:https://blog.csdn.net/u012735708/article/details/82769711

  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在机器学习的领域中,自然语言处理和时间序列预测是重要的研究方向,而长短时记忆网络(LSTM)是处理时间序列数据的强大工具。PyTorch是一个流行的深度学习框架,它提供了便捷的方式来建立和训练LSTM模型,从而用于多变量预测。 多变量预测是指通过使用多个输入变量预测单个或多个输出变量。在时间序列预测中,多变量预测的例子包括预测股票价格、气象预测、交通流量预测等等。在这些应用中,我们需要考虑许多变量,从而使LSTM模型不仅能够捕捉时间序列数据中的长期依赖关系,而且能够从多个输入变量中学习相关性,从而更好地描述数据。 使用PyTorch实现LSTM变量预测是一个相对简单的过程,主要有以下几个步骤: 1. 数据准备:数据的预处理和归一化对于LSTM模型的预测效果至关重要。通过对数据进行标准化或缩放,可以使模型更好地学习数据的规律。 2. 搭建LSTM模型:利用PyTorch的nn.Module和nn.LSTM模块,可以定义具有单个或多个LSTM层的模型。 3. 训练模型:通过PyTorch中的优化器和损失函数,使用训练数据来训练LSTM模型。 4. 预测结果:使用训练好的LSTM模型对测试数据进行预测,并对预测结果进行后处理,如逆缩放或逆标准化,以得到最终的预测结果。 总之,PyTorch提供了快捷、高效的工具来实现LSTM变量预测,它的简单、直观的API使得数据科学家/分析师能够轻松地进行深度学习任务。在未来,LSTM变量预测有望得到更加广泛的应用与发展,从而改变我们对时间序列预测的理解和研究方向。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值