偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

結(jié)構(gòu)化多元時序模型在攜程業(yè)務(wù)量上的預(yù)測應(yīng)用

人工智能 新聞 開發(fā)
本文主要介紹SCNN模型及其代碼的具體實現(xiàn),以及如何將其應(yīng)用在預(yù)測業(yè)務(wù)量上的實際操作過程,旨在面對一些擁有復(fù)雜時空結(jié)構(gòu)的多元變量數(shù)據(jù)時,能更準確地進行預(yù)測。首先對模型原理進行簡要闡釋,隨后展示代碼邏輯,最后介紹在具體業(yè)務(wù)場景上的實踐應(yīng)用。

一、背景

多元時間序列(MTS)預(yù)測一直是業(yè)務(wù)中的一個重要問題,科學(xué)地預(yù)測下單量或用戶數(shù)能夠協(xié)助財務(wù)制定預(yù)算、協(xié)助客服安排人員、幫助業(yè)務(wù)方更好地評估某個活動上線的效果。在預(yù)定類業(yè)務(wù),例如電商平臺、OTA行業(yè)等,一段時間內(nèi)的下單人數(shù)或是訂單量背后其實蘊藏著一定的時間規(guī)律或者某種特定的時空結(jié)構(gòu),也就是其本身近似于一個有著較復(fù)雜結(jié)構(gòu)的時間序列。如何對未來一定時間內(nèi)的下單用戶或是業(yè)務(wù)量進行預(yù)測,其核心問題就是如何有效地對這類復(fù)雜的時空結(jié)構(gòu)建模,最大程度地模擬出數(shù)據(jù)背后的結(jié)構(gòu)特征,進而得到對于未來有效的預(yù)測。

本文主要將介紹SCNN模型及其代碼的具體實現(xiàn),以及如何將其應(yīng)用在預(yù)測業(yè)務(wù)量上的實際操作過程,旨在面對一些擁有復(fù)雜時空結(jié)構(gòu)的多元變量數(shù)據(jù)時能更準確地進行預(yù)測。下文將首先對模型原理進行簡要闡釋,隨后展示代碼邏輯,最后介紹在具體業(yè)務(wù)場景上的實踐應(yīng)用。

二、現(xiàn)有方法及潛在問題

目前針對時序數(shù)據(jù)的預(yù)測一般是通過同比或者環(huán)比的方式加上業(yè)務(wù)方自己對業(yè)務(wù)增長的理解進行,或是使用ARIMA等較簡單的時序模型進行預(yù)測,并沒有使用非常貼合數(shù)據(jù)結(jié)構(gòu)規(guī)律的模型。因此較難對一些復(fù)雜的時序數(shù)據(jù)有較精準科學(xué)的刻畫。

之前介紹過的BSTS結(jié)構(gòu)模型也是一種針對結(jié)構(gòu)化時序數(shù)據(jù)的模型,能夠拆解出數(shù)據(jù)背后的結(jié)構(gòu)因子。但是因為融入了貝葉斯的思想,考慮的都是參數(shù)的分布形式,最終給出的預(yù)測結(jié)果也都是包含置信區(qū)間的“區(qū)間估計”,不能滿足業(yè)務(wù)方想要一個“具體預(yù)測值”的需求。且BSTS模型普遍情況下適合單維變量的預(yù)測情況,不能很好地捕捉到不同變量之間的相關(guān)性。而實際上,大多數(shù)的變量都會受到外界各種其他變量的影響,因此使用多元時序的預(yù)測模型是一個更好地選擇。

同時,為了滿足業(yè)務(wù)方想要一個更具體的預(yù)測結(jié)果,我們需要一類“點估計”的預(yù)測模型。結(jié)合上述兩點要求,SCNN模型是一個不錯的選擇。下文中我們將詳細介紹這一模型的思想原理以及其具體使用的場景和方法。

三、模型介紹

結(jié)構(gòu)化時間序列數(shù)據(jù)在日常生活中并不少見,尤其像攜程這樣的OTA行業(yè),平臺的下單情況其實就具有一定時間規(guī)律,例如周末往往是一周內(nèi)的下單高峰期;節(jié)假日是一年內(nèi)的下單高峰期等等。

SCNN模型(Structured Components-based Neural Network)全稱為“基于結(jié)構(gòu)化組件的神經(jīng)網(wǎng)絡(luò)模型”,正如其名,它的主要特點體現(xiàn)在:(1)將數(shù)據(jù)分解為多個結(jié)構(gòu);(2)適用于多元序列數(shù)據(jù);(3)應(yīng)用了神經(jīng)網(wǎng)絡(luò)的建模思想。

在時間序列預(yù)測中,基于分解的建模思路也并不少見,常見地,將序列分為周期項;季節(jié)項等等。SCNN模型也類似這樣的思路:將時序數(shù)據(jù)分為4個模塊:長周期項(long-term);短周期項(short-term);季節(jié)性項(seasonal-component)以及序列間相關(guān)性項(co-evolving component),隨后對各個結(jié)構(gòu)模塊進行解耦再分別建模,分別預(yù)測;最終將結(jié)果通過卷積方式融合在一起,進而輸出對未來數(shù)據(jù)的預(yù)測。多元時間序列可以表示為一簇{Yn,t}n∈N,t∈T,其中{Yn,t}表示在t時間的第n個變量的數(shù)值。那基于現(xiàn)有數(shù)據(jù),對未來序列的預(yù)測即可表示為如下概率公式:

