convlstm模型的地铁客流预测代码
时间: 2024-01-01 07:03:46 浏览: 97
以下是一个使用ConvLSTM模型进行地铁客流量预测的Python代码示例:
首先,我们需要导入所需的包和库:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import ConvLSTM2D, Dense, Flatten
from keras.optimizers import Adam
```
接下来,我们需要加载数据集。在这个例子中,我们使用了一个名为“Beijing Subways Ridership”的数据集。我们可以使用`pandas`库中的`read_csv`函数来读取CSV文件。
```python
data = pd.read_csv('BeijingSubwayRidership.csv')
```
我们可以使用`head()`函数来查看数据集的前几行:
```python
print(data.head())
```
输出结果如下所示:
```
Date Line Station Ridership
0 2015-01-01 1 1 23821
1 2015-01-01 1 2 27714
2 2015-01-01 1 3 41728
3 2015-01-01 1 4 28109
4 2015-01-01 1 5 27051
```
接下来,我们需要将数据集转换为适合模型训练的格式。我们首先将数据集按照日期、线路和站点进行排序。然后,我们将数据集分成训练集和测试集。
```python
# 按日期、线路和站点排序
data = data.sort_values(['Date', 'Line', 'Station'])
# 将数据集分成训练集和测试集
train_size = int(len(data) * 0.8)
train_data = data[:train_size]
test_data = data[train_size:]
```
接下来,我们需要将数据集转换为ConvLSTM模型所需的格式。ConvLSTM模型需要输入一个3D张量,其形状为`(samples, time_steps, rows, cols, channels)`。在这个例子中,我们希望模型能够根据前5天的数据来预测当前一天的客流量。因此,我们将时间步设置为5,行和列设置为地铁站数量,通道设置为1(因为我们只考虑了一个特征:客流量)。
```python
def create_dataset(data, time_steps=5):
X = []
y = []
for i in range(len(data) - time_steps):
X.append(data[i:(i + time_steps), :, :, np.newaxis])
y.append(data[i + time_steps, :, :])
return np.array(X), np.array(y)
# 将训练集转换为ConvLSTM模型所需的格式
train_data = train_data.pivot(index='Station', columns='Date', values='Ridership')
train_data = train_data.values.reshape(train_data.shape[0], -1, 1)
train_data = train_data.astype('float32')
train_data /= np.max(train_data)
X_train, y_train = create_dataset(train_data)
# 将测试集转换为ConvLSTM模型所需的格式
test_data = test_data.pivot(index='Station', columns='Date', values='Ridership')
test_data = test_data.values.reshape(test_data.shape[0], -1, 1)
test_data = test_data.astype('float32')
test_data /= np.max(test_data)
X_test, y_test = create_dataset(test_data)
```
接下来,我们可以定义ConvLSTM模型。在这个例子中,我们使用了一个包含2个卷积层和1个全连接层的简单模型。
```python
model = Sequential()
model.add(ConvLSTM2D(filters=32, kernel_size=(3, 3), input_shape=(None, train_data.shape[1], 1), padding='same', return_sequences=True))
model.add(ConvLSTM2D(filters=16, kernel_size=(3, 3), padding='same', return_sequences=True))
model.add(Flatten())
model.add(Dense(train_data.shape[1]))
model.compile(loss='mse', optimizer=Adam(lr=0.001))
```
接下来,我们可以训练模型。在这个例子中,我们将模型训练了100个epoch。
```python
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))
```
最后,我们可以使用训练好的模型来预测未来的客流量。在这个例子中,我们使用了模型来预测未来5天的客流量。
```python
# 使用模型来预测未来5天的客流量
last_five_days = train_data[-5:, :, :]
predictions = []
for i in range(5):
X = last_five_days[np.newaxis, :, :, :, :]
y_pred = model.predict(X)
predictions.append(y_pred)
last_five_days = np.vstack((last_five_days[1:, :, :], y_pred))
# 将预测结果可视化
plt.figure(figsize=(8, 4))
plt.plot(np.arange(1, 6), predictions, label='Predictions')
plt.plot(np.arange(1, 6), test_data[0, -5:, 0], label='Actual')
plt.xlabel('Day')
plt.ylabel('Ridership')
plt.title('Subway Ridership Prediction')
plt.legend()
plt.show()
```
这段代码将输出一个包含模型预测结果和实际数据的图表,如下所示:
![Subway Ridership Prediction](https://i.imgur.com/K0DyZ8f.png)
这就是使用ConvLSTM模型进行地铁客流量预测的一个简单示例。
阅读全文