基于LSTM-CNN的地铁短时客流量预测

本文以AFC系统中乘客进出站刷卡记录数据为基础并对进出站客流量进行预测,将神经网络与客流量时间与空间的分布特征相结合,能够有效地揭示轨道交通客流量的变化趋势。更进一步组合LSTM和CNN模型进行较为客观的客流量预测数据统计,并通过深度学习将预测结果应用于实践之中对轨道交通发车频次进行合理优化,制定准确的发车间隔,以提升轨道交通运行效率。本文将使用上海10号线原始客流数据,通过python中的numpy和pandas库进行数据清洗。通过CNN的特征提取和LSTM的短期预测得到短期客流预变化趋势。相关代码如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Reshape, Dropout, BatchNormalization
from tensorflow.keras.layers import LSTM, Conv1D, MaxPooling1D
from tensorflow.keras.optimizers import SGD

from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

data = pd.read_csv('all_day_data.csv')

def sample(name, state):
    if state=='in':
        stop_data_in = data[data['3'] == name][data['5']==0.0]
        series_in = pd.Series([1]*len(stop_data_in), index=pd.to_datetime(stop_data_in['1']))
        series_in = series_in.resample('10T').sum()
        df_allday = pd.DataFrame({'Time':series_in.index, 'freq':series_in.values})
        return df_allday
    
    elif state=='out':
        stop_data_out = data[data['3'] == name][data['5']!=0.0]
        series_out = pd.Series([1]*len(stop_data_out), index=pd.to_datetime(stop_data_out['1']))
        series_out = series_out.resample('10T').sum()
        df_allday = pd.DataFrame({'Time':series_out.index, 'freq':series_out.values})
        return df_allday
    

df = sample('10号线五角场', 'in')
s_date = pd.to_datetime('20150408')
df['Time'] = pd.to_datetime(df['Time'])
m = max(df['freq'])
train_data = df[df['Time']<=s_date]['freq'].values
test_data = df[df['Time']>=s_date]['freq'].values
test_data = test_data/m
train_data = train_data/m
train_n = len(train_data)
test_n = len(test_data)
LOOK_BACK = 6

train_x = np.array([train_data[k:k+LOOK_BACK] for k in range(train_n-LOOK_BACK+1)])
train_y = np.array(train_data[LOOK_BACK-1:])
train_x = tf.reshape(train_x, (-1, LOOK_BACK, 1))
test_x = np.array([test_data[k:k+LOOK_BACK] for k in range(test_n-LOOK_BACK+1)])
test_y = np.array(test_data[LOOK_BACK-1:])
test_x = tf.reshape(test_x, (-1, LOOK_BACK, 1))

Model = Sequential()
Model.add(Conv1D(50, 3, activation='relu',input_shape=(LOOK_BACK, 1)))
Model.add(MaxPooling1D(2))
Model.add(LSTM(150))
Model.add(Dropout(0.1))
Model.add(BatchNormalization())
Model.add(Dense(1, activation='sigmoid'))
Model.compile(loss='mse', optimizer='Adam')
Model.fit(train_x, train_y, epochs=20, batch_size=16, verbose=1)

mse = Model.evaluate(test_x, test_y)
print(f'average mean square error for model: {mse}')

predict_y = Model.predict(test_x)

test_time = df[df['Time']>=s_date]['Time']
time_x = [x.strftime('%H:%M') for x in test_time]
xs = [datetime.strptime(d, '%H:%M') for d in time_x]
ys = test_y*m
yp = predict_y*m

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.gca().xaxis.set_major_locator(mdates.HourLocator())

plt.plot(xs[LOOK_BACK-1:], ys)
plt.plot(xs[LOOK_BACK-1:], yp, 'r')
plt.gcf().autofmt_xdate()
plt.savefig('predict.png')

                        基于LSTM-CNN的地铁短时客流量预测_第1张图片

 以10号线五角场站为例,其中红线代表预测值蓝线代表真实值。由图像不难看出,由于工作出行具有较强规律性在早晚高峰期模型预测精准度比较高,而在晚上由于出行游玩等原因往往表现出不规律的特征但预测误差也相对较小。在整体看来模型具有很分布预测性能。

基于LSTM-CNN的地铁短时客流量预测_第2张图片

    通过上表显示组合模型要比单独的LSTM模型预测效果优异,各类误差均为最小,其预测的MAE为13.3052,RMSE为21.5747,MAPE为24.2243%。此评价标准的建立进一步显示了该模型在客流预测的优越性。可以充分说明CNN取证捕捉站点间空间相关关系再加上LSTM的时间预测使预测模型达到十分精确。

  局限:

轨道交通短时客流预测是交通运营企业和交通运输部门关注的重要问题,本文虽然对客流与发车频率的预测进行模型建立,但短时客流预测和列车调度优化是一个极其复杂的过程,也希望研究此方面的同学或者工作中解决以下的问题:

1.由于节假日客流不确定性比较大,未建立起节假日和周末的预测模型

2.此模型只考虑正常情况,未对大型活动和突发情况进行客流预测

3.在列车发车频率优化方面我们仅考虑客流量和等待时间方面进行优化未考虑乘客时间价值、乘客感受度、列车过剩成本等多方面的影响

你可能感兴趣的:(lstm,cnn,深度学习,python,vscode)