圖片

簡答來說,SCNN模型的主要思想就是將一個多元時序數(shù)據(jù)分解成4個模塊,每個模塊可以從不同的角度提供數(shù)據(jù)信息,以此讓模型能夠更好地“學(xué)習(xí)”到原序列內(nèi)在的結(jié)構(gòu)規(guī)律,并更好地作出對未來的預(yù)測。

圖片

圖3-1展示了某一個時序數(shù)據(jù)通過SCNN拆解后得到的4個模塊,最上方的藍線表示原有的數(shù)據(jù),下方的四種曲線分別表示一種結(jié)構(gòu)??梢钥闯鲆粋€表面有著某種規(guī)律的數(shù)據(jù)背后其實可以細分拆解出多個不同的結(jié)構(gòu)模塊。

3.1 多元序列生成過程

基于上述的分解思想,原始的序列數(shù)據(jù)被有序地拆分為了4個模塊,分別是長周期項、季節(jié)項、短周期項以及序列間相關(guān)性項。具體過程可以表示為以下的公式:

圖片

其中,圖片表示原始的序列數(shù)據(jù);圖片表示經(jīng)過一層層分解之后的數(shù)據(jù)。相應(yīng)的圖片表示針對于long-term;short-term;seasonal-term;co-evolving-term狀態(tài)下的均值和標(biāo)準差;最后的Rn,t 表示原數(shù)據(jù)經(jīng)過4層分解后的剩余項。

更具象地,可以用“交通密度數(shù)據(jù)“來模擬這一過程,不同的模塊可以反映出影響交通數(shù)據(jù)的不同方面:長周期項能夠體現(xiàn)一個城市的交通總體趨勢,例如人口的增長導(dǎo)致的擁堵或整個城市經(jīng)濟發(fā)展導(dǎo)致的交通變化,是一個較長時間范圍內(nèi)的影響;季節(jié)性項體現(xiàn)在某固定周期內(nèi)的交通變化,例如每天上下班的高峰時段會帶來交通的擁堵或是周末帶來的擁堵;短周期項則能夠捕捉由一些突發(fā)事件導(dǎo)致的短暫瞬時變化,例如突發(fā)的交通事故或是突然的惡劣天氣等導(dǎo)致短時間內(nèi)的交通變化;序列間相關(guān)性項則反應(yīng)不同交通道路之間的相互影響程度,例如突然的交通事故可能會加大鄰近道路的擁堵情況;最終的剩余項(殘差項)則會保留一些隨機效應(yīng)或是系統(tǒng)誤差等等。

需要注意的是,不同項之間會存在互相流動的情況,例如突發(fā)的交通事故如果一直持續(xù),可能會發(fā)展成“短周期項”,如果持續(xù)的時間更長,則可能會轉(zhuǎn)移成長周期項,這種流動性就要求模型能夠更加靈活,從而準確地把握每一個結(jié)構(gòu)的流動情況。

3.2 結(jié)構(gòu)分解

本節(jié)將介紹如何對4個模塊進行分解建模以及預(yù)測:

1)長周期項:如前文所示,長周期反映的是序列數(shù)據(jù)在較長時間范圍內(nèi)的變化。因此選擇構(gòu)建一個較大的滑動窗口,取每個窗口內(nèi)的均值與標(biāo)準差作為長周期項的兩個參數(shù)。

圖片

其中圖片表示長周期項的均值與標(biāo)準差;圖片表示將原數(shù)據(jù)進行長周期化后的數(shù)據(jù)(提取出長周期項)。

2)季節(jié)性項:與長周期項的滑動窗口類似,在基于 “序列的周期長度是一致的”假設(shè)前提下,對季節(jié)性項也采取一個窗口統(tǒng)計的方法。

圖片

其中圖片表示季節(jié)性項的均值與標(biāo)準差;圖片表示將圖片再進行季節(jié)性化后的數(shù)據(jù)(提取出季節(jié)性項)。

3)短周期項:和長周期項相同,這里取一個較短的滑動窗口來進行計算;較短的窗口能夠防止一些短期內(nèi)的信息平滑掉,從而能夠體現(xiàn)出數(shù)據(jù)在短時間內(nèi)的變化,提供更全面的信息。

圖片

其中圖片表示短周期項的均值與標(biāo)準差;圖片表示將圖片進行短周期化后的數(shù)據(jù)(提取短周期項)。

4)序列間相關(guān)性項:相較于單元序列,多元序列需要考慮到不同變量之間的相關(guān)性,如上述的交通案例中某一道路的突發(fā)情況會對鄰近道路造成影響,這一過程就體現(xiàn)了序列間相關(guān)性。作者認為不同序列間會共享某一個相關(guān)性值(例如道路A鄰近的兩條道路B和C,如果都發(fā)生了交通事故,他們對于道路A的影響程度可能是同一個相關(guān)性結(jié)構(gòu)),因此我們需要識別出哪些序列間會共享同一個相關(guān)性結(jié)構(gòu),換句話說我們需要知道每一對序列之間的相關(guān)性結(jié)構(gòu)。

