自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

一、背景

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

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

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

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

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

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

三、模型介紹

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

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

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

圖片

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

圖片

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

3.1 多元序列生成過(guò)程

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

圖片

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

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

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

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

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

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

圖片

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

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

圖片

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

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

圖片

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

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

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

圖片

其中圖片分別表示第n個(gè)變量與第圖片個(gè)變量在標(biāo)準(zhǔn)化后和標(biāo)準(zhǔn)化前的注意力分?jǐn)?shù);圖片表示將注意力分?jǐn)?shù)分配到每?jī)蓚€(gè)變量后的的均值與標(biāo)準(zhǔn)差;Rn,t 表示圖片被抽取序列間相關(guān)性之后。最終無(wú)法被分解的剩余項(xiàng)。

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

圖片

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

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

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

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

圖片

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

圖片

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

圖片

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

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

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

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

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

圖片

其中第一項(xiàng)圖片用來(lái)控制預(yù)測(cè)結(jié)果的波動(dòng)不要太大;第二項(xiàng)則同時(shí)控制預(yù)測(cè)結(jié)果與真實(shí)結(jié)果的差距與預(yù)測(cè)結(jié)果的波動(dòng)性均不要太大。

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

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

圖片

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

圖片

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

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

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

圖片

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

4.1 代碼實(shí)現(xiàn)

下面通過(guò)部分代碼來(lái)展示實(shí)現(xiàn)過(guò)程,這里主要介紹4個(gè)模塊的抽取與預(yù)測(cè)部分:

# 進(jìn)行季節(jié)性歸一化處理,input:數(shù)據(jù)集+周期長(zhǎng)度;output:季節(jié)性結(jié)構(gòu)的均值與方差以及標(biāo)準(zhǔn)化后結(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)性項(xiàng)
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
# 進(jìn)行長(zhǎng)短周期的歸一化處理,input:數(shù)據(jù)集與滑動(dòng)窗口的長(zhǎng)度;output:經(jīng)過(guò)長(zhǎ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
#對(duì)四個(gè)模塊進(jìn)行卷積融合,input:原數(shù)據(jù)集,output:預(yù)測(cè)后的數(shù)值
class SCNN(nn.Module):
    def forward(self, input):
        pred_distr_args = self.proj_distr_args(out)  # 不mask殘差項(xiàng)得到的預(yù)測(cè)結(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殘差項(xiàng)后得到的預(yù)測(cè)結(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ù)測(cè)過(guò)程,包括長(zhǎng)短周期項(xiàng)、季節(jié)性項(xiàng)以及序列間項(xiàng)的建模過(guò)程,最后的SCNN類(lèi)是將這幾個(gè)模塊分別建模并做預(yù)測(cè),融合在一起后得到最終預(yù)測(cè)的結(jié)果。

4.2 最佳模型選取

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

4.3 模型參數(shù)

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

圖片

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

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

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

圖片

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

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

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

4.4 模型對(duì)比

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

圖片

五、業(yè)務(wù)場(chǎng)景實(shí)踐

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

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

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

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

圖片

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

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

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

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

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

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

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

# 設(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)用之前的最佳模型進(jìn)行預(yù)測(cè)
model.load_my_state_dict(torch.load('MODEL/best_model.h5'))
model.eval()
#使用該模型對(duì)未來(lái)給定步長(zhǎng)進(jìn)行預(yù)測(cè)
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ù)測(cè)結(jié)果與真實(shí)數(shù)據(jù)的對(duì)比情況,橫坐標(biāo)是當(dāng)天的小時(shí)數(shù)。當(dāng)天預(yù)測(cè)的總業(yè)務(wù)量的相對(duì)誤差為1.43%。

圖片

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

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

推測(cè)存在三方面原因:

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

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

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

5.3 落地應(yīng)用&未來(lái)改進(jìn)

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

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

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

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

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

六、方法拓展

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

from causalimpact.misc import standardize
normed_data, _ = standardize(data.astype(np.float32)) #標(biāo)準(zhǔn)化數(shù)據(jù)
obs_data = normed_data.iloc[:70, 0]
# 使用其他時(shí)序模型來(lái)進(jìn)行擬合得到反事實(shí)值
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'))
# 將自義定時(shí)序模型代入CausalImpact包中
ci = CausalImpact(data, pre_period, post_period, model=model)

七、總結(jié)

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

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

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

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

2023-10-27 09:34:34

攜程應(yīng)用

2023-05-03 20:27:49

獨(dú)立預(yù)測(cè)聯(lián)合預(yù)測(cè)多元時(shí)序

2022-04-07 17:30:31

Flutter攜程火車(chē)票渲染

2017-07-06 19:57:11

AndroidMVP攜程酒店

2021-12-12 08:37:18

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

2023-12-08 09:30:11

模型系統(tǒng)工具

2024-12-18 10:20:00

攜程鴻蒙開(kāi)發(fā)

2024-05-27 00:32:45

2020-11-11 13:44:00

攜程旅行點(diǎn)擊量

2018-04-03 14:00:03

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

2022-07-15 12:58:02

鴻蒙攜程華為

2022-11-29 21:00:39

技術(shù)搜索

2023-07-07 12:26:39

攜程開(kāi)發(fā)

2023-07-14 07:15:13

2025-01-03 14:33:41

2025-01-10 13:56:28

2023-12-25 15:00:18

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

2023-09-12 11:36:15

攜程模型

2023-12-29 09:42:28

攜程開(kāi)發(fā)

2024-07-17 09:47:18

點(diǎn)贊
收藏

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