当前位置: 首页 > 后端技术 > Python

车流量预测——极端情况下的预测算法

时间:2023-03-26 15:08:07 Python

1。背景介绍准确预测高变化时段(如假期和体育赛事等)的交通量,对于异常检测、资源分配、预算计划等相关任务至关重要,这些任务有助于网约车大规模优化用户体验然而,预测这些变量极具挑战性,因为此类极端事件的预测取决于天气、城市人口增长以及其他使预测不确定性的外部因素。近年来,LSTM网络技术以其端到端的建模、易于反映外生变量和自动特征提取等优点成为流行的时间序列建模框架。利用多维度的大量数据,LSTM方法可以对复杂的非线性特征相互作用进行建模,这对于预测极端事件至关重要。在IEEE的LingxueZhu和NikolayLaptev发表的DeepandConfidentPredictionforTimeSeriesatUber论文中,介绍了一种新的端到端贝叶斯神经网络(BNN)结构,可以在大规模情况下使用更准确时间序列结果的预测和不确定性预测。2.概述2.1不确定性预测首先,我们用一个函数来表示一个神经网络,其中f表示网络的结构,W表示模型参数的集合。BNN模型中引入了权重参数的先验,模型的目标是拟合最优后验分布。例如,高斯先验通常假设:。然后,我们进一步定义数据生成分布为。在回归问题中,我们通常假设:(其中有一些噪音)。接下来,给定N个观测值和,贝叶斯推理的目标是找到模型参数的后验分布。最后,给定一个新的数据点,将后验分布边缘化后就可以得到预测分布。其中方差量化了预测的不确定性,可以使用总方差定律分解:不确定性)和(代表固有噪声)。上述分解公式的基本假设来自同一过程,但在实践中,情况往往并非如此。特别是在异常检测中,如果一些时间序列有异常模式,会对训练好的模型产生很大的影响。因此,我们需要结合以下三个方面来衡量预测的不确定性:模型不确定性模型误差识别固有噪声接下来将对这三个方面进行详细说明。2.1.1模型不确定性模型不确定性估计的关键是后验分布(即贝叶斯推理)。由于非线性引起的非共轭性质,后验分布在神经网络中极具挑战性。在深度学习中,已经有很多类似推理的研究。经过仔细比较,我们选择了蒙特卡洛损失法(MCdropout)来模拟模型的不确定性。具体算法如下:给定一个新的输入,我们在神经网络的每一层上随机丢弃一部分输出,即以一定的概率p随机丢弃每个隐藏层单元。然后随机前馈重复B次得到。这允许将模型不确定性近似为样本方差(其中)。近年来,已经有很多关于自适应选择最优丢失率p作为模型参数的一部分的研究,但是这种方法需要修改训练阶段。事实上,我们发现模型的不确定性估计在合理的_p_范围内通常是稳健的。2.1.2模型误识别接下来,我们需要使用BNN模型来解决潜在的模型误识别问题。我们解决这个问题的方法是在预测训练数据集中具有完全不同模式的未知样本时获得不确定性,并通过训练一个自动从时间序列中提取代表性特征的编码器来确定这种不确定性。确定性的来源。在测试时,每个样本的编码效果将有助于计算样本集与训练集之间的距离。另一种计算它们之间距离的方法是使用编码器-解码器框架为所有训练集的时间序列拟合一个潜在的嵌入空间。这样,我们就可以测量这个嵌入空间中测试样本和训练样本之间的距离。接下来,我们需要解决的问题是如何将这种错误识别和模型不确定性结合起来。在这里,我们采用了一种将编码器-解码器网络与预测网络连接起来的方法,并且在推理时它是一个大型网络。该算法如图1所示:图1:使用MCdropout算法逼近模型模型算法1的不确定性和误识别上面展示了这样一个使用MCdropout算法的推理网络。具体来说,给定一个输入时间序列,编码器构造学习到的嵌入向量并将其作为特征输入到预测网络_h_中。在此前馈过程中,MCdropout应用于编码器和预测网络的所有层。因此,编码器层的随机丢弃会智能地干扰嵌入空间中的输入,导致潜在的模型错误识别并通过预测网络进一步传播。2.1.3固有噪声最后,让我们估算一下固有噪声。在这种情况下,我们提出了一种简单但自适应的方法,通过残差平方和评估独立验证集来估计噪声水平。具体来说,是训练集上拟合的模型,是独立的验证集,然后我们通过公式进行估计。请注意,它独立于.如果我们进一步假设它是对真实模型的无偏估计,那么我们有,其中偏置项为到0。因此,只要模型是无偏的,它就提供了对固有噪声水平的近似无偏估计。在样本有限的情况下,噪声水平只能被高估并且趋向于更保守。我们的BNN模型的最终推理算法结合了固有噪声估计和MCdropout。算法2给出了最终的推理算法,如图2所示:图2:推理算法结合了固有噪声估计和MCdropout算法3实验本文的实验结果是基于lstm网络+全连接。完整的神经网络结构主要包括两部分:(i)encoder-decoder框架,用于获取时间序列中自身的关系,在预训练时学习好(ii)预测网络,其输入来自于encoder-the解码器框架学习到的嵌入层和潜在的外部特征(如天气事件等)。这种健壮的架构如下图3所示:图3:完整架构在拟合预测模型之前,我们首先需要进行预训练,以拟合一个有用且具有代表性的模型,该模型可以从时间序列中提取嵌入的编码器。它的目标有两个:(i)确保学习到的嵌入为预测提供有用的特征;(ii)证明可以在嵌入中捕获异常输入,这些输入可以进一步传播到预测网络中。3.1实验数据这里我们从kaggle中找到数据集NYCUberPickupswithWeatherandHolidays。这个数据集有很多我们需要的特征,但是我们还是需要对其进行处理,合并area字段,将holiday字段改为0-1的数字表示,合并后的数据如图4所示:图4:处理后的实验数据由于使用了LSTM网络作为encoder-decoder框架,我们将上述处理后的数据读入到时间序列数据中,然后在Transform中将其转化为有监督的问题数据。参考代码:defseries_to_supervised(data,n_in=1,n_out=1,droppan=True):n_vars=1iftype(data)islistelsedata.shape[1]df=pd.DataFrame(data)cols,names=list(),list()#输入序列(t-n,...t-1)foriinrange(n_in,0,-1):cols.append(df.shift(i))names+=[('var%d(t-%d)'%(j+1,i))forjinrange(n_vars)]#forecastsequence(t,t+1,...t+n)foriinrange(0,n_out):cols.append(df.shift(-i))ifi==0:names+=[('var%d(t)'%(j+1))forjinrange(n_vars)]else:names+=[('var%d(t+%d)'%(j+1,i))forjinrange(n_vars)]#放在一起agg=pd.concat(cols,axis=1)agg.columns=names#drop值为NaN的行ifdroppan:agg.dropna(inplace=True)returnagg3.2实验模型给定一个时间序列,编码器的LSTM读取前T个时间戳数据构造一个固定维嵌入状态向量。然后decoder的LSTM根据embedding状态向量和构造下F个时间戳数据。为了从嵌入状态向量构建后续时间戳数据,嵌入状态向量必须包含输入时间序列中最具代表性和最有意义的元素。在对编码器-解码器结构进行预处理后,我们将此结构用作可以智能提取特征的黑盒。具体来说,LSTM节点状态被提取为固定维嵌入向量。然后,使用这个嵌入向量作为特征来训练模型来预测接下来几个时间段的数据。在外部特征可用的场景中,这些特征可以连接成嵌入向量并一起传递给最终的预测网络。有两个超参数需要指定:丢弃率_P_和迭代次数_B_。对于dropout率,不确定性估计在_P_的范围内是相对稳定的,所以我们选择一个在验证集上表现最好的_P_。对于迭代次数,估计的预测不确定性的标准差与成正比。在测量了不同迭代次数的标准偏差后,发现几百次迭代就足以实现稳定的估计。该模型的encoder-decoder框架由两层LSTM单元组成,分别包含128和32个隐藏状态,预测网络由三个全连接层组成,分别包含128、64和16个隐藏单元。我们的输入样本是使用滑动窗口形成的,其中每个样本都将前15小时作为输入来预测下一小时的数据。并且对原始数据进行MinMaxScaler标准化,将数据缩放到0到1之间,降低指数效应。参考代码:encoder_inputs=Input(shape=(train_X.shape[1],train_X.shape[2]))encoder_lstm1=LSTM((128),return_state=True,return_sequences=True)encoder_outputs1,state_h1,state_c1=encoder_lstm1(encoder_inputs)drop_out1=Dropout(0.05)encoder_lstm2=LSTM((64),return_state=True,return_sequences=False)encoder_outputs2,state_h2,state_c2=encoder_lstm2(encoder_outputs1)drop_out2=Dropout(0.05)external_features=输入(shape=(6,))print(external_features)dense1=Dense(128,activation='tanh')temp=Concatenate(axis=1)([state_c2,external_features])dense1_output=dense1(temp)drop_out3=Dropout(0.05)dense2=Dense(64,激活='tanh')dense2_output=dense2(dense1_output)drop_out4=Dropout(0.05)dense3=Dense(16,activation='tanh')dense3_output=dense3(dense2_output)drop_out5=Dropout(0.05)dense4=Dense(1,activation='tanh')dense4_output=dense4(dense3_output)model=Model(inputs=[encoder_inputs,external_features],outputs=dense4_output)model.compile(loss='mse',optimizer='adam')##fitnetworkinput_list=[]input_list.append(train_X)input_list.append(temp_train)history=model.fit(input_list,train_y,epochs=1000,batch_size=10、validation_data=([test_X,temp_test],test_y),verbose=2,shuffle=False)3.3实验结果我们分别使用LSTM模型和这个模型来预测我们的数据,我们使用前15024小时的数据作为我们的训练Collection,剩下的3024小时的数据作为我们的验证集,实验结果如图5(LSTM模型)和图6(论文模型):图5:LSTM模型预测图6:我们可以看到上面的模型prediction可以看出,LSTM模型的预测效果明显不如本文展示的论文模型,尤其是峰值预测。我们展示的模型几乎完全拟合。4.总结本文本文提出了一种用于Uber不确定性估计的端到端神经网络架构。使用MCdropout和固有噪声估计,给出了一种为神经网络预测提供不确定性估计的简单方法,该方法涵盖了大部分不确定性因素。该框架的一个关键特性是它可以应用于任何神经网络而无需修改底层架构。所提出的不确定性估计方法用于估计特殊事件(如节假日、体育赛事、天气等)的不确定性,提高了异常检测的准确性。对于一些高度不确定的事件,我们可以调整内部异常检测模型的置信区间,准确率可以相应提高,有时可以给实际操作带来很大的提升。项目源地址:https://momodel.cn/explore/5d3fb3121afd943289223b91?&tab=1&type=app5。参考论文:DeepandConfidentPredictionforTimeSeriesatUber论文:Longshort-termmemory博客:EngineeringUncertaintyEstimationinNeuralNetworksforTimeSeriesPredictionatUber论文:[Learningphraserepresentationsusingrnnencoder-decoderforstatisticalmachinetranslation](https://arxiv.org/abs/1409.12...:Howdeeplearningestimatesmodeluncertainty(epistemicuncertainty)关于我们Mo(网址:momodel.cn)是一个支持Python的人工智能在线建模平台,可以帮助你快速开发、训练和部署模型。Mo人工智能俱乐部由网站研发和产品设计团队发起,致力于降低人工智能开发和使用门槛的俱乐部。团队拥有大数据处理分析、可视化经验和数据建模,承担过多领域智能化项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析和人工智能技术,并以此推动数据驱动的科学研究。目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不定期进行论文分享和学术交流。希望汇集各界对人工智能感兴趣的行业朋友,不断交流,共同成长,推动人工智能的大众化和普及化。