使用LSTM算法预测交通流量 – Python代码实现

使用LSTM算法预测交通流量 - Python代码实现

在交通领域,预测交通流量的变化对于优化交通系统和缓解交通拥堵至关重要。本文将介绍使用LSTM算法构建时间序列多变量模型,对交通流量进行预测,并给出Python代码实现。

首先,我们需要准备数据集。这里使用了一个包含交通流量、天气、时间等多个变量的数据集。具体可以从以下链接中下载:

https://github.com/llSourcell/LSTM_Networks/blob/master/data/interpolated_traffic_2017.csv

接下来,我们读取数据并进行预处理。由于本文重点在于LSTM算法的应用,故以下代码只展示数据预处理部分。

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 读取数据
df = pd.read_csv('interpolated_traffic_2017.csv', index_col=0)

# 去掉不需要的列
df.drop(['city_id', 'year', 'month', 'day'], axis=1, inplace=True)

# 对时间进行处理
df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index('datetime', inplace=True)

# 归一化数据
scaler = MinMaxScaler()
data = scaler.fit_transform(df.values)

接下来,我们构建基于LSTM算法的时间序列多变量模型,并对数据集进行训练和测试。

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

# 定义LSTM模型
model = Sequential()
model.add(LSTM(64, input_shape=(None, data.shape[1]), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# 准备数据
X_train, X_test, y_train, y_test = [], [], [], []
for i in range(30, len(data)):
    X_train.append(data[i-30:i, :])
    y_train.append(data[i, 0])
for i in range(len(data)-30, len(data)):
    X_test.append(data[i-30:i, :])
    y_test.append(data[i, 0])
X_train, X_test = np.array(X_train), np.array(X_test)
y_train, y_test = np.array(y_train), np.array(y_test)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], X_train.shape[2]))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], X_test.shape[2]))

# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32)

# 测试模型
train_preds = model.predict(X_train)
test_preds = model.predict(X_test)
train_preds = scaler.inverse_transform(train_preds)
y_train = scaler.inverse_transform([y_train])
test_preds = scaler.inverse_transform(test_preds)
y_test = scaler.inverse_transform([y_test])

最后,我们可以使用可视化工具对预测结果进行展示。以下代码将训练和测试集的真实值和预测值进行可视化。

import matplotlib.pyplot as plt

# 可视化训练集
train_data = df.iloc[30:len(train_preds)+30, :]
train_data['predictions'] = train_preds
plt.figure(figsize=(16, 6))
plt.plot(train_data.index, train_data['value'], label='true values')
plt.plot(train_data.index, train_data['predictions'], label='predicted values')
plt.title('Training Set')
plt.xlabel('Date')
plt.ylabel('Traffic Volume')
plt.legend()
plt.show()

# 可视化测试集
test_data = df.iloc[len(train_preds)-30:, :]
test_data['predictions'] = test_preds
plt.figure(figsize=(16, 6))
plt.plot(test_data.index, test_data['value'], label='true values')
plt.plot(test_data.index, test_data['predictions'], label='predicted values')
plt.title('Testing Set')
plt.xlabel('Date')
plt.ylabel('Traffic Volume')
plt.legend()
plt.show()

tle(‘Testing Set’)
plt.xlabel(‘Date’)
plt.ylabel(‘Traffic Volume’)
plt.legend()
plt.show()

通过以上步骤,我们可以得到LSTM算法预测交通流量的结果。读者可以通过修改数据集和调整模型参数来寻找更好的预测效果。