使用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算法预测交通流量的结果。读者可以通过修改数据集和调整模型参数来寻找更好的预测效果。