时间序列数据lstm
时间: 2025-01-09 19:47:27 浏览: 3
### 使用LSTM进行时间序列数据分析的方法
#### 准备工作
为了使用长短期记忆模型(LSTM)处理时间序列数据,需先安装必要的库。通常情况下会用到`numpy`, `pandas`用于数据操作以及`tensorflow.keras`中的模块构建和训练神经网络。
```bash
pip install numpy pandas tensorflow matplotlib scikit-learn
```
#### 导入所需库并加载数据集
下面展示了一个简单的例子,其中包含了导入所需的Python包、读取CSV文件格式的数据集,并将其转换成适合输入给LSTM模型的形式。
```python
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
import matplotlib.pyplot as plt
# 加载数据
dataframe = pd.read_csv('airline-passengers.csv', usecols=[1], engine='python')
dataset = dataframe.values.astype('float32')
# 归一化/标准化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(dataset)
def create_dataset(data, look_back=1):
dataX, dataY = [], []
for i in range(len(data)-look_back-1):
a = data[i:(i+look_back), 0]
dataX.append(a)
dataY.append(data[i + look_back, 0])
return np.array(dataX), np.array(dataY)
look_back = 1
train_size = int(len(scaled_data) * 0.67)
test_size = len(scaled_data) - train_size
train, test = scaled_data[0:train_size,:], scaled_data[train_size:len(scaled_data),:]
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# 调整输入形状以适应LSTM的要求 [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
print(f'Train set shape {trainX.shape}, Test set shape {testX.shape}')
```
这段代码展示了如何准备航空乘客数量的时间序列数据作为LSTM模型的输入[^5]。
#### 构建与编译LSTM模型
接下来定义一个具有单层LSTM单元的简单回归模型结构,并完成其配置过程:
```python
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
```
这里创建了一个包含四个隐藏状态的记忆细胞组成的单一层次LSTM网络,并通过密集连接层映射回输出维度。损失函数选择了均方误差(MSE),优化器选用了Adam算法[^3]。
#### 训练评估及可视化结果
一旦完成了上述设置之后就可以开始训练这个模型了。训练完成后还可以绘制图表来直观地比较实际值同预测值得差异情况:
```python
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])
plt.plot(scaler.inverse_transform(scaled_data))
plt.plot(np.arange(look_back,len(trainPredict)+look_back),trainPredict[:,0],'r')
plt.plot(np.arange(len(trainY)+(look_back*2)+1,len(scaled_data)-1),(testPredict[:,0]),'g')
plt.show()
# 打印最终MSE得分
for name,value in zip(['Train Score','Test Score'],
[(np.mean((trainY[0]-trainPredict[:,0])**2)),
(np.mean((testY[0]-testPredict[:,0])**2))]):
print('%s: %.2f MSE (%.2f RMSE)' % (name, value, np.sqrt(value)))
```
以上就是基于LSTM实现时间序列预测的基本流程介绍[^4]。
阅读全文