用廣義加性模型GAM進行時間序列分析

原文:http://tecdat.cn/?p=4130算法

每當你發現一個與時間對應的趨勢時,你就會看到一個時間序列。研究金融市場表現和天氣預報的事實上的選擇,時間序列是最廣泛的分析技術之一,由於它與時間有着不可分割的關係 - 咱們老是有興趣預測將來。數據庫

時間相關模型

一種直觀的預測方法是參考最近的時間點。今天的股價可能會比昨天的價格更接近五年前的價格。所以,在預測今天的價格時,咱們會比最近的價格更重要。過去和如今值之間的這些相關性代表了時間依賴性,它造成了一種流行的時間序列分析技術ARIMA(自迴歸整合移動平均線)的基礎。ARIMA既考慮季節變化又考慮過去的一次性「衝擊」以做出將來預測。網絡

可是,ARIMA作出了嚴格的假設。要使用ARIMA,趨勢應該有規律的時期,以及不變的均值和方差。例如,若是咱們想分析一個增加的趨勢,咱們必須首先對趨勢進行轉型,使其再也不增長,而是停滯不前。並且,若是咱們缺乏數據,ARIMA將沒法工做。函數

爲了不將咱們的數據擠壓到模具中,咱們能夠考慮一種替代方法,如神經網絡。長期短時間記憶(LSTM)網絡是一種基於時間依賴性創建模型的神經網絡。雖然高度準確,但神經網絡缺少可解釋性 - 很難肯定致使特定預測的模型組件。測試

模型

除了使用相似時間點的值之間的相關性以外,咱們能夠退後一步對總體趨勢進行建模。時間序列能夠被看做是個體趨勢的總和。舉例來講,谷歌搜索柿子,一種水果的趨勢。spa

從圖1中,咱們能夠推斷柿子多是季節性的。隨着11月份供應量達到峯值,雜貨店的顧客可能會被要求谷歌養分知識或柿子食譜。.net

圖1.谷歌搜索'柿子'的季節性趨勢,來自http://rhythm-of-food.net/per...3d

此外,谷歌搜索柿子的狀況在過去幾年中也愈來愈頻繁。blog

圖2.來自http://rhythm-of-food.net/per...「柿子」的整體增加趨勢教程

所以,柿子谷歌搜索趨勢能夠經過在增加趨勢增長的季節性趨勢中進行建模,即所謂的廣義加性模型(GAM)。

GAM背後的原理與迴歸類似,不一樣之處在於代替各個預測因子的求和效應,GAM是平滑函數的總和。函數容許咱們對更復雜的模式進行建模,並對它們進行平均,以得到更平滑的平滑曲線。

由於GAM是基於函數而不是變量的,因此它們不受限於迴歸中的線性假設,即要求預測變量和結果變量以直線移動。此外,與神經網絡不一樣,咱們能夠分離和研究GAM中各個功能對結果預測的影響。

在本教程中,咱們將:

查看如何使用GAM的示例。

瞭解GAM中的函數如何經過從新裝配來識別。

瞭解如何驗證時間序列模型。

例如:保存夏令時

住在四季地區的人會知道一個事實:冬季的陽光比夏季少。爲了彌補這一缺陷,一些國家在夏季的時候將時鐘向前移動了一個小時,爲夜間戶外活動安排了更多的陽光,並有望減小用於家中取暖和照明的能量。夏季推動時鐘的作法稱爲夏令時(DST),並於20世紀初實施。

可是DST的實際好處仍然存在爭議。值得注意的是,DST已被證實會擾亂影響工做績效甚至致使事故的睡眠模式。所以,不管什麼時候什麼時候調整時鐘,人們都會被提示質疑DST的基本原理,而維基百科是答案的來源之一。

爲了研究DST頁面瀏覽的趨勢,咱們首先使用Python腳本從維基百科數據庫中提取數據。使用了從2008年到2015年的瀏覽量。接下來,咱們使用由Facebook研究人員發佈的稱爲Prophet的GAM包來進行Python中的時間序列分析。該軟件包也可在R中找到。