我們可以采取通過一些先驗知識計算兩兩序列之間的相關(guān)性權(quán)重矩陣;也可以通過讓模型自己學(xué)習(xí),SCNN模型選擇了后者,采用注意力計算的方法,給每一對序列之間設(shè)置一個注意力分數(shù)并通過softmax方式進行標(biāo)準化以確保注意力分數(shù)總和為1;最終每一對序列之間的分數(shù)可以表示如下:

圖片

其中圖片分別表示第n個變量與第圖片個變量在標(biāo)準化后和標(biāo)準化前的注意力分數(shù);圖片表示將注意力分數(shù)分配到每兩個變量后的的均值與標(biāo)準差;Rn,t 表示圖片被抽取序列間相關(guān)性之后。最終無法被分解的剩余項。

下圖展示了一個多元時間序列經(jīng)過4道分解的過程:先抽取長周期項;再抽取季節(jié)性項;再抽取短周期項最后抽取序列間的相關(guān)性項。在進行4道分解之后會得到4個模塊各自的模型,隨后會分別進行預(yù)測,最終將4個模塊預(yù)測的結(jié)果經(jīng)過一維卷積融合得到最終輸出的預(yù)測序列。

圖片

圖3-2展示SCNN模型對于4個模塊分解的過程。過程中會分別計算出每個模塊的均值與標(biāo)準差值作為模型參數(shù),將4個模塊分別抽取之后分別進行建模、預(yù)測;最后將各模塊的預(yù)測結(jié)果進行融合得到最終的序列預(yù)測結(jié)果。

3.3 結(jié)構(gòu)預(yù)測

上述內(nèi)容介紹了如何將序列的4個模塊分別抽取并建模的過程,下面將介紹如何對這4個模塊分別進行預(yù)測。

長周期和季節(jié)性項因為統(tǒng)一采用了滑動窗口的形式并且其周期較長、較平滑,如果預(yù)測較近的未來,這兩項的趨勢不會有太大的波動,因此可以直接用參數(shù)估計的方式進行預(yù)測,即直接用當(dāng)前窗口的均值作為下一個窗口的估計,公示如下:

圖片

短周期項、相關(guān)性項以及殘差項因為會在短時間內(nèi)有較大的變動因此無法使用長周期的方法進行推測。作者認為可以對這三種模塊各自建立一個自回歸的模型,能夠基于過去的信息來預(yù)測未來的情況。為了簡便作者統(tǒng)一用下面的表達式來表示這三項結(jié)構(gòu)的自回歸模型:

圖片

其中圖片是模型中的權(quán)重矩陣,bi表示預(yù)測偏差。圖片,表示囊括了短周期、序列間相關(guān)性以及殘差項這三個結(jié)構(gòu),其中我們主要需要訓(xùn)練圖片以及bi。

圖片

圖3-3表示對于不同模塊的預(yù)測方法。長周期直接使用上一個窗口的均值當(dāng)做下一個窗口的預(yù)測值;季節(jié)性與長周期方法類似,使用上一個季節(jié)的均值當(dāng)做下一個季節(jié)窗口的預(yù)測。短周期與序列間相關(guān)性項是利用自回歸模型進行推測。

3.4 結(jié)構(gòu)融合

通過上述方式可以分別得到四種模塊在要求范圍內(nèi)的預(yù)測結(jié)果,之后作者提出用神經(jīng)網(wǎng)絡(luò)的方式對預(yù)測的結(jié)果進行融合。具體來說,引入一個神經(jīng)模塊,分為兩個分支:一個專門用于特征學(xué)習(xí)(通過神經(jīng)網(wǎng)絡(luò)自動學(xué)習(xí)輸入數(shù)據(jù)中的特征結(jié)構(gòu)),另一個用于參數(shù)學(xué)習(xí)(通過訓(xùn)練過程調(diào)整網(wǎng)絡(luò)中的權(quán)重和偏差等參數(shù),提升網(wǎng)絡(luò)的擬合程度),最后這兩個分支的輸出將通過卷積方式整合成最終的預(yù)測結(jié)果。

3.5 損失函數(shù)&殘差項處理

傳統(tǒng)對于預(yù)測模型的評估指標(biāo)即為MAE或者MSE,通過預(yù)測值與真實值之間的差距來評估模型預(yù)測的好壞,但是這樣的評估方法有一個內(nèi)在的假設(shè):所有變量的方差量綱相同。但由于時序數(shù)據(jù)在不同時間點下的波動程度并不相同,如果基于這樣的假設(shè)進行預(yù)測,那最終融合后的數(shù)據(jù)可能并不是最佳的預(yù)測結(jié)果。于是作者考慮將MLE納入損失函數(shù)定義中,將損失函數(shù)重新定義為:

圖片

其中第一項圖片用來控制預(yù)測結(jié)果的波動不要太大;第二項則同時控制預(yù)測結(jié)果與真實結(jié)果的差距與預(yù)測結(jié)果的波動性均不要太大。

