GRU模型交通量预测实例及代码
时间: 2024-01-26 17:02:21 浏览: 103
以下是一个使用GRU模型进行交通量预测的简单实例和代码。这个示例使用了纽约市的交通数据,但是可以轻松地用其他城市的数据进行修改。
### 数据准备
首先,我们需要从网上下载纽约市的交通数据。这里我们使用的是2015年的数据,可以在这里下载:https://www.kaggle.com/crailtap/station-data-and-hourly-ridership-for-nyct
我们使用pandas库来读取数据,并将其转换为适合GRU模型的格式。
```python
import pandas as pd
import numpy as np
#读取数据
df = pd.read_csv("ridership.csv")
#选择我们需要的列
df = df[["stationname", "linename", "division", "date", "hour", "entries"]]
#将数据按日期和小时聚合
df = df.groupby(["stationname", "linename", "division", "date", "hour"]).sum().reset_index()
#将日期和小时合并成一个时间戳
df["datetime"] = pd.to_datetime(df["date"] + " " + df["hour"].astype(str) + ":00:00")
#将数据按时间排序
df = df.sort_values(["datetime"])
#创建一个新的DataFrame,其中每一行包含一个车站的所有进入人数和时间戳
stations = df["stationname"].unique()
data = pd.DataFrame(columns=["datetime"] + list(stations))
for i, station in enumerate(stations):
data[station] = df[df["stationname"] == station].reset_index(drop=True)["entries"]
data["datetime"] = df[df["stationname"] == stations[0]].reset_index(drop=True)["datetime"]
#将数据按时间戳排序,并将缺失值填充为0
data = data.sort_values(["datetime"])
data = data.fillna(0)
#将数据转换为numpy数组
data = data.drop("datetime", axis=1).values
```
### 数据预处理
在输入模型之前,我们需要对数据进行预处理。具体来说,我们需要进行以下步骤:
1. 将数据划分为训练集和测试集
2. 标准化数据
3. 创建输入和输出序列
```python
#将数据划分为训练集和测试集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train_data, test_data = data[0:train_size,:], data[train_size:len(data),:]
#标准化数据
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
train_data = scaler.fit_transform(train_data)
test_data = scaler.transform(test_data)
#创建输入和输出序列
def create_dataset(dataset, look_back=1):
X, Y = [], []
for i in range(len(dataset)-look_back):
X.append(dataset[i:(i+look_back), :])
Y.append(dataset[i+look_back, 0])
return np.array(X), np.array(Y)
look_back = 24*7 #使用前一周的数据进行预测
train_X, train_Y = create_dataset(train_data, look_back)
test_X, test_Y = create_dataset(test_data, look_back)
```
### 定义模型
现在我们可以定义GRU模型了。这里我们使用Keras库来构建模型。我们使用了一个包含两个GRU层的堆叠模型,每个层都有128个节点。最后,我们使用一个具有单个节点的全连接层来输出预测值。
```python
from keras.models import Sequential
from keras.layers import Dense, Dropout, GRU
model = Sequential()
model.add(GRU(128, input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=True))
model.add(Dropout(0.2))
model.add(GRU(128))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
```
### 训练模型
有了模型和数据,我们现在可以训练模型。我们使用了一个批量大小为64的小批量梯度下降,训练了100个时期,并在每个时期结束时评估了模型的性能。
```python
history = model.fit(train_X, train_Y, epochs=100, batch_size=64, validation_data=(test_X, test_Y), verbose=2, shuffle=False)
```
### 模型评估
训练完成后,我们可以使用测试集来评估模型的性能。这里我们使用了均方根误差(RMSE)来评估模型的性能。
```python
from sklearn.metrics import mean_squared_error
test_predict = model.predict(test_X)
test_predict = np.reshape(test_predict, (test_predict.shape[0],))
rmse = np.sqrt(mean_squared_error(test_Y, test_predict))
print("RMSE:", rmse)
```
### 可视化结果
最后,我们可以将预测结果可视化,以便更好地理解模型的性能。这里我们使用matplotlib库来绘制预测值和实际值之间的比较。
```python
import matplotlib.pyplot as plt
plt.plot(test_Y)
plt.plot(test_predict)
plt.show()
```
完整代码如下:
阅读全文