<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          BiTCN:基于卷積網(wǎng)絡(luò)的多元時(shí)間序列預(yù)測(cè)

          共 6457字,需瀏覽 13分鐘

           ·

          2024-05-18 17:04

             
          來(lái)源:DeepHub IMBA

          本文約3300字,建議閱讀10分鐘

          本文將介紹了BiTCN模型,通過(guò)利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)(TCN),該模型可以編碼過(guò)去和未來(lái)的協(xié)變量,同時(shí)保持計(jì)算效率。


          在時(shí)間序列預(yù)測(cè)領(lǐng)域中,模型的體系結(jié)構(gòu)通常依賴(lài)于多層感知器(MLP)或Transformer體系結(jié)構(gòu)。

          基于mlp的模型,如N-HiTS, TiDE和TSMixer,可以在保持快速訓(xùn)練的同時(shí)獲得非常好的預(yù)測(cè)性能?;赥ransformer的模型,如PatchTST和ittransformer也取得了很好的性能,但需要更多的內(nèi)存和時(shí)間來(lái)訓(xùn)練。

          有一種架構(gòu)在預(yù)測(cè)中仍未得到充分利用:卷積神經(jīng)網(wǎng)絡(luò)(CNN)。CNN已經(jīng)應(yīng)用于計(jì)算機(jī)視覺(jué),但它們?cè)陬A(yù)測(cè)方面的應(yīng)用仍然很少,只有TimesNet算是最近的例子。但是CNN已經(jīng)被證明在處理序列數(shù)據(jù)方面是有效的,并且它們的架構(gòu)允許并行計(jì)算,這可以大大加快訓(xùn)練速度。

          在本文中,我們將詳細(xì)介紹了BiTCN,這是2023年3月在《Parameter-efficient deep probabilistic forecasting》一文中提出的模型。通過(guò)利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)(TCN),該模型可以編碼過(guò)去和未來(lái)的協(xié)變量,同時(shí)保持計(jì)算效率。

          BiTCN

          BiTCN使用了兩個(gè)時(shí)間卷積網(wǎng)絡(luò),因此被稱(chēng)為BiTCN。一個(gè)TCN負(fù)責(zé)編碼未來(lái)的協(xié)變量,而另一個(gè)負(fù)責(zé)編碼過(guò)去的協(xié)變量和序列的歷史值。這樣模型可以從數(shù)據(jù)中學(xué)習(xí)時(shí)間信息,并且卷積的使用保持了計(jì)算效率。

          讓我們仔細(xì)看看它的架構(gòu),BiTCN的體系結(jié)構(gòu)由許多臨時(shí)塊組成,其中每個(gè)塊由:

          一個(gè)擴(kuò)張卷積,一個(gè)GELU激活函數(shù),然后是dropout ,最后緊接著一個(gè)全連接的層。

          上圖中可以看到每個(gè)時(shí)態(tài)塊產(chǎn)生一個(gè)輸出o,最終的預(yù)測(cè)是將每個(gè)塊的所有輸出疊加在N層中得到的。

          雖然dropout層和全連接層是神經(jīng)網(wǎng)絡(luò)中常見(jiàn)的組件,所以我們?cè)敿?xì)地?cái)U(kuò)張卷積和GELU激活函數(shù)。

          擴(kuò)張卷積

          為了更好地理解擴(kuò)展卷積的目的,我們回顧一下默認(rèn)卷積是如何工作的。

          在上圖中,我們可以看到一維輸入的典型卷積。輸入序列左填充零,以確保輸出長(zhǎng)度相同。

          如果核大小為3,步幅為1,,則輸出張量的長(zhǎng)度也為4。

          可以看到,輸出的每個(gè)元素都依賴(lài)于三個(gè)輸入值。也就是說(shuō)輸出取決于索引處的值和前兩個(gè)值。

          這就是我們所說(shuō)的感受野。因?yàn)槲覀冋谔幚頃r(shí)間序列數(shù)據(jù),所以增加接受域?qū)⑹怯幸娴?,這樣輸出的計(jì)算可以著眼于更長(zhǎng)的歷史。

          我們可以簡(jiǎn)單的增加核的大小,或者堆疊更多的卷積層。但增加內(nèi)核大小并不是最好的選擇,因?yàn)榭赡軙?huì)丟失信息,并且模型可能無(wú)法學(xué)習(xí)數(shù)據(jù)中的有用關(guān)系。那么疊加更多的卷積如何呢?

          可以看到,通過(guò)使用核大小為3的卷積操作堆疊兩個(gè)卷積,輸出的最后一個(gè)元素現(xiàn)在依賴(lài)于輸入的五個(gè)元素,感受野從3個(gè)增加到5個(gè)。

          但是以這種方式增加接受野將導(dǎo)致非常深的網(wǎng)絡(luò),所以就出現(xiàn)了使用擴(kuò)展卷積,它可以在增加感受野,同時(shí)避免向模型添加太多層。

          在上圖中,我們可以看到運(yùn)行擴(kuò)展卷積的結(jié)果。每?jī)蓚€(gè)元素都會(huì)生成一個(gè)輸出。因此可以看到,我們現(xiàn)在有5個(gè)感受野,而不需要堆疊卷積。

          為了進(jìn)一步增加接受野,我們使用膨脹基數(shù)(通常設(shè)置為2)堆疊許多稀釋的核。這意味著第一層將是21膨脹的核,然后是22膨脹的內(nèi)核,然后是23,以此類(lèi)推。

          這樣模型可以考慮更長(zhǎng)的輸入序列來(lái)生成輸出。通過(guò)使用膨脹基數(shù)可以保持合理的層數(shù)。

          GELU激活函數(shù)

          許多深度學(xué)習(xí)架構(gòu)采用了ReLU激活函數(shù)。

          可以看到ReLU只是取0和輸入之間的最大值。也就是說(shuō)如果輸入為正,則返回輸入。如果輸入為負(fù),則返回零。

          雖然ReLU有助于緩解梯度消失的問(wèn)題,但它也會(huì)產(chǎn)生所謂的“Dying ReLU”問(wèn)題。當(dāng)網(wǎng)絡(luò)中的某些神經(jīng)元只輸出0時(shí),就會(huì)發(fā)生這種情況,這意味著它們不再對(duì)模型的學(xué)習(xí)做出貢獻(xiàn)。為了應(yīng)對(duì)這種情況,可以使用GELU。

          有了這個(gè)函數(shù),當(dāng)輸入小于零時(shí),激活函數(shù)允許小的負(fù)值。

          這樣神經(jīng)元就不太可能消亡,因?yàn)榉橇阒悼梢杂秘?fù)輸入返回。為反向傳播提供了更豐富的梯度,并且我們可以保持模型能力的完整性。

          BiTCN完整架構(gòu)

          現(xiàn)在我們了解了BiTCN中臨時(shí)塊的內(nèi)部工作原理,讓我們看看它是如何在模型中組合在一起的。

          在上圖中可以看到滯后值在通過(guò)密集層和時(shí)間塊堆棧之前與所有過(guò)去的協(xié)變量組合在一起。

          我們還看到分類(lèi)協(xié)變量首先被嵌入,然后再與其他協(xié)變量組合。這里過(guò)去和未來(lái)的協(xié)變量都組合在一起,如下所示。輸出則是來(lái)自滯后值和協(xié)變量的信息的組合,如下所示。

          上圖額藍(lán)點(diǎn)表示輸入序列,黃點(diǎn)表示輸出序列,紅點(diǎn)表示未來(lái)協(xié)變量。我們可以看到具有擴(kuò)展卷積的前瞻性時(shí)間塊如何通過(guò)處理來(lái)自未來(lái)協(xié)變量的信息來(lái)幫助告知輸出。

          最后,BiTCN使用學(xué)生t分布來(lái)構(gòu)建預(yù)測(cè)周?chē)闹眯艆^(qū)間。

          使用BiTCN進(jìn)行預(yù)測(cè)

          下面我們將BiTCN與N-HiTS和PatchTST一起應(yīng)用于長(zhǎng)期預(yù)測(cè)任務(wù)。

          我們用它來(lái)預(yù)測(cè)一個(gè)博客網(wǎng)站的每日瀏覽量。該數(shù)據(jù)集包含每日瀏覽量,以及外生特征,如新文章發(fā)表日期的指標(biāo),以及美國(guó)假期的指標(biāo)。

          我們使用庫(kù)neuralforecast,因?yàn)檫@是唯一一個(gè)提供支持外生特性的BiTCN的即用型實(shí)現(xiàn)的庫(kù)。本文的代碼和數(shù)據(jù)都會(huì)在最后提供。

             
           import pandas as pd import numpy as np import matplotlib.pyplot as plt
          from neuralforecast.core import NeuralForecast from neuralforecast.models import NHITS, PatchTST, BiTCN

          將數(shù)據(jù)讀入DataFrame。

          df = pd.read_csv('https://raw.githubusercontent.com/marcopeix/time-series-analysis/master/data/medium_views_published_holidays.csv') df['ds'] = pd.to_datetime(df['ds'])


          可以先看看數(shù)據(jù):


             
           published_dates = df[df['published'] == 1] holidays = df[df['is_holiday'] == 1]
          fig, ax = plt.subplots(figsize=(12,8))
          ax.plot(df['ds'], df['y']) ax.scatter(published_dates['ds'], published_dates['y'], marker='o', color='red', label='New article') ax.scatter(holidays['ds'], holidays['y'], marker='x', color='green', label='US holiday') ax.set_xlabel('Day') ax.set_ylabel('Total views') ax.legend(loc='best')
          fig.autofmt_xdate()
          plt.tight_layout()


          我們可以清楚地看到每周的季節(jié)性,工作日的訪(fǎng)問(wèn)量比周末要多。

          訪(fǎng)問(wèn)高峰通常伴隨著新文章的發(fā)布(用紅點(diǎn)表示),因?yàn)樾聝?nèi)容通常會(huì)帶來(lái)更多的流量。最后還可以看到美國(guó)的節(jié)假日(用綠色十字標(biāo)記)通常意味著流量較低。

          所以我們可以確定,這是一個(gè)受外生特征影響明顯的數(shù)據(jù),它可以成為BiTCN的一個(gè)很好的用例。

          數(shù)據(jù)處理

          我們將數(shù)據(jù)分成訓(xùn)練集和測(cè)試集。我們保留最后28個(gè)條目進(jìn)行測(cè)試。

          train = df[:-28] test = df[-28:]


          然后,我們創(chuàng)建一個(gè)DataFrame,其中包含預(yù)測(cè)范圍的日期,以及外生變量的未來(lái)值。


          提供外生變量的未來(lái)值是有意義的,因?yàn)槲磥?lái)的美國(guó)假期日期是提前知道的,并且文章的發(fā)布也是可以有計(jì)劃的。

          future_df = test.drop(['y'], axis=1)


          建模


          我們?cè)谶@個(gè)項(xiàng)目中使用了N-HiTS(基于mlp), BiTCN(基于cnn)和PatchTST(基于transformer)。

          N-HiTS和BiTCN都支持外生特征建模,但PatchTST不支持。

          這個(gè)實(shí)驗(yàn)的步長(zhǎng)被設(shè)置為28,因?yàn)檫@覆蓋了我們測(cè)試集的整個(gè)長(zhǎng)度。

             
          horizon = len(test)
          models = [ NHITS( h=horizon, input_size = 5*horizon, futr_exog_list=['published', 'is_holiday'], hist_exog_list=['published', 'is_holiday'], scaler_type='robust'), BiTCN( h=horizon, input_size=5*horizon, futr_exog_list=['published', 'is_holiday'], hist_exog_list=['published', 'is_holiday'], scaler_type='robust'), PatchTST( h=horizon, input_size=2*horizon, encoder_layers=3, hidden_size=128, linear_hidden_size=128, patch_len=4, stride=1, revin=True, max_steps=1000 ) ]

          然后,我們簡(jiǎn)單地在訓(xùn)練集上擬合我們的模型。

             
          nf = NeuralForecast(models=models, freq='D'nf.fit(df=train)

          使用外生特征的未來(lái)值來(lái)生成預(yù)測(cè)。

          preds_df = nf.predict(futr_df=future_df)


          評(píng)估模型


          首先將預(yù)測(cè)值和實(shí)際值連接到一個(gè)DataFrame中。

          test_df = pd.merge(test, preds_df, 'left''ds')


          根據(jù)實(shí)際值繪制預(yù)測(cè)圖,結(jié)果如下圖所示。


          在上圖中,我們可以看到所有模型似乎都過(guò)度預(yù)測(cè)了實(shí)際流量。讓用MAE和sMAPE來(lái)看看模型的實(shí)際對(duì)比:

             
          from utilsforecast.losses import mae, smapefrom utilsforecast.evaluation import evaluate
           evaluation = evaluate( test_df, metrics=[mae, smape], models=["NHITS", "BiTCN", "PatchTST"], target_col="y", )
          evaluation = evaluation.drop(['unique_id'], axis=1) evaluation = evaluation.set_index('metric')
          evaluation.style.highlight_min(color='blue', axis=1)

          可以看到BiTCN實(shí)現(xiàn)了最好的性能,因?yàn)樵撃P偷腗AE和sMAPE是最低的。

          雖然這個(gè)實(shí)驗(yàn)本身并不是BiTCN的穩(wěn)健基準(zhǔn),但是可以證明它在具有外生特征的預(yù)測(cè)環(huán)境中取得了最佳結(jié)果。

          總結(jié)

          BiTCN模型利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)對(duì)協(xié)變量的過(guò)去值和未來(lái)值進(jìn)行編碼,以實(shí)現(xiàn)有效的多變量時(shí)間序列預(yù)測(cè)。

          在我們的小實(shí)驗(yàn)中,BiTCN取得了最好的性能,卷積神經(jīng)網(wǎng)絡(luò)在時(shí)間序列領(lǐng)域的成功應(yīng)用很有趣,因?yàn)榇蠖鄶?shù)模型都是基于mlp或基于transformer的。

          BiTCN:Parameter-efficient deep probabilistic forecasting
          https://www.sciencedirect.com/science/article/pii/S0169207021001850

          最后本文的代碼:

          https://github.com/marcopeix/time-series-analysis/blob/master/bitcn_blog.ipynb


          作者:Marco Peixeiro


          編輯:黃繼彥

          瀏覽 160
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产mv和日韩 | 黄色免费在线观看视频网站 | yw视频在线观看 | 91丝袜足交 | 高清无码黄|