添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

对于较为简单的时间序列预测问题,可以使用Exponential Smoothing和ARIMA等传统模型非常方便地求解。然而,对于复杂的时间序列预测问题,LSTM不失为一种很好的选择。因此,本文旨在探讨如何利用LSTM神经网络求解时间序列预测问题。首先,需要明白时间序列预测问题是如何转换为传统的监督学习问题的,即时间窗方法。有关时间序列预测问题转换为监督学习的过程请移步: Time Series Forecasting as Supervised Learning

1.分析时间序列的特点

时间序列预测关键 :确定已有的时间序列的变化模式,并假定这种模式会延续到未来。下面首先介绍一下时间序列的一般特点,具体请移步: 时间序列分析和预测

(1)平稳序列(stationary series)
基本上不存在趋势的序列,序列中的各观察值基本上在某个固定的水平上波动,在不同时间段波动程度不同,但不存在某种规律,随机波动。

(2)非平稳序列(non-stationary series)
包含趋势、季节性或周期性的序列,只含有其中一种成分,也可能是几种成分的组合。可分为:有趋势序列、有趋势和季节性序列、几种成分混合而成的复合型序列。

趋势(trend):时间序列在长时期内呈现出来的某种持续上升或持续下降的变动,也称长期趋势。时间序列中的趋势可以是线性和非线性。

季节性(seasonality):季节变动(seasonal fluctuation),是时间序列在一年内重复出现的周期波动。销售旺季,销售淡季,旅游旺季、旅游淡季,因季节不同而发生变化。季节,不仅指一年中的四季,其实是指任何一种周期性的变化。含有季节成分的序列可能含有趋势,也可能不含有趋势。

周期性(cyclicity):循环波动,是时间序列中呈现出来的围绕长期趋势的一种波浪形或振荡式波动。

除此之外,还有偶然性因素对时间序列产生影响,致使时间序列呈现出某种随机波动。时间序列除去趋势、周期性和季节性后的偶然性波动,称为随机性(random),也称不规则波动(irregular variations)。

2.单变量时间序列预测

有关航班乘客流量预测问题的具体细节,请移步: 用 LSTM 做时间序列预测的一个小例子

问题 :航班乘客预测
数据 :1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000
下载地址
目标 :预测国际航班未来 1 个月的乘客数

Created on 2019年2月16日 时间序列预测问题可以通过滑动窗口法转换为监督学习问题 @author: Administrator import numpy import matplotlib.pyplot as plt from pandas import read_csv import math from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from sklearn.preprocessing import MinMaxScaler from sklearn.metrics import mean_squared_error from keras.utils.vis_utils import plot_model # 创建数据集 def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return numpy.array(dataX), numpy.array(dataY) if __name__ == '__main__': # 加载数据 dataframe = read_csv('international-airline-passengers.csv', usecols=[1], engine='python', skipfooter=3) dataset = dataframe.values # 将整型变为float dataset = dataset.astype('float32') # 数据处理,归一化至0~1之间 scaler = MinMaxScaler(feature_range=(0, 1)) dataset = scaler.fit_transform(dataset) # 划分训练集和测试集 train_size = int(len(dataset) * 0.67) test_size = len(dataset) - train_size train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] # 创建测试集和训练集 look_back = 1 trainX, trainY = create_dataset(train, look_back) #单步预测 testX, testY = create_dataset(test, look_back) # 调整输入数据的格式 trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, trainX.shape[1])) #(样本个数,1,输入的维度) testX = numpy.reshape(testX, (testX.shape[0], look_back, testX.shape[1])) # 创建LSTM神经网络模型 model = Sequential() model.add(LSTM(120, input_shape=(trainX.shape[1], trainX.shape[2]))) #输入维度为1,时间窗的长度为1,隐含层神经元节点个数为120 model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2) # 绘制网络结构 plot_model(model, to_file='E:/model.png', show_shapes=True); trainPredict = model.predict(trainX) testPredict = model.predict(testX) # 反归一化 trainPredict = scaler.inverse_transform(trainPredict) trainY = scaler.inverse_transform([trainY]) testPredict = scaler.inverse_transform(testPredict) testY = scaler.inverse_transform([testY]) # 计算得分 trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0])) print('Train Score: %.2f RMSE' % (trainScore)) testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0])) print('Test Score: %.2f RMSE' % (testScore)) trainPredictPlot = numpy.empty_like(dataset) trainPredictPlot[:, :] = numpy.nan trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict testPredictPlot = numpy.empty_like(dataset) testPredictPlot[:, :] = numpy.nan testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict plt.plot(scaler.inverse_transform(dataset)) plt.plot(trainPredictPlot) plt.plot(testPredictPlot) plt.show();

实验结果:

Using TensorFlow backend.
Epoch 100/100
 - 0s - loss: 0.0022