但作者認為僅僅依靠改變上述目標(biāo)函數(shù)仍存在一定風(fēng)險,他認為經(jīng)過4層拆解之后的剩余項Rn,t中仍可能包含沒有分解干凈的結(jié)構(gòu)特征,最后導(dǎo)致模型給殘差部分分配一個較高的權(quán)重,而這些權(quán)重本應(yīng)被分配到相應(yīng)的結(jié)構(gòu)項上。如果殘差項擁有了不恰當(dāng)?shù)母邫?quán)重,那一旦時序數(shù)據(jù)后續(xù)受到高頻的隨機噪聲的干擾,那模型的有效性就會大幅下降。

為了解決這個問題,作者額外再引入了一個正則化項來控制殘差項中的結(jié)構(gòu)權(quán)重,以此促使模型更多地聚焦在分解出的4個結(jié)構(gòu)項上,同時保證模型如果在僅使用4個分解項結(jié)構(gòu)而沒有殘差項的情況下也能做出相對合理的預(yù)測結(jié)果。具體來說,在訓(xùn)練模型的過程中,SCNN在分解模塊之后,會有兩個分支。一個分支保留了殘差項,和4個模塊一起用來訓(xùn)練模型;另一個分支則將殘差項全部置零,只傳遞結(jié)構(gòu)成分來進行后續(xù)模型訓(xùn)練。最后分別用這兩種方法得到預(yù)測結(jié)果并進行加權(quán)求和,構(gòu)建最終的目標(biāo)函數(shù):

圖片

其中圖片就是通過置零殘差項得到的模型預(yù)測結(jié)果;圖片是保留殘差項的模型預(yù)測結(jié)果。最終我們會使用這個目標(biāo)函數(shù)來訓(xùn)練模型。

圖片

圖3-4展示了目標(biāo)函數(shù)不同的構(gòu)建方式。第一張圖表示傳統(tǒng)的MSE損失函數(shù);第二張圖是考慮了時序結(jié)構(gòu)特點的損失函數(shù)納入了MLE;第三張圖表示在第二張圖的目標(biāo)函數(shù)構(gòu)建的基礎(chǔ)上,參照公式(21)將殘差項置零后得到的預(yù)測結(jié)果與普通預(yù)測結(jié)果加權(quán)后得到最終的目標(biāo)函數(shù)。

四、模型應(yīng)用與代碼實現(xiàn)

以上我們介紹了SCNN模型的基本思想以及理論步驟,下面我們將介紹作者在git上開源的代碼邏輯,以及我們?nèi)绾卧趯嶋H業(yè)務(wù)過程中使用該模型對業(yè)務(wù)量進行預(yù)測。具體代碼實現(xiàn)可以參考文獻[2]。

圖片

圖4-1展示了訓(xùn)練模型的具體執(zhí)行過程,從輸入數(shù)據(jù)訓(xùn)練、選取最佳模型、使用模型進行預(yù)測到最后對模型進行定期更新迭代。

4.1 代碼實現(xiàn)

下面通過部分代碼來展示實現(xiàn)過程,這里主要介紹4個模塊的抽取與預(yù)測部分:

# 進行季節(jié)性歸一化處理,input:數(shù)據(jù)集+周期長度;output:季節(jié)性結(jié)構(gòu)的均值與方差以及標(biāo)準化后結(jié)果
def SeasonalNorm(x, period_length):
    mean = F.pad(mean.reshape(b * c, n, -1), mode='circular', pad=(t % period_length, 0)).reshape(b, c, n, -1)
    var = F.pad(var.reshape(b * c, n, -1), mode='circular', pad=(t % period_length, 0)).reshape(b, c, n, -1) 
    out = (x - mean) / (var + epsilon) ** 0.5
    return out, mean, var ** 0.5
# 序列間相關(guān)性項
class AdaSpatialNorm(nn.Module):
    def forward(self, x):
        mean_f = torch.matmul(adj_mat, x_f)
        var_f = torch.matmul(adj_mat, x_f ** 2) - mean_f ** 2 + 0.00001 
        mean = mean_f.view(b, t, n, c).permute(0, 3, 2, 1)
        var = var_f.view(b, t, n, c).permute(0, 3, 2, 1)        
        out = (x - mean) / (var + epsilon) ** 0.5
        return out, mean, var ** 0.5
# 進行長短周期的歸一化處理,input:數(shù)據(jù)集與滑動窗口的長度;output:經(jīng)過長/短周期歸一化后的值以及各自結(jié)構(gòu)的均值方差
def TermNorm(x, term_length):
    mean = F.pad(mean.reshape(b * c, n, -1), mode='replicate', pad=(term_length-1, 0)).reshape(b, c, n, -1)
    var = F.pad(var.reshape(b * c, n, -1), mode='replicate', pad=(term_length-1, 0)).reshape(b, c, n, -1)
    out = (x - mean) / (var + epsilon) ** 0.5
    return out, mean, var ** 0.5
