此博客适合刚刚入门LSTM的朋友学习,牛逼的朋友请略过,哈哈。。。
github路径:
https://github.com/zhouliping3712/LSTM_Times_Series
一、LSTM简介:
Long Short Term Memory(LSTM):长短时记忆神经网络,是一种特殊的循环神经网络(RNN),优势在于解决RNN的梯度消失和梯度爆炸的问题,目前广泛应用于序列数据处理和预测,比如文本上下文感情分析,股票预测等;
循环神经网络与多层感知机不同的地方是上个神经元的输出是下一个神经元的输入,但是随着重复模块越来越多,权重W若很小,则使得第一个神经元的信息就会在权重W相乘之后出现特别小的值,因会使得第一个模块的信息失真,同理若权重W很大,则会使得第一个模块的输出覆盖住所有的信息,也会使得信息失真。而LSTM模型与普通的RNN不同之处就是重复模块加入门的概念,门可以对上一个输出进行选择是否忘记,从数学上听说反向传播导数是一个常数,所以能够保证每个模块的信息能够被记住;
RNN重复模块
LSTM重复模块
二、LSTM环境的配置
本文是基于Keras建立LSTM模型,具体安装可以参照下面的步骤:
深度学习开源框架Keras:是一种高层神经网络,采用Tensorflow或者Theano或者CNTK作为后端,优点就是建模容易。 安装依赖:Scipy,Numpy,Pandas,Scikit-Learn,Tensorflow 安装过程:
安装Anoconda之后,不同操作系统不同的安装方法;
1. 基于linux环境安装TensorFlow和Keras
- conda create -n tensorflow python=3.6.6
- conda install TensorFlow
- pip install keras -U --pre
2. 基于win7:
- 开始运行处找到cmd,以管理者的身份运行
- pip install tensoflow 3.pip install keras
三、实例讲解:(初学者最喜欢的部分了,哈哈哈、、、)
# coding: utf-8
# In[4]:
import numpy as np #数组模块;
from matplotlib import pyplot as plt #绘图模块;
from pandas import read_csv #导入CSV文件成dataframe结构;
import math #导入数学模块,计算均方根差使用;
from keras.models import Sequential #引入Kears模块的序列模型,此模型是将所有层线性叠加;
from keras.layers import Dense #输出层使用全连接层;
from keras.layers import LSTM #引入LSTM层;
from sklearn.preprocessing import MinMaxScaler #数据标准化
from sklearn.metrics import mean_squared_error #均方根差,矩阵计算;
seed = 7 #随机种子
batch_size = 10 #每批过神经网络的大小;
epochs = 100 #神经网络训练的轮次
filename = 'cases.csv' #数据文件,两列,一列是时间,另外一列是每天的进件量数据;
look_back=1 #时间窗口,步长为1,即用今天预测明天;
#此函数的目的是将输入的每日的进件量数据作为输入和输出,Y是X的下一个输出;
def create_dataset(dataset):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
x = dataset[i: i + look_back, 0]
dataX.append(x)
y = dataset[i + look_back, 0]
dataY.append(y)
print('X: %s, Y: %s' % (x, y))
return np.array(dataX), np.array(dataY)
#隐藏层4个,input_shape是输入数据格式,LSTM 层输入格式: 为矩阵,矩阵内容 [ samples, time steps, features ] samples:观测值,time steps:对于给定的观测值,给定变量有单独的时间步--就是时间窗口 features:在得到观测值的时刻,观测到的单独的 measures--就是列数(属性个数) ;
def build_model():
model = Sequential()
model.add(LSTM(units=4, input_shape=(1, look_back)))
model.add(Dense(units=1)) #输出层采用全连接层;
model.compile(loss='mean_squared_error', optimizer='adam') #损失函数是均方差,优化器是采用adam;
return model
# 设置随机种子,目的是使得可以复现神经网络训练的结果;
np.random.seed(seed)
# 导入数据
data = read_csv(filename, usecols=[1], engine='python', skipfooter=footer)
dataset = data.values.astype('float32')
# 标准化数据
scaler = MinMaxScaler()
dataset = scaler.fit_transform(dataset)
train_size = int(len(dataset) * 0.67) #训练数据
validation_size = len(dataset) - train_size #测试数据
train, validation = dataset[0: train_size, :], dataset[train_size: len(dataset), :]
# 创建dataset,让数据产生相关性
X_train, y_train = create_dataset(train)
X_validation, y_validation = create_dataset(validation)
# 将输入转化成为【sample, time steps, feature]
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_validation = np.reshape(X_validation, (X_validation.shape[0], 1, X_validation.shape[1]))
# 训练模型
model = build_model()
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, )
# 模型预测数据
predict_train = model.predict(X_train)
predict_validation = model.predict(X_validation)
# 反标准化数据 --- 目的是保证MSE的准确性
predict_train = scaler.inverse_transform(predict_train)
y_train = scaler.inverse_transform([y_train])
predict_validation = scaler.inverse_transform(predict_validation)
y_validation = scaler.inverse_transform([y_validation])
# 评估模型
train_score = math.sqrt(mean_squared_error(y_train[0], predict_train[:, 0]))
print('Train Score: %.2f RMSE' % train_score)
validation_score = math.sqrt(mean_squared_error(y_validation[0], predict_validation[:, 0]))
print('Validatin Score: %.2f RMSE' % validation_score)
# 构建通过训练集进行预测的图表数据
predict_train_plot = np.empty_like(dataset)
predict_train_plot[:, :] = np.nan
predict_train_plot[look_back:len(predict_train) + look_back, :] = predict_train
# 构建通过评估数据集进行预测的图表数据
predict_validation_plot = np.empty_like(dataset)
predict_validation_plot[:, :] = np.nan
predict_validation_plot[len(predict_train) + look_back * 2 + 1:len(dataset) - 1, :] = predict_validation
# 图表显示
dataset = scaler.inverse_transform(dataset)
plt.plot(dataset, color='blue')
plt.plot(predict_train_plot, color='green')
plt.plot(predict_validation_plot, color='red')
plt.show()
四、结果:
Train Score: 335.16 RMSE Validatin Score: 795.68 RMSE
预测与实际值误差的百分比变化;
五、模型优化方向:
增加训练的轮次epoch
增加隐藏层层数units
修改激活函数
修改时间窗口look_back
采用many to one的形式,利用细胞状态;
六、参考资料(感谢各位大神的贡献):
https://blog.csdn.net/omnispace/article/details/78415204
https://www.cnblogs.com/arkenstone/p/5794063.html
http://deeplearning.net/tutorial/lstm.html
https://blog.csdn.net/vbskj/article/details/71713204
https://blog.csdn.net/pipixiu/article/details/81001599 : 航空乘客预测
https://www.evolutionarylearn.com/paper/lstm-review-ts/:最全资料
http://blog.itpub.net/31509949/viewspace-2213894/
https://java.ctolib.com/article/wiki/73805
https://www.helplib.com/GitHub/article_134582
http://inspiratron.org/blog/2018/01/10/predicting-stock-prices-using-recurrent-neural-networks/
https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/ 香皂预测
https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/
https://blog.csdn.net/iyangdi/article/details/77881755
https://blog.csdn.net/liangyingyi1006/article/details/79240826
https://blog.csdn.net/omnispace/article/details/78415204
https://blog.csdn.net/zxhm001/article/details/75578011
https://www.douban.com/group/topic/116413218/
https://blog.csdn.net/a398942089/article/details/51648042
https://blog.csdn.net/mylove0414/article/details/56969181
https://blog.csdn.net/u010159842/article/details/56016137
https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/78463811空气污染
https://blog.csdn.net/u010412858/article/details/76153000
http://www.cnblogs.com/welhzh/p/6857409.html