GRU模型交通量预测实例及代码
时间: 2023-06-20 15:08:37 浏览: 230
这里提供一个简单的GRU模型交通量预测实例及代码,使用Python和Keras框架。
1. 数据准备
首先需要准备交通量数据,这里我们使用台湾高速公路的交通数据。数据包括每日的车辆数、平均车速、平均车间距等信息,我们只使用每日的车辆数作为预测目标。
数据可以从以下网站下载:https://tisvcloud.freeway.gov.tw/history/TDCS/M08A/
2. 数据预处理
将数据读入后,我们需要进行预处理,包括归一化、划分训练集和测试集等。
```python
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# 读入数据
data = pd.read_csv('traffic_volume.csv', usecols=[1], engine='python', skipfooter=3)
# 归一化
scaler = MinMaxScaler(feature_range=(0, 1))
data = scaler.fit_transform(data)
# 划分训练集和测试集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data[0:train_size,:], data[train_size:len(data),:]
print(len(train), len(test))
```
3. 序列生成
在使用GRU模型进行预测时,需要将数据转换为序列形式。这里我们定义一个函数,输入数据和序列长度,输出序列数据和对应的标签数据。
```python
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
# 序列长度为7
look_back = 7
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
```
4. 构建GRU模型
使用Keras框架构建GRU模型。这里使用一个单层的GRU模型,输入为一个长度为7的序列,输出一个预测值。
```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, GRU
model = Sequential()
model.add(GRU(units=4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
```
5. 训练模型
将训练数据输入模型进行训练,迭代100次。
```python
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
```
6. 预测结果
使用训练好的模型对测试数据进行预测,并将预测结果和真实值进行比较。
```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])
# 计算RMSE
trainScore = np.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = np.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
```
完整代码如下:
```python
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, GRU
# 读入数据
data = pd.read_csv('traffic_volume.csv', usecols=[1], engine='python', skipfooter=3)
# 归一化
scaler = MinMaxScaler(feature_range=(0, 1))
data = scaler.fit_transform(data)
# 划分训练集和测试集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data[0:train_size,:], data[train_size:len(data),:]
print(len(train), len(test))
# 序列生成
def create_dataset(dataset, look_back=1):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(dataset[i + look_back, 0])
return np.array(dataX), np.array(dataY)
# 序列长度为7
look_back = 7
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# 构建GRU模型
model = Sequential()
model.add(GRU(units=4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
# 训练模型
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
# 预测结果
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])
# 计算RMSE
trainScore = np.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = np.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
```
注意:在实际应用中,需要根据具体情况调整模型参数,如序列长度、GRU单元数等。
阅读全文