#對四個模塊進行卷積融合,input:原數(shù)據(jù)集,output:預(yù)測后的數(shù)值
class SCNN(nn.Module):
    def forward(self, input):
        pred_distr_args = self.proj_distr_args(out)  # 不mask殘差項得到的預(yù)測結(jié)果
        pred_distr_args = (pred_distr_args[0], pred_distr_args[1], F.threshold(pred_distr_args[2], 0.2, 0.2))
        pred_distr = self.distr_output.distribution(pred_distr_args)
        pred_distr_args_aux = self.proj_distr_args(out_aux) # mask殘差項后得到的預(yù)測結(jié)果
        pred_distr_args_aux = (pred_distr_args_aux[0], pred_distr_args_aux[1], F.threshold(pred_distr_args_aux[2], 0.2, 0.2))
        pred_distr_aux = self.distr_output.distribution(pred_distr_args_aux)
        pred_mean = pred_distr_args[1].reshape(b, n, self.num_pred, 1).permute(0, 2, 1, 3)
        if self.training:
            return pred_distr, pred_distr_aux
        else:
            return pred_mean

上述代碼展示了部分SCNN模型的建模及預(yù)測過程,包括長短周期項、季節(jié)性項以及序列間項的建模過程,最后的SCNN類是將這幾個模塊分別建模并做預(yù)測,融合在一起后得到最終預(yù)測的結(jié)果。

4.2 最佳模型選取

通過構(gòu)建訓(xùn)練集、驗證集與測試集(*不是無序打亂,會滿足時間連貫性,例如訓(xùn)練集是1~80天的數(shù)據(jù),驗證集是81~120天的數(shù)據(jù),測試集是121~150天的數(shù)據(jù)*),以RMSE與MAE等指標(biāo)為標(biāo)準選取效果最好的模型并保存。

4.3 模型參數(shù)

模型包含大量參數(shù),可以歸納為4個部分(如下圖所示),不同版塊的參數(shù)將通過不同方式獲取。

圖片

圖4-2展示了不同類型的模型參數(shù),可以分為與SCNN結(jié)構(gòu)相關(guān)的參數(shù)值;與神經(jīng)網(wǎng)絡(luò)相關(guān)的模型參數(shù)值;模型訓(xùn)練的指標(biāo)值以及訓(xùn)練預(yù)測時的步長設(shè)置等。

數(shù)據(jù)集自身結(jié)構(gòu)參數(shù):長/短周期及季節(jié)項等參數(shù)可以直接通過對歷史數(shù)據(jù)的分析得到。

神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù):可以通過提前設(shè)置或是對比不同參數(shù)下的模型效果來得到最優(yōu)的那個。原文中作者嘗試了多個參數(shù)包括網(wǎng)絡(luò)層數(shù);hidden channel;kernal size等等來對比不同組合下模型的效果(如圖4-3所示)。這種通過不同參數(shù)組合對比模型結(jié)果的方式能直觀反映出參數(shù)的優(yōu)劣但也會消耗較大的資源,實際應(yīng)用中可以視資源條件而定。

圖片

圖4-3展示了在不同的網(wǎng)絡(luò)超參設(shè)置下模型表現(xiàn)的結(jié)果對比,可以看出并不是網(wǎng)絡(luò)層數(shù)越多或核數(shù)越多就一定會得到更好的訓(xùn)練效果。

模型訓(xùn)練相關(guān)參數(shù):這部分參數(shù)主要涉及訓(xùn)練模型時對訓(xùn)練集、驗證集、測試集的劃分,更推薦各個子集的長度是周期項的倍數(shù),例如如果以每小時作為步長,周期項為一天,則周期值為24,那訓(xùn)練集、驗證集與測試集最好都能夠是24的倍數(shù),這樣模型訓(xùn)練的時候能夠更好的學(xué)到周期項的影響。當(dāng)然具體情況視數(shù)據(jù)集本身結(jié)構(gòu)而定。其余的迭代次數(shù)與模型指標(biāo)也視具體情況和資源條件而定。

訓(xùn)練&預(yù)測步長參數(shù):事先需要定好使用多長時間內(nèi)的數(shù)據(jù)對未來多久范圍內(nèi)的數(shù)據(jù)進行預(yù)測。SCNN模型更擅長對于短時間內(nèi)的未來進行預(yù)測,能夠很好地捕捉到短時間內(nèi)的數(shù)據(jù)波動情況。

4.4 模型對比

作者使用了BikeNYC、PeMSD7及Electricity三個數(shù)據(jù)集進行測試,將SCNN的預(yù)測效果與其他一些時序預(yù)測模型進行對比。從結(jié)果看,SCNN模型在對未來短時間的預(yù)測上,效果優(yōu)于其他模型。此處展示了在BikeNYC數(shù)據(jù)集上部分模型與SCNN模型的預(yù)測效果,作者進行了3次橫向?qū)嶒?,此處?次指標(biāo)值的平均值進行展示:

圖片

五、業(yè)務(wù)場景實踐

我們希望對業(yè)務(wù)量進行合理地預(yù)測,來協(xié)助財務(wù)、產(chǎn)品等多方調(diào)整評估自身業(yè)務(wù)。通過對歷史數(shù)據(jù)的分析發(fā)現(xiàn),每日業(yè)務(wù)量的數(shù)值可以看作一個時間序列,它會受到一個地區(qū)長期人口增長或是旅游業(yè)發(fā)展帶來的長期影響;每個周末的出行小高峰會體現(xiàn)出季節(jié)性的特點;每天上下班的小高峰類似是一個短周期項;且業(yè)務(wù)量與當(dāng)下的站內(nèi)活躍人數(shù)、下單人數(shù)等等其他變量之間會存在相關(guān)性,符合SCNN模型的適用數(shù)據(jù)對象。

