时间序列问题增加了输入变量之间的序列依赖性,这样大大提升了模型的复杂程度。LSTM是循环神经网络的一种,可以成功地训练架构非常复杂的深度学习模型,用于处理时间序列问题。
LSTM对输入数据的尺度十分敏感,特别是使用sigmoid(这是默认的)或者tanh作为激活函数的时候。
下面代码中使用Scikit-Learn中的MinMaxScaler预处理类对数据集进行归一化处理,将数据缩放到0——1。
LSTM的输入数据具有以下形式的特定阵列结构:[样本,时间步长,特征]。在create_dataset()函数中生成的数据集采用的是如下的形式:[样本,特征]。然后需要使用numpy.reshape()函数对数据集进行结构转换,转换时将每个样本作为一个时间步长。
这里构建一个具有单个神经元的输入层、具有4个LSTM存储单元的隐藏层,以及具有单个值预测的输出层的神经网络。LSTM存储单元采用的是默认的sigmoid激活函数。对网络训练100个epochs,并将batch_size设置为1。
例子来源于魏贞原老师的深度学习书籍。
"""
LSTM时间序列问题预测:国际旅行人数预测
"""
import numpy as np
from matplotlib import 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_s