Train Score: 22.79 RMSE
Test Score: 50.42 RMSE

       注意,在进行数据处理时,将输入trainX改造为LSTM的输入格式,即[samples,timesteps,features]。

3.多变量时间序列预测

        有时,为了充分利用已有的信息,需要利用除了预测变量之外的其他若干个变量同时进行预测,即所谓的多变量时间序列预测。与单变量时间序列预测不同之处在于数据处理。

        例如,对于下述数据集:北京的美国大使馆在2010年至2014年共5年间每小时采集的天气及空气污染指数,其中包括日期、PM2.5浓度、露点、温度、风向、风速、累积小时雪量和累积小时雨量。

        在单变量时间序列预测中,数据通常被处理为下述格式:

   pollution(t-1)  pollution(t)
1   0.129779   0.148893
2   0.148893   0.159960
3   0.159960   0.182093
4   0.182093   0.138833
5   0.138833   0.109658

        然而,在多变量时间序列预测时,数据通常被处理为下述格式: 

   pollution(t-1)  dew(t-1)  temp(t-1)  press(t-1)  wnd_dir(t-1)  wnd_spd(t-1)  \
1   0.129779   0.352941   0.245902   0.527273   0.666667   0.002290
2   0.148893   0.367647   0.245902   0.527273   0.666667   0.003811
3   0.159960   0.426471   0.229508   0.545454   0.666667   0.005332
4   0.182093   0.485294   0.229508   0.563637   0.666667   0.008391
5   0.138833   0.485294   0.229508   0.563637   0.666667   0.009912
   snow(t-1)  rain(t-1)   pollution(t)
1   0.000000        0.0  0.148893
2   0.000000        0.0  0.159960
3   0.000000        0.0  0.182093
4   0.037037        0.0  0.138833
5   0.074074        0.0  0.109658

        多变量时间序列预测的具体实例请移步:基于Keras的LSTM多变量时间序列预测

        对于较为简单的时间序列预测问题,可以使用Exponential Smoothing和ARIMA等传统模型非常方便地求解。然而,对于复杂的时间序列预测问题,LSTM不失为一种很好的选择。因此,本文旨在探讨如何利用LSTM神经网络求解时间序列预测问题。首先,需要明白时间序列预测问题是如何转换为传统的监督学习问题的,即时间窗方法。有关时间序列预测问题转换为监督学习的过程请移步:Time ...