的先知包是用戶友好的,使咱們可以指定不一樣類型的,包括所獲得的GAM趨勢的功能。有三種主要類型的功能:

整體增加。這能夠建模爲直線(線性)或稍微彎曲(邏輯)的趨勢。在這個分析中,咱們使用默認的線性增加模型。

季節性變化。這是使用傅里葉級數模型化的,它只是一種近似周期函數的方法。確切的功能是使用一種稱爲倒裝的過程推導出來的,下一節將對此進行解釋。咱們能夠指定咱們是否預計每週或/和年度趨勢存在。在這個分析中,咱們包括兩種狀況 - 基於過去的研究,每週趨勢彷佛是合理的,週末時人們極可能會在室外的網絡活動較少,而年度趨勢可能與一年兩次的時鐘轉換練習一致。

特別活動。除了模擬常規趨勢以外,咱們還應該考慮一次性事件。這包括任何現象,不管是政策公告仍是天然災害,都會爲平滑的趨勢增添漣漪。若是咱們不考慮不規則事件,GAM可能會將它們誤認爲是持續事件,其影響將被錯誤地傳播。

在咱們的分析中,特殊事件包括美國鐘錶來回切換的確切日期。咱們還能夠在每一個事件以前和以後指定窗口,咱們預計會有重大影響。例如,在每次切換以前,DST上的聯機搜索可能會開始增長。可是時間切換後的搜索行爲可能會有所不一樣,具體取決於時鐘是向前仍是向後蜿蜒:人們可能更有可能在網上搜索他們睡眠不足的緣由,但當他們獲得額外的小睡時不會。除了時鐘轉換日期以外,咱們還包括主要的DST相關事件。例如,2010年,因爲希伯來語和太陽日曆的差別,以色列在異常早期轉向冬季時發生了抗議活動。咱們分析中包含的事件能夠在代碼中找到。

除上述以外,Prophet包還要求咱們指定先前的值,這些值決定了趨勢線對數據值變化的敏感程度。較高的靈敏度會致使更多鋸齒狀的趨勢,這可能會影響對將來值的廣泛性。當咱們驗證咱們的模型時,能夠調整Priors,咱們將在本教程後面看到。

如今,咱們能夠繼續適應GAM。圖3顯示了整體增加,特殊事件和季節性變化的結果函數:

圖3.包含GAM預測DST維基百科文章頁面視圖的函數。在總體趨勢和特殊事件(即'節假日')的前兩張圖中,X軸標記爲'ds',表明'日期戳記'。出現重複的年份標籤,由於網格線與每一年的相同日期不一致。

咱們能夠看到,DST維基百科文章的總體頁面瀏覽量多年來一直在降低,這多是因爲競爭在線來源解釋DST。咱們還能夠觀察與特殊事件相吻合的頁面瀏覽量峯值是如何計算的。每週趨勢顯示,人們最有可能在星期一閱讀DST,最不可能在週末閱讀。最後,年度趨勢顯示,頁面瀏覽量在三月底和十月底發生高峯期,即時間轉換髮生的時間段。

咱們不須要知道包含在GAM中的確切預測函數是很方便的。相反,咱們只須要指定一些約束條件,最好的功能就會自動爲咱們導出。GAM如何作到這一點?

反擬合算法

爲了找到適合數據的最佳趨勢線,GAM使用稱爲倒裝的程序。反擬合是一個迭代地調整GAM中的函數的過程,以便它們產生使預測偏差最小化的趨勢線。一個簡單的例子能夠用來講明這個過程。

假設咱們有如下數據:

圖4.示例數據集,由兩個預測變量和一個結果變量組成。

咱們的目標是找到適用於預測因子的適當函數,以便咱們能夠準確預測結果。

首先,咱們致力於爲預測變量1找到一個函數。一個好的初始猜想多是將它乘以2:

圖5.將「乘以2」函數應用於預測器1的模型的結果。

從圖5能夠看出,經過對預測變量1應用「乘以2」的函數,咱們能夠完美地預測50%的結果。可是,還有改進的空間。

