(Python)時序預測的七種方法
介紹
大多數人都聽說過關於Cryptocurrency,許多人也許會投資他們的加密貨幣。但是,投資這種不穩定的貨幣安全嗎?怎樣才能確保現投資這些硬幣未來一定能帶來穩定的收益呢?我們不能確定,但肯定能根據以前的價格產生一個近似值。時序模型是預測的一種方法。
除了加密貨幣,還有許多重要的應用時序預測的領域,例如:銷售預測,呼叫中心的通話量,太陽的活動,海潮,股市行為等等。
目錄
- 理解問題描述和資料集
- 安裝庫
- 方法 1 –以簡單的方式開始
- 方法2 – 簡單平均數
- 方法3 – 移動平均數
- 方法 4 –指數平滑法
- 方法5 – Holt線性趨勢法
- 方法6 – Holt冬季季節法
- 方法7 –綜合自迴歸移動平均法(ARIMA)
理解問題描述和資料集
提供了涉及預測JetRail通勤人數的時序問題,一個新的高速鐵路服務。我們提供了2年的資料,並利用這些資料預測未來7個月的通勤人數。
在本文中,只使用訓練資料集。
從以上的報表上看到,我們有2年的按小時計的通勤資料(2012-2014),需要預估未來的通勤數量。
在本文中,我構造子集和彙總資料集以便講解不同的方法。
- 構造資料集的子集 (2012/08 – 2013/12)
- 為建模構造訓練和測試檔案。前14個月的資料被用作訓練資料(2012/08 - 2013/10),後兩個月的被用作測試資料(2013/11 - 2013/12)。
- 每天彙總資料集。
把資料(用於訓練的和測試的)視覺化,以瞭解在一段時間內是如何變化的。
安裝庫(statsmodels )
用來進行時序預測的庫是statsmodels。在應用很少的給定方法之前,需要安裝一下。statsmodels可能已經安裝在你的Python開發環境了,但它不支援的預測方法。我們將從儲存庫克隆一下並進行原始碼安裝。按照如下步驟 :
1.使用PIP凍結檢查statsmodels是否已經安裝在你的環境中;
2.如果已經存在,使用“conda remove statsmodels” 刪除;
3.用 “git clone git://github.com/statsmodels/statsmodels.git”克隆statsmodels的儲存庫,在克隆前用“git init”初始化Git;
4.用“cd statsmodels”
5.用“python setup.py build”建安裝檔案;
6.用“python setup.py install”進行安裝;
7.退出bash/terminal;
8.重啟bash/terminal,開啟python並執行“from statsmodels.tsa.api import ExponentialSmoothing”進行驗證;
方法1: 用Naive方法開始
考慮下面的曲線圖:
從圖中我們可以看出,從一開始,硬幣的價格是穩定的。大多時候我們都有一個在整個時間段都比較穩定的資料集。如果想預測第二天的價格,可以簡單地用前一天的價格資料,估計第二天的價格。這種假定下一個期望點等於最後一個觀測點的預測技術稱為 Naive方法。
現在我們採用Naive 方法來預測測試資料的價格。
現在我們將計算均方根誤差(RMSE)以檢查測試資料集上模型的精度。
可以從RMSE值和上面的圖推斷,Naive方法不適合變化頻繁的資料集,它最適合穩定的資料集。
方法2 簡單均值法
考慮下面的圖。
可以從圖中推斷,硬幣的價格是以微小的幅度隨機上升和下降的,平均值不變。很多時候,我們得到了一個數據集,雖然它在整個時間段內有一個較小的變化,但是每個時間段的平均值保持不變。在這種情況下,我們可以預測第二天的價格與之前每天的平均值相近。
這種預測期望值等於所有觀測點平均值的預測技術稱為簡單均值法。
我們取前面已知的所有值,計算平均值,並將其作為下一個值。當然,它並不精確,而是稍微接近。作為一種預測方法,實際情況是這個技術最有效。
現在將計算均方根誤差檢查模型的準確性
可以看出這種模式沒有提高我們的分數。因此,我們能從得分推斷,這種方法在每個時間段的平均值保持不變的時候效果最好。雖然Naive法的得分優於均值法,但這並不意味著Naive法在所有資料集上都優於均值法。
方法3 移動均值法
考慮下面曲線圖,
從圖中可以推斷,硬幣的價格在一段時間以前大幅度地提高了,但現在是穩定的。很多時候,我們得到了一個數據集,其中一段時間以前物件的價格/銷售量急劇增加/急劇下降。使用初期的價格會對下一個時間段的預測產生很大影響。所以相對於簡單均值法的改進,只計算最後幾個時間段的平均價格。顯然,只有最近的值才是重要的。這種利用時間窗計算平均值的預測技術稱為移動均值法。
利用一個簡單的移動均值模型,根據一個不變的有限數p的平均值來預測時間序列中的下一個或多個值。因此,對所有的 i > p。
移動均值法實際上是非常有效的,尤其是當你給序列選擇正確的p值時。
我們只選擇了過去2個月的資料。現在將計算均方根誤差來檢查模型的準確性。
可以看到,Naive方法對於資料集要優於均值法和移動均值法。現在來看一下簡單指數平滑法,看看它是如何執行的。
移動均值法的改進方法——加權移動均值法。在上述移動均值法中,我們同樣權衡過去的N個觀測值。但我們可能遇到的情況是,過去的每一次觀察都以不同的方式影響預測。這種以不同的方式權衡過去觀測值的技術稱為加權移動均值技術。
加權移動均值是一個移動平均值,在滑動視窗的值中賦予不同的權重。
選擇視窗的大小,需要一個權重列表。例如,如果選擇[ 0.40,0.25,0.20,0.15 ]作為權重,將分別給出40%,25%,20%和15%。
方法4 簡單指數平滑法
在理解了上述方法之後,可以注意到,簡單均值法和加權移動均值法是完全相反的。我們需要在這兩個方法之間採取某種方法,這兩個方法在用不同的方式權衡資料點的同時要考慮所有資料。這種技術稱為簡單指數平滑法。預測是用加權平均來計算的,之前觀測值的權重是指數遞減的,最小的權重與最早的觀測值相關:
0≤ α ≤1是引數。
先一步預測時間T + 1是一個序列中的所有觀測值的加權平均值Y1,…,YT。權重下降的速率由引數α決定。
如果觀察足夠長的時間,你會看到,期望ŷx是α⋅YT和(1−α)⋅ŶT-1的和。
也可以寫成 :
所以基本上我們已經有了一個1−α和α的加權移動平均值:。
可以看到,1−α乘以之前預期的表達遞迴的值ŷx−1。這就是為什麼這種方法被稱為Exponential。在時間t + 1的預測等於最近觀察值yt 和最近預測值 ŷ t|t−1之間的加權平均值。
現在將計算均方根誤差檢查模型的準確性。
可以看到,用alpha值為0.6的簡單指數模型形成一個更好的模型,到現在為止,生成一個更好的模型。
方法 5 霍爾特線性趨勢法
我們現在已經學會了幾種預測方法,但可以看到,這些模型在變化較大資料上不是太好。
趨勢是在一段時間內觀察到的價格的一般模式。如Naive方法會假定最後兩點之間的趨勢將保持不變,或者可以在所有點之間的平均斜率得到一個平均趨勢,使用移動趨勢均值或指數平滑法。
但我們需要一種方法,能準確無誤地繪製趨勢圖。考慮資料集趨勢的這種方法稱為霍爾特線性趨勢法。每個時間序列的資料集可以被分解為不同趨勢的組成部分,季節性和剩餘。任何跟隨趨勢的資料集都可以使用Holt線性趨勢法進行預測。
從圖表可以看出,該資料集呈增長趨勢。因此,可以用Holt的線性趨勢來預測未來的價格。
霍爾特擴充套件簡單指數平滑方法,允許有趨勢的資料預測。它只適用於兩個等級(多個序列的平均值)和趨勢的指數平滑方法。用數學符號表示,現在需要三個等式:一個用於等級,一個用於趨勢,一個結合等級與得到預測值Ŷ的趨勢
我們在上述演算法中預測的值稱為等級。在上面的三個等式中,可以注意到我們增加了等級和趨勢來生成預測等式。
作為簡單指數平滑法,這裡的等級等式表明它是一個觀察數的加權平均值和樣本內前步預測。趨勢等式表明,這是一個基於ℓ(t)−ℓ(t−1)和和b(t−1)的時間t的預測趨勢的加權平均值。
我們將新增這些等式來生成預測等式。也可以通過乘以趨勢和等級而不是增加,來生成乘法預測等式。當趨勢呈線性上升或下降時,則採用加法等式,而當趨勢呈指數下降時,則採用乘法等式。實踐表明乘法是一種更穩定的預測,但加性方法更容易理解。
現在將計算均方根誤差檢查模型的準確性
方法6 Holt-Winters方法
考慮一個位于山上的旅館。在夏季期間有很高的訪問量,而今年餘下時間的遊客相對較少。因此,業主的利潤在夏季比其他季節都要好得多。而且每年都一樣,是季節性的。資料集在一段固定的時間間隔內顯示出相似性。
由於季節性因素,使用霍爾特冬季方法將是其它模型中最好的選擇。霍爾特-溫特斯季節性方法包括預測等式和三個平滑等式-一個似乎等級ℓt,一個是趨勢bt,一個是季節組成部分 st,平滑引數α,β和γ。
其中S是季節性週期的長度,0≤α≤1, 0≤β≤1和0≤γ≤1。
現在將計算均方根誤差檢查模型的準確性
從圖中可以看出,正確的趨勢和季節性的對映提供了一個更好的解決方案。
方法7 ARIMA
另一個在資料科學家中非常流行的時間序列模型是ARIMA。它代表自迴歸積分移動平均(Autoregressive Integrated Moving average)。指數平滑模型是基於對趨勢和季節性資料的描述,ARIMA模型的目的是描述資料之間的相關性。ARIMA的改進考慮到資料集的季節性,就像Holt-Winters方法一樣。
現在將計算均方根誤差檢查模型的準確性。
可以看到,使用季節性ARIMA生成一個類似Holt’s Winter的解決方案。我們選擇的引數為ACF和PACF圖。
可以在RMSE分數的基礎上比較這些模型。
以上為譯文。
文章原標題《7 methods to perform Time Series forecasting (with Python codes)》,
譯者:Mags,審校:袁虎。
閱讀更多幹貨好文,請關注掃描以下二維碼: