<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>

          3種時間序列混合建模方法的效果對比和代碼實現(xiàn)

          共 4665字,需瀏覽 10分鐘

           ·

          2022-03-19 00:11


          來源:DeepHub IMBA

          本文約2700字,建議閱讀9分鐘

          本文中將討論如何建立一個有效的混合預測器,并對常見混合方式進行對比和分析。


          基于樹的算法在機器學習生態(tài)系統(tǒng)中是眾所周知的,它們以主導表格的監(jiān)督任務而聞名。在學習過程中,樹的分裂標準只關(guān)注相關(guān)特征和有用值的范圍,所以給定一組表格特征和要預測的目標,無需太多配置和特定的預處理就可以得到令人滿意的結(jié)果。

          但是基于樹和梯度提升模型在時間序列預測領(lǐng)域的表現(xiàn)并不好,很多人更傾向于深度學習的方法。這并不奇怪,因為基于樹的模型的弱點在于:在技術(shù)上無法推斷出比訓練數(shù)據(jù)中更高/更低的特征值。他們幾乎不可能預測所見區(qū)間之外的值。相反,經(jīng)典的線性回歸可能較少受到數(shù)據(jù)動態(tài)行為的影響。既然線性回歸擅長推斷趨勢,而梯度提升擅長學習交互,是否可以將它們結(jié)合起來呢?本文目標是創(chuàng)建“混合”預測器,結(jié)合互補的學習算法,讓一個的優(yōu)勢彌補另一個的弱點。

          在使用深度學習時,更容易想到“混合模型”,因為神經(jīng)網(wǎng)絡(luò)的無限架構(gòu)組合和個性化訓練過程在定制方面提供了巨大的好處。使用樹模型開發(fā)定制的混合是比較麻煩的。linear-tree,這個 python 包是一個不錯的選擇,它提供混合模型架構(gòu),混合了基于樹的模型和線性模型的學習能力。不僅如此,LGBM 或 XGBoost 也引入了用樹葉中的線性近似擬合梯度提升的能力。

          在這篇文章中,我嘗試從頭開始構(gòu)建一個混合預測器。下面需要做的就是按照兩步的方法來學習系統(tǒng)模式。

          基礎(chǔ)知識


          為了設(shè)計有效的混合,我們需要對時間序列的構(gòu)建方式有一個大致的了解。時間序列一般可以通過將三個組成部分(趨勢、季節(jié)和周期)加上一個本質(zhì)上不可預測的項(誤差)加在一起來精確描述。

          series = trend + seasons + cycles + error

          學習時間序列組件可以看作是一個迭代過程:

          • 首先,學習趨勢并將其從原始序列中減去,得到殘差序列;
          • 其次,從去趨勢的殘差中學習季節(jié)性并減去季節(jié);
          • 最后,學習周期并減去周期。

          換句話說,我們使用一種算法來擬合特定的組件序列,然后使用另一種算法來擬合殘差序列。最終的預測是各種模型組件的預測相加。

          為了嘗試構(gòu)建混合模型,我們開始生成一些具有雙季節(jié)性模式和趨勢分量的時間序列數(shù)據(jù)。

          np.random.seed(1234)seas1 = gen_sinusoidal(timesteps=timesteps, amp=10, freq=24, noise=4)seas2 = gen_sinusoidal(timesteps=timesteps, amp=10, freq=24*7, noise=4)
          rw = gen_randomwalk(timesteps=timesteps, noise=1)X = np.linspace(0,10, timesteps).reshape(-1,1)X = np.power(X, [1,2,3])m = LinearRegression()trend = m.fit(X, rw).predict(X)
          plt.figure(figsize=(16,4))plt.subplot(121)plt.plot(seas1 + seas2, c='red'); plt.title('Seasonalities')plt.subplot(122)plt.plot(rw, c='black'); plt.plot(trend, c='red'); plt.title('Trend')
          plt.figure(figsize=(16,4))plt.plot(seas1 + seas2 + trend, c='red'); plt.title('Seasonalities + Trend')


          在隨機游走序列上擬合三次多項式可以獲得未知趨勢。結(jié)果是一條平滑的趨勢線,它被添加到季節(jié)性分量中以獲得最終的時間序列。可以通過以這種方式生成多個時間序列,并嘗試預測它們對各種解決方案進行基準測試。

          df.plot(legend=False, figsize=(16,6))


          實驗方法


          本文中嘗試了四種不同的方法:

          • 擬合一個簡單的線性模型;
          • differencing:使用差分變換,使目標變得穩(wěn)定;
          • hybrid additive:擬合具有最優(yōu)的線性模型推斷趨勢。然后用梯度提升對去趨勢序列進行建模;
          • hybrid inclusive.:擬合梯度提升,包括外推趨勢(獲得擬合具有最優(yōu)線性模型擬合的趨勢)作為特征。

          除了最基本的解決方案,上面的所有方法都使用一些樣條變換作為特征。這些特征可以很好地捕捉了季節(jié)性模式。通過在訓練數(shù)據(jù)上搜索最佳線性模型來計算最佳趨勢。使用時間交叉驗證策略搜索一些最佳參數(shù)配置。

          結(jié)果


          對于可以使用的每個系列,都嘗試了上面所有提到的方法,并將結(jié)果存儲在測試數(shù)據(jù)上。

          ### 訓練過程略,請查看最后的完整源代碼 ###
          scores = pd.DataFrame({ f'{score_naive}': mse_naive, f'{score_diff}': mse_diff, f'{score_hybrid_add}': mse_hybrid_add, f'{score_hybrid_incl}': mse_hybrid_incl})
          scores.plot.box(figsize=(11,6), title='MSEs on Test', ylabel='MSE')


          hybrid inclusive 獲得最低的平均測試誤差,其次是差分法。hybrid additive的表現(xiàn)低于我們的預期,因為它的錯誤幾乎是差分方法的三倍。一般來說,在對動態(tài)系統(tǒng)(例如本文的實驗中提出的系統(tǒng))進行建模時,對目標值進行差分操作是一個很好的選擇。混合方法之間的巨大性能差異也表現(xiàn)出了一些問題。讓我們檢查一下下結(jié)果,看看會發(fā)生什么。

          c = 'ts_11'
          df[c].plot(figsize=(16,6), label='true', alpha=0.3, c='black')
          df_diff[c].plot(figsize=(16,6), label='differencing pred', c='magenta')df_hybrid_add[c].plot(figsize=(16,6), label='hybrid addictive pred', c='red')df_hybrid_incl[c].plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')df_naive[c].plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)
          plt.xlim(0, timesteps)plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')plt.legend()

          預測比較1

          c = 'ts_33'
          df[c].plot(figsize=(16,6), label='true', alpha=0.3, c='black')
          df_diff[c].plot(figsize=(16,6), label='differencing pred', c='magenta')df_hybrid_add[c].plot(figsize=(16,6), label='hybrid addictive pred', c='red')df_hybrid_incl[c].plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')df_naive[c].plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)
          plt.xlim(0, timesteps)plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')plt.legend()

          預測比較2

          c = 'ts_73'
          df[c].plot(figsize=(16,6), label='true', alpha=0.3, c='black')
          df_diff[c].plot(figsize=(16,6), label='differencing pred', c='magenta')df_hybrid_add[c].plot(figsize=(16,6), label='hybrid addictive pred', c='red')df_hybrid_incl[c].plot(figsize=(16,6), label='hybrid inclusive pred', c='blue')df_naive[c].plot(figsize=(16,6), label='trend pred', c='lime', linewidth=3)
          plt.xlim(0, timesteps)plt.axvspan(0, timesteps-test_mask.sum(), alpha=0.2, color='orange', label='TRAIN')plt.axvspan(timesteps-test_mask.sum(), timesteps, alpha=0.2, color='green', label='TEST')plt.legend()


          預測比較3

          從上面的一堆圖像中,可以更好地理解additive 方法的“失敗”。它的表現(xiàn)與之前趨勢擬合的好壞密切相關(guān)。如果趨勢估計不準確,那么最終預測將更不準確。但這種行為通過hybrid inclusive方法得到緩解,因為趨勢作為特征包含在模型中。因此梯度提升可以糾正/減輕最終的預測誤差。

          總結(jié)


          在這篇文章中,介紹了建立時間序列混合預測模型的不同方法。需要強調(diào)的重要一點是,除了這里展示的方法外,還有許多方法可以組合機器學習模型。如果我們能清楚理解標準算法是如何工作的,便能夠更輕松地調(diào)試或理解混合創(chuàng)造的可能缺陷或缺陷。

          最后,本文的完整代碼在這里:

          https://github.com/cerlymarco/MEDIUM_NoteBook/tree/master/Hybrid_Trees_Forecasting

          作者:Marco Cerliani


          編輯:黃繼彥

          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  免费无码毛片一区二区本码视频 | 成人性爱片一区 | 日本高清久久 | 影音先锋琪琪色 | 蜜桃视频在线无码播放 |