接下來,咱們致力於爲預測變量2找到函數。經過分析擬合預測變量1函數的預測偏差,咱們能夠看到,只要預測變量2具備正值,只需將結果加1便可達到100%的準確度,而且別的什麼都不作(即signmoid函數)。

這是一個倒裝過程的要點,總結了如下步驟:

步驟0:爲一個預測器定義一個函數並計算出結果的偏差。

步驟1:爲最能減小錯誤的下一個預測器推導一個函數。

步驟2:對全部預測變量重複步驟1,並進一步重複循環以在必要時從新評估其功能,直到預測偏差不能進一步最小化。

如今咱們已經擬合了咱們的模型,咱們須要對其進行測試:它可以準確預測將來的值嗎?

驗證時間序列模型

交叉驗證是評估模型預測將來價值有效性的首選技術。可是,時間序列模型是交叉驗證不起做用的一個例外。

回想一下,交叉驗證涉及將數據集分紅隨機子樣本,用於重複訓練和測試模型。關鍵的是,訓練樣本中使用的數據點必須獨立於測試樣本中的數據點。但這在時間序列中是不可能的,由於數據點是時間依賴的,因此訓練集中的數據仍然會與測試集數據攜帶基於時間的關聯。這須要不一樣的技術來驗證時間序列模型。

咱們能夠根據時間段對它們進行切片,而不是隨着時間對咱們的數據點進行採樣。若是咱們想在將來一年(即預測時間範圍)測試模型的預測準確性,咱們能夠將數據集劃分爲一年(或更長)的培訓分部,並使用每一個分部預測其下一年的數值。這種技術被稱爲模擬歷史預測。做爲指導,若是咱們的預測範圍是一年,那麼咱們應該每半年進行一次模擬預測。圖6顯示了11個DST維基百科頁面瀏覽量的模擬預測結果。

圖6. DST維基百科頁面瀏覽的模擬歷史預測。

在圖6中,預測範圍爲一年,每一個培訓部分包含三年的數據。例如,第一個預測頻段(紅色)使用2008年1月至2010年12月的數據來預測2011年1月 - 2011年12月的觀點。咱們能夠看到,除了前兩個模擬預測外,這些模擬預測被異常高的頁面活動所誤導在2010年,預測一般與實際值重疊。

爲了更好地評估模型的準確性,咱們能夠從全部11個模擬預測中獲取平均預測偏差,並將其與預測時間範圍進行比較,如圖7所示。注意,隨着咱們試圖進一步預測將來,偏差會如何增長。

圖7.預測範圍內的預測偏差。紅線表示11個模擬預測的平均絕對偏差,而黑線表示該偏差的平滑趨勢。

回想一下,咱們須要調整的一個參數是先驗值,它決定了咱們的趨勢對數據值變化的敏感程度。一種方法是嘗試不一樣的參數值,並經過如圖8所示的圖進行比較。正如咱們所看到的,過大的事先致使不太廣泛的趨勢,從而致使更大的錯誤。

圖8.比較不一樣的先前值致使的預測偏差。

除了調整先行者以外,咱們還能夠調整基礎增加模型,季節性趨勢和特殊事件的設置。對咱們的數據進行可視化也有助於咱們識別和刪除異常值。例如,咱們能夠經過排除2010年的數據來改進預測,在此期間頁面瀏覽次數很是高。

限制

正如你可能猜想的那樣,在時間序列中有更多的訓練數據不必定會致使更準確的模型。異常值或快速變化的趨勢可能會加重任何預測工做。更糟糕的是,對時間序列產生永久影響的忽然震盪也可能使全部過去的數據可有可無。

所以,時間序列分析最適合穩定和系統的趨勢,咱們能夠經過可視化來評估趨勢。

概要

時間序列分析是一種技術,能夠推導出一段時間內的趨勢,可用於預測將來的數值。廣義相加模型(GAM)經過識別和累加多個函數來實現這一點,從而獲得最適合數據的趨勢線。

GAM中的函數可使用反擬合算法來識別,該算法迭代地擬合和調整函數以減小預測偏差。

時間序列分析最適合穩定和系統的趨勢。

相關文章
相關標籤/搜索