使用pytorch搭建的简LSTM变量多输出时间序列预测的使用例。 生成了多个以sinx、cosx、tanx构成的序列,使用[i:i+50]的数据预测[i+51]的数据。x是步长为0.1的等差数列 作者初学时用来当说明文档使用,程序适合初学者捣鼓,注释写的很详细了
变量变量时间序列预测 使用深度学习和浅层学习算法进行时间序列预测 Multivariate and Univariate Time Series Prediction Time Series Prediction by use of Deep learning and shallow learning algorithms
import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.models import Sequenti...
在看LSTM模型的时候有讲原理的有讲实现的,但是关于模型的应用总是存在一些困惑,特别是关于不同类型的时间预测。找了一片英文博客感觉讲的比较清晰,因此做一总结如下:从大的方面讲:变量LSTM模型、多变量LSTM模型、多步LSTM模型、多变量多步LSTM模型。 1.变量LSTM模型 1. 数据准备 故名思意,变量模型是输入的特征维度为1。其目标是根据过去的观测,来预测下一个观测点的值。假定时间序列为:[10, 20, 30, 40, 50, 60, 70, 80,...
LSTM案例的扩展思考 基于Python时间序列LSTM预测系列教程(4)~(5)中介绍的LSTM案例 是最简状态的LSTM,要得到优化的LSTM,需要进行很多扩展实验 1、Mini-Step预测 可以将预测变成n-time step的预测 2、Tune模型 至少tune下神经元个数和epoch的次数 在训练期间,通过回调进行早期停止,也可能获得好的结果
时间序列分析:时间序列表示基于时间顺序的一系列数据。 它可以是秒、分钟、小时、天、周、月、年。 未来的数据将取决于它以前的值。 在现实世界的案例中,我们主要有两种类型的时间序列分析—— 变量时间序列 多元时间序列 对于变量时间序列数据,我们将使用进行预测。 正如我们所见,只有一列,因此即将到来
1、内容概要:本资源将初步探究 LSTM 在股票市场的应用。通过使用LSTM对股票收益的预测,可以了解到:(1)如何将原始数据集转换为可用于时间序列预测的数据。(2)如何准备数据并使LSTM适合多变量时间序列预测问题。(3)如何进行预测并将结果重新调整回原始数据。 2、本资源适用于对量化交易感兴趣的学生学习实验参考使用。 3、资源内容主要包括:股票数据(20支).rar,LSTM实现对股票数据进行预测(Keras实现)源代码lstm_model.py(源码以600000.SH股票数据为基准进行分析,以2016年3月1日至2017年12月31日为回测期,进行收益率的预测模拟),2016年3月至2017年12月的股票回测模型损失和RMSE计算数据excel。
时间序列预测是机器学习中一个非常重要的问题,它可以在很多领域中被应用,例如股市预测、天气预测、交通流量预测等。传统上,时间序列预测通常使用一些经典的模型,比如ARIMA、VAR等。但是这些模型通常不能很好地处理多维(多变量)时间序列数据。 近年来,深度学习在时间序列预测中也取得了很好的效果。其中,CNN+BiLSTM+Attention是一种非常有效的模型。本文将介绍如何使用Keras实现这个模型。 1. 数据准备 我们使用一个公开数据集,其中包含了多个城市的气温、湿度、风速等信息。在这个数据集中,我们选择了北京市的气象数据。数据集下载链接:https://www.kaggle.com/cryptexcode/mpgdata。 首先,我们需要将数据集转化为多维时间序列数据。我们将每个城市的气象数据分别作为一个维度,时间作为另一个维度。为了方便处理,我们只选择了气温和湿度两个维度,共计2个维度。 我们使用Pandas库进行数据读取和处理。代码如下: ```python import pandas as pd import numpy as np # 读取数据 data = pd.read_csv('Beijing.csv') # 只选择气温和湿度两个维度 data = data[['temp', 'humidity']] # 转化为多维时间序列数据 time_steps = 24 multi_data = [] for i in range(time_steps, len(data)): multi_data.append(data[i-time_steps:i].values) multi_data = np.array(multi_data) # 划分训练集和测试集 train_size = int(len(multi_data) * 0.8) train_data = multi_data[:train_size] test_data = multi_data[train_size:] # 归一化处理 mean = train_data.mean(axis=0) std = train_data.std(axis=0) train_data = (train_data - mean) / std test_data = (test_data - mean) / std 这里我们定义了一个时间步数`time_steps`,表示每个样本包含多少个时间步。对于每个时间步,我们选择了气温和湿度两个维度。最后,我们对数据进行了归一化处理,这是为了方便模型的训练。 2. 模型搭建 下面我们来搭建模型。我们先使用CNN对每个维度的数据进行特征提取,然后使用BiLSTM对时序信息进行建模,最后使用Attention机制融合不同时刻的信息。代码如下: ```python from keras.models import Model from keras.layers import Input, Dense, Dropout, Conv1D, MaxPooling1D, LSTM, Bidirectional, Attention # 定义输入 input = Input(shape=(time_steps, 2)) # CNN进行特征提取 conv1 = Conv1D(filters=64, kernel_size=3, activation='relu')(input) maxpool1 = MaxPooling1D(pool_size=2)(conv1) conv2 = Conv1D(filters=64, kernel_size=3, activation='relu')(maxpool1) maxpool2 = MaxPooling1D(pool_size=2)(conv2) dropout1 = Dropout(0.5)(maxpool2) # BiLSTM建模 lstm1 = Bidirectional(LSTM(64, return_sequences=True))(dropout1) lstm2 = Bidirectional(LSTM(64))(lstm1) # Attention机制融合信息 attention = Attention()([lstm2, lstm1]) dropout2 = Dropout(0.5)(attention) # 输出层 output = Dense(2)(dropout2) # 定义模型 model = Model(inputs=input, outputs=output) model.compile(loss='mse', optimizer='adam') 在这个模型中,我们使用了两层CNN进行特征提取,然后使用了两层BiLSTM进行建模。最后,我们使用了Attention机制融合不同时刻的信息,得到最终的输出结果。模型使用了均方误差作为损失函数,使用了Adam优化器进行训练。 3. 模型训练 模型搭建完成后,我们可以开始进行模型训练。代码如下: ```python # 训练模型 history = model.fit(train_data, train_data, epochs=50, batch_size=64, validation_split=0.2) 这里我们使用了训练集作为输入和输出,进行无监督学习。模型训练完成后,我们可以使用测试集进行评估。代码如下: ```python # 测试模型 test_loss = model.evaluate(test_data, test_data) print('Test loss:', test_loss) 4. 结果分析 最后,我们可以使用matplotlib库将预测结果可视化。代码如下: ```python import matplotlib.pyplot as plt # 预测结果 pred_data = model.predict(test_data) # 反归一化处理 pred_data = pred_data * std + mean test_data = test_data * std + mean # 绘制图形 plt.figure(figsize=(10, 6)) plt.plot(pred_data[:, 0], label='Predicted Temp') plt.plot(test_data[:, 0], label='True Temp') plt.legend() plt.show() 这里我们只绘制了气温的预测结果。可以看到,我们的模型能够很好地拟合测试集的数据,并且预测结果与真实值非常接近。 在本文中,我们介绍了如何使用Keras实现CNN+BiLSTM+Attention的多维(多变量)时间序列预测模型。这个模型能够很好地处理多维时间序列数据,并且在气象数据集上取得了非常好的效果。