LSTM简介
-
LSTM(Long Short-Term Memory)是一种特殊类型的循环神经网络(RNN),它在处理序列数据和时间序列数据时表现出色。
-
相比于传统的RNN,LSTM引入了记忆单元(memory cell)和门控机制(gate mechanism),以解决传统RNN中的梯度消失和梯度爆炸问题,从而更好地捕捉长期依赖关系。
-
LSTM的核心组件是记忆单元,它可以存储和访问信息,并通过门控机制来控制信息的流动。LSTM中的三种门控单元是:
输入门(Input Gate):控制是否将新输入信息添加到记忆单元中。 遗忘门(Forget Gate):控制记忆单元中的哪些信息需要被遗忘。 输出门(Output Gate):控制从记忆单元中读取哪些信息并输出。
这些门通过使用sigmoid激活函数来产生0到1之间的输出,表示信息的通过程度。
- LSTM在训练过程中可以学习到如何选择存储和遗忘信息,从而对输入序列建模并捕捉到长期依赖关系。
- 除了标准的LSTM,还有一些变种模型,如双向LSTM(Bidirectional LSTM)、多层LSTM(Multi-layer LSTM)和注意力机制LSTM(LSTM with Attention),它们进一步扩展了LSTM的能力和灵活性。
数据集简介
北京PM2.5数据集
下载数据集并将其放在当前工作目录中,文件名为 “ raw.csv ”。
这是一个报告了中国北京美国大使馆五年每个小时的天气和污染程度的数据集。
- No:行号
- year:这一行中的数据年份
- month:此行中的数据月份
- day:这一行中的数据日
- hour:此行中的小时数据
- pm2.5:PM2.5浓度
- DEWP:露点
- TEMP:温度
- PRES:压力
- cbwd:综合风向
- Iws:累计风速
- Is:累积下了几个小时的雪
- Ir:累积下了几个小时的雨
我们可以使用这些数据,并构建一个预测问题,在前一时刻的天气条件和污染情况下,我们预测下一个时刻的污染情况。
数据预处理
原始数据:
对原始数据处理:
from pandas import read_csv
from datetime import datetime
# 加载数据
def parse(x):
return datetime.strptime(x,'%Y %m %d %H')
dataset=read_csv('data/raw.csv',parse_dates=[['year','month','day','hour']],index_col=0,date_parser=parse)
dataset.drop('No',axis=1,inplace=True)
# 手动更改列名
dataset.columns=['pollution','dew','temp','press','wnd_dir','wnd_spd','snow','rain']
dataset.index.name='data'
# 把所有NA值用0替换
dataset['pollution'].fillna(0,inplace=True)
dataset=dataset[24:]
# 输出前五行
print(dataset.head(5))
# 保存到文件中
dataset.to_csv('pollution.csv')
对以上代码进行解释:
- 将日期 - 时间信息合并成一个日期 - 时间,以便我们可以将它用作Pandas的一个索引。
- “No”列被删除,"inplace=True"时,表示对原始对象进行就地修改,而不是创建一个新的对象。
- 为每列指定更清晰的名称。最后,将NA值替换为“0”值,并且将前24小时移除。
- 运行该示例将输出转换数据集的前5行,并将数据集保存为“ pollution.csv ”。
接下来查看我们的数据:
from pandas import read_csv
from matplotlib import pyplot
# 加载数据集
dataset=read_csv('data/pollution.csv',header=0,index_col=0)
values=dataset.values
# 指定要绘制的列
groups=[0,1,2,3,5,6,7]
i=1
# 绘制每一列
pyplot.figure()
for group in groups:
pyplot.subplot(len(groups),1,i)
pyplot.plot(values[:,group])
pyplot.title(dataset.columns[group],y=0.5,loc='right')
i+=1
pyplot.show()
多元LSTM预测模型
数据准备:
- 将数据集构造为监督学习问题并对输入变量进行归一化。
- 使用series_to_supervised()函数来转换数据集
# 将序列转换成监督学习问题
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
df = 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 = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
return agg
# 加载数据集
dataset = read_csv('pollution.csv'