于是我們嘗試使用SCNN模型來進行結(jié)構(gòu)拆解及預(yù)測,以此給出更科學(xué)的預(yù)測結(jié)果。另一方面,我們發(fā)現(xiàn)平峰時期的業(yè)務(wù)量結(jié)構(gòu)與節(jié)假日高峰時期的業(yè)務(wù)量結(jié)構(gòu)并不完全相同,因此我們選擇分開訓(xùn)練適用平峰期業(yè)務(wù)與高峰期業(yè)務(wù)的模型。

5.1 數(shù)據(jù)選取&模型訓(xùn)練

數(shù)據(jù)預(yù)備:從數(shù)據(jù)圖像上我們可以看出,在一天之內(nèi)業(yè)務(wù)量呈現(xiàn)某種固定的波動趨勢,因此我們?nèi)?小時為1步長,以一天(24H)為季節(jié)性周期。同時也可以發(fā)現(xiàn)每周的業(yè)務(wù)量也呈現(xiàn)相似的波動規(guī)律,例如周中是一周中的“淡季”,周四~周日是一周中的“旺季”,于是我們?nèi)∫恢?168H)為一個長周期。綜上,確定了模型中所有的結(jié)構(gòu)參數(shù)。

圖片

圖5-1展示了每小時業(yè)務(wù)量的波動趨勢,體現(xiàn)出一定的周期性和規(guī)律性。

數(shù)據(jù)選取:考慮到疫情對出行業(yè)務(wù)的影響,我們選取了2019年與2023年全年的所有數(shù)據(jù)進行模型訓(xùn)練,變量包括業(yè)務(wù)量、下單人數(shù)、訪問人數(shù)等多列變量;

模型訓(xùn)練:將上述數(shù)據(jù)代入SCNN模型中,選取若干不同的hidden channel, kernel size訓(xùn)練模型,以RMSE為指標(biāo)得到最佳的SCNN模型及其參數(shù)。

方法改進:針對節(jié)假日,我們發(fā)現(xiàn)不同節(jié)假日的業(yè)務(wù)量趨勢結(jié)構(gòu)各不相同,且都與平峰期不同,例如端午期間就不是以一周為長周期的趨勢。因此針對節(jié)假日我們單獨訓(xùn)練了模型,考慮到節(jié)假日有提前開售以及人們不同的返程習(xí)慣,這里使用的是每個節(jié)假日前30天起到節(jié)假日結(jié)束后7天的數(shù)據(jù),同樣通過調(diào)試不同的模型參數(shù)來確定最佳的節(jié)假日SCNN模型。而針對平峰期,我們即使用2019年與2023年全年的數(shù)據(jù)進行訓(xùn)練,得到最佳模型。

模型應(yīng)用:根據(jù)上述方法分別得到了適用于平峰期與節(jié)假日高峰期的兩個模型。隨后我們將模型應(yīng)用在2024年的數(shù)據(jù)上進行準確性的驗證。

5.2 代碼實現(xiàn)&結(jié)果解讀

考慮到春節(jié)的特殊性,我們選擇從2024年3月1日起進行模型的驗證:用每168H的數(shù)據(jù)來預(yù)測下一個24H的業(yè)務(wù)量(例如用3/1~3/7的數(shù)據(jù)預(yù)測3/8的數(shù)據(jù)),并采取rolling prediction的方式對3~6月的每日業(yè)務(wù)量數(shù)據(jù)進行預(yù)測(用3/1~3/7的數(shù)據(jù)預(yù)測3/8的數(shù)據(jù),隨后用3/2~3/8的數(shù)據(jù)預(yù)測3/9的數(shù)據(jù))。過程中并未用到任何實際真實的數(shù)據(jù),完全是通過模型預(yù)測完成了對3個月內(nèi)每天業(yè)務(wù)量的預(yù)測任務(wù)。整個預(yù)測期間會涉及清明、五一與端午三個節(jié)假日,我們會在平峰期時使用平峰期SCNN模型;在節(jié)假日適用高峰期SCNN模型。下方展示了部分訓(xùn)練及預(yù)測使用的代碼模塊:

# 設(shè)置規(guī)定指標(biāo)閾值與迭代次數(shù),訓(xùn)練模型得到最佳模型
for epoch in range(nb_epoch): 
        model.train()
        running_loss = []
        for j, x_batch in enumerate(gen_batch(dataset.get_data('train'), batch_size, dynamic_batch=False, shuffle=True)):
            xh = torch.tensor(xh, dtype=torch.float32).to(device)
            y = torch.tensor(y, dtype=torch.float32).to(device)
            pred_distr, pred_distr_aux = model(xh)
            model.zero_grad()
            loss = - pred_distr.log_prob(y.permute(0, 2, 1, 3).reshape(-1, n_pred)).mean() - 0 * pred_distr_aux.log_prob(y.permute(0, 2, 1, 3).reshape(-1, n_pred)).mean()
            loss.backward()
            nn.utils.clip_grad_norm_(model.parameters(), 10)
            optimizer.step()
            running_loss.append(loss.data.cpu().numpy())
        if epoch % 10 == 0:
            model.eval()
            min_va_val, min_val, min_ta_val = model_inference(device, model, dataset, test_batch_size, n_his, n_pred, min_va_val, min_val, n)
            for i in range(n_pred):
                print(f'MAPE {va[i*3]:7.3%}, {te[i*3]:7.3%}, {ta[i*3]:7.3%};'
                      f'MAE  {va[i*3+1]:4.3f}, {te[i*3+1]:4.3f}, {ta[i*3+1]:4.3f};'
                      f'RMSE {va[i*3+2]:6.3f}, {te[i*3+2]:6.3f}, {ta[i*3+2]:6.3f}.')       
             if va_mean_rmse < min_rmse:
                torch.save(model.state_dict(), best_model_path)
                min_rmse = va_mean_rmse
                stop = 0
            else:
                stop += 1
            if stop == 10:
                break
    model.load_my_state_dict(torch.load(best_model_path))
    print('Best Results:')
#調(diào)用之前的最佳模型進行預(yù)測
model.load_my_state_dict(torch.load('MODEL/best_model.h5'))
model.eval()
#使用該模型對未來給定步長進行預(yù)測
norm_data = scaler.fit_transform(hist_data)
zz =  torch.tensor(norm_data, dtype=torch.float32).to(device)
pred  = model(zz)
preds.append(pred.data.cpu().numpy())

圖片

圖5-2展示了某一天SCNN模型的預(yù)測結(jié)果與真實數(shù)據(jù)的對比情況,橫坐標(biāo)是當(dāng)天的小時數(shù)。當(dāng)天預(yù)測的總業(yè)務(wù)量的相對誤差為1.43%。

圖片

圖5-3展示了3-6月模型對于每天業(yè)務(wù)量的預(yù)測結(jié)果和真實結(jié)果的對比情況。整體預(yù)測值與實際值相對誤差為1.34%。

從上圖可以看出,平峰期模型的預(yù)測結(jié)果與實際情況相差不大,表現(xiàn)相對穩(wěn)定。但是在五一、端午等節(jié)假日期間,模型預(yù)測與實際業(yè)務(wù)量的趨勢大體相同但是在一些峰值表現(xiàn)上存在差距。

推測存在三方面原因:

1)模型目前是根據(jù)歷史19年與23年的數(shù)據(jù)進行訓(xùn)練的,是基于這兩年數(shù)據(jù)的表現(xiàn)結(jié)構(gòu)進行的預(yù)測,24年存在一些額外的營銷活動、以及24年與23年用戶的出行需求也有所不同(23年因疫情放開導(dǎo)致用戶“報復(fù)性”出游帶來的出行需求增大,24年則可能趨于平穩(wěn))。

2)目前針對高峰期的模型,采用的訓(xùn)練數(shù)據(jù)只有19年與23年的12個節(jié)假日(因特殊性未使用春節(jié)數(shù)據(jù)),不充足的數(shù)據(jù)量會導(dǎo)致模型學(xué)到的結(jié)構(gòu)規(guī)律不夠穩(wěn)定。

3)目前針對各個節(jié)假日使用的是同一個高峰期的SCNN模型,但其實各個節(jié)假日因放假時長不同,結(jié)構(gòu)規(guī)律也不同,并不能完全用一個模型來進行預(yù)測,因此會導(dǎo)致預(yù)測結(jié)果的偏差。

5.3 落地應(yīng)用&未來改進

將模型在2024年3-6月上的預(yù)測結(jié)果同步業(yè)務(wù)并獲得接受之后,目前已將模型使用的訓(xùn)練數(shù)據(jù)更新到2024年6月,同時將此方法應(yīng)用在對未來兩個季度的每日業(yè)務(wù)量預(yù)測上,持續(xù)更新并以看板的形式呈現(xiàn)。后續(xù)考慮可以在以下四點上進行優(yōu)化:

1)將每天預(yù)測的結(jié)果與真實結(jié)果之間的GAP作為模型目標(biāo)函數(shù)的一部分,讓模型更好地進行自我更新調(diào)整,得到更準確的預(yù)測結(jié)果。

2)將方法平臺化、工具化,能夠支持業(yè)務(wù)方自行選擇想要預(yù)測的時間周期及變量,模型將根據(jù)該變量的歷史表現(xiàn)判定是否適用SCNN模型,如果適用則進行訓(xùn)練并得到最佳模型,最終基于此模型輸出預(yù)測結(jié)果。

3)目前模型對于節(jié)假日的預(yù)測表現(xiàn)并不十分穩(wěn)定,主要原因也是訓(xùn)練的數(shù)據(jù)集過少且每年的節(jié)假日的營銷手段不完全一致,并不能很好地固化每個節(jié)假日的結(jié)構(gòu)特點。后續(xù)只有不斷積累數(shù)據(jù),同時也擴充一些“場外因素”,例如通過外部的用戶搜索量、社媒上的出行討論度、營銷活動力度等等來及時反映出當(dāng)前節(jié)假日的出行熱度,從而更好地幫助模型預(yù)測此次節(jié)假日的業(yè)務(wù)量情況。

4)目前針對不同的節(jié)假日采用的是同一個節(jié)假日的SCNN模型,但其實各個節(jié)假日的結(jié)構(gòu)特征不完全一致,最理想的狀態(tài)是每個節(jié)假日有自己專屬的SCNN模型來學(xué)習(xí)并預(yù)測,但現(xiàn)在的數(shù)據(jù)量暫不能達到訓(xùn)練的要求,只能等數(shù)據(jù)量的擴充或是在同一個節(jié)假日模型中加入?yún)?shù)區(qū)分不同的節(jié)假日來提升模型對不同節(jié)假日結(jié)構(gòu)特點的適配性。

六、方法拓展

本文介紹的SCNN模型通過拆解長短周期項、季節(jié)性項以及序列間相關(guān)性項,對時序數(shù)據(jù)輸出“點估計型”的預(yù)測結(jié)果。這可以和之前介紹過的CausalImpact相結(jié)合,在CausalImpact中也是先對時序數(shù)據(jù)進行擬合預(yù)測得到反事實值,然后得到預(yù)測值與真實值之間的差距來評估策略的提升效應(yīng)。在CausalImpact中默認使用的時序模型是BSTS,但也可以自定義時序模型,例如我們可以自己訓(xùn)練SCNN模型,然后將此模型當(dāng)做時序模型放到CausalImpact中計算策略的效應(yīng)值。

from causalimpact.misc import standardize
normed_data, _ = standardize(data.astype(np.float32)) #標(biāo)準化數(shù)據(jù)
obs_data = normed_data.iloc[:70, 0]
# 使用其他時序模型來進行擬合得到反事實值
linear_level = tfp.sts.LocalLinearTrend(observed_time_series=obs_data)
linear_reg = tfp.sts.LinearRegression(design_matrix=normed_data.iloc[:, 1:].values.reshape(-1, normed_data.shape[1] -1))
model = model.load_my_state_dict(torch.load('MODEL/best_SCNN_model.h5'))
# 將自義定時序模型代入CausalImpact包中
ci = CausalImpact(data, pre_period, post_period, model=model)

七、總結(jié)

本文介紹了一種多元時間序列數(shù)據(jù)的預(yù)測模型,通過將數(shù)據(jù)拆解為長周期、季節(jié)性、短周期及序列間相關(guān)性四種結(jié)構(gòu),對數(shù)據(jù)進行解耦、分塊預(yù)測、通過神經(jīng)網(wǎng)絡(luò)對預(yù)測結(jié)果進行融合來得到最終的輸出結(jié)果;通過重構(gòu)損失函數(shù)、置零殘差項等方式提升了模型的魯棒性與準確性,能夠最大程度上學(xué)習(xí)到序列背后的結(jié)構(gòu)特點并做出盡可能準確的預(yù)測結(jié)果。

本文進一步介紹了該方法的實現(xiàn)方式以及如何將該方法應(yīng)用在實際的業(yè)務(wù)量預(yù)測上,結(jié)合具體的業(yè)務(wù)場景介紹了SCNN模型的具體使用步驟以及注意事項,同時就實踐結(jié)果分析了該方法目前在應(yīng)用上的優(yōu)點與不足,以及后續(xù)的優(yōu)化方向。

未來隨著數(shù)據(jù)量的擴充以及模型的完善,有望針對不同類型的時序數(shù)據(jù)進行特定的結(jié)構(gòu)學(xué)習(xí)與預(yù)測,另一方面,也可以通過使用SCNN模型進行反事實預(yù)測,將該方法拓展到CausalImpact等一些因果推斷的評估場景中,更好地發(fā)揮其捕捉數(shù)據(jù)結(jié)構(gòu)進行合理預(yù)測的優(yōu)勢。

責(zé)任編輯:張燕妮 來源: 攜程技術(shù)
相關(guān)推薦

2023-10-27 09:34:34

攜程應(yīng)用

2023-05-03 20:27:49

獨立預(yù)測聯(lián)合預(yù)測多元時序

2022-04-07 17:30:31

Flutter攜程火車票渲染

2017-07-06 19:57:11

AndroidMVP攜程酒店

2023-12-08 09:30:11

模型系統(tǒng)工具

2024-12-18 10:20:00

攜程鴻蒙開發(fā)

2021-12-12 08:37:18

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)

2020-11-11 13:44:00

攜程旅行點擊量

2022-07-15 12:58:02

鴻蒙攜程華為

2018-04-03 14:00:03

結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)數(shù)據(jù)庫

2024-05-27 00:32:45

2022-11-29 21:00:39

技術(shù)搜索

2023-07-07 12:26:39

攜程開發(fā)

2025-01-03 14:33:41

2023-07-14 07:15:13

2023-12-25 15:00:18

結(jié)構(gòu)化布線光纖

2023-12-29 09:42:28

攜程開發(fā)

2025-01-10 13:56:28

2014-12-25 17:51:07

2023-09-12 11:36:15

攜程模型
點贊
收藏

51CTO技術(shù)棧公眾號