生活随笔
收集整理的這篇文章主要介紹了
机器学习-预测之时间序列分析预测法原理及实战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間序列分析預測法
簡介
在之前,寫了不少關于分類的算法,其中有傳統機器學習算法如KNN、SVM,也有深度學習領域的算法如多層感知機,但是可以發現這里的算法核心思路都沒有變化,利用一部分已有標簽的數據訓練模型,讓模型去處理沒有標簽的數據。其實這里的分類只是分類的一種叫做有監督分類(有給定的標準,就是訓練集),還有一種分類叫做無監督分類(沒有標準),只是將特征接近的歸為一類,又稱為聚類問題。聚類的問題稍有復雜會在后面提到,這里會提及數據挖掘領域另一個大的問題方向—預測。
時序預測
預測是人們根據事物的發展規律、歷史和現狀,分析影響其變化的因素,對其發展前景和趨勢的一種推測。預測的方法和形式多種多樣,根據方法本身的性質特點將預測方法分為定性預測方法、時間序列分析、因果關系預測。
時間序列分析預測法是一種定性分析方法,它是在時間序列變量分析的基礎上,運用一定的數學方法建立預測模型,使時間趨勢向外延伸,從而預測市場的發展變化趨勢,確定變量預測值,也稱為時間序列分析法、歷史延伸法和外推法。
- 確定性時間序列分析預測法
- 這種預測方法使用的數學模型是不考慮隨機項的非統計模型,是利用反映事物具有確定性的時間序列進行預測的方法,包括平均法、指數平滑法、趨勢外推法、季節指數預測法等。
- 隨機性時間序列分析預測法
- 這種方法是利用反映事物具有隨機性的時間序列進行預測的方法。它的基本思想是假定預測對象是一個隨機時間序列,然后利用統計數據估計該隨機過程的模型,根據最終的模型做出最佳的預測。由于這種方法考慮的因素比較多,計算過程復雜,計算量大,因此發展緩慢。一般市場預測使用的是確定性分析預測法。
原理
一般,時間序列分析通常將各種可能發生作用的因素進行分類,傳統的分類方法是按各種因素的特點或影響效果分為四大類:長期趨勢(T),季節變動(S),循環變動(C)和不規則變動(I)。
時間序列是指同一變量按時間發生的先后順序排列起來的一組觀察值或者記錄值。時間序列分析預測法依據的是慣性原理,所以它建立在某經濟變量過去的發展變化趨勢的基礎上,也就是該經濟變量未來的發展變化趨勢是假設的。然而從事物發展變化的規律來看,同一經濟變量的發展趨勢在不同時期是不可能完全相同的。這樣只有將定性預測和時間序列分析預測結合在一起,才能收到最佳效果。即首先通過定性預測,在保證慣性原理成立的前提下,再運用時間序列分析預測法進行定量預測。
步驟
收集歷史資料,加以整理,編成時間序列,并根據時間序列繪成統計圖。分析時間序列。時間序列中的每一時期的數值都是由許許多多不同的因素同時發生作用后的綜合結果。求時間序列的長期趨勢、季節變動和不規則變動的值,并選定近似的數學模式來代表它們。對于數學模式中的未知參數,使用合適的技術方法求出其值。利用時間序列資料求出長期趨勢、季節變動和不規則變動的數學模型后,就可以利用它來預測未來的長期趨勢值T和季節變動值S,在可能的情況下預測不規則變動值I。然后使用以下模式計算出未來的時間序列預測值Y: 如果不規則變動的預測值難以求解,就只求出長期趨勢和季節變動的預測值,以兩者的和或者積作為時間序列預測值。如果經濟現象本身沒有季節變動或者不需要預測分季節,分月度的情況,則長期趨勢的值就是時間序列的預測值,即T=Y。但是注意這個預測值只反映未來的發展趨勢,即使很準確的趨勢線也只是一個平均作用,實際值將圍繞其上下波動。
特點
- 撇開了事物發展的因果關系去分析事物過去和未來的聯系。
- 假設過去的趨勢會延伸到未來。
- 時間序列數據變動存在規律性和不規律性。
常用預測法
實戰
根據一年的歷史數據預測后10年數據趨勢,使用ARIMA(p,d,q)模型。
讀取數據,對數據繪圖,觀察是否為平穩序列
對非平穩序列進行n階差分,可以看到,一階差分已經平穩,二階變動不大,可以選擇d=1。
選擇合適的p,q
如何根據相關圖選取ARIMA模型,這里不多提及了。最終確定模型為選定AIC、BIC、HQIC均值最小的ARMA(8,0)
使用模型進行預測。
預測結果還是比較合理的,相關代碼如下。
import pandas
as pd
import numpy
as np
from scipy
import stats
import matplotlib
.pyplot
as plt
import statsmodels
.api
as sm
from statsmodels
.graphics
.api
import qqplot
def get_data():"""讀取數據,處理為pandas.Series類型:return:"""with open('./data/data.txt') as f
:data
= f
.readline
()data
= list(map(int, data
.split
(",")))data
= np
.array
(data
, dtype
=np
.float)data
= pd
.Series
(data
)return data
def draw_plot(data
):"""對數據進行繪圖,觀測是否是平穩時間序列:param data::return:"""data
.index
= pd
.Index
(sm
.tsa
.datetools
.dates_from_range
('1927', '2016'))data
.plot
(figsize
=(12, 8))plt
.show
()def diff_data(data
):"""選擇合適的p,q,以求使用ARIMA(p,d,q)模型:param data::return:"""fig
= plt
.figure
(figsize
=(12, 8))ax1
= fig
.add_subplot
(211)diff1
= data
.diff
(1)diff1
.plot
(ax
=ax1
)ax2
= fig
.add_subplot
(212)diff2
= data
.diff
(2)diff2
.plot
(ax
=ax2
)plt
.show
()def choose_pq(data
):"""選擇合適的p和q:param data::return:"""diff1
= data
.diff
(1)fig
= plt
.figure
(figsize
=(12, 8))ax1
= fig
.add_subplot
(211)fig
= sm
.graphics
.tsa
.plot_acf
(data
, lags
=40, ax
=ax1
)ax2
= fig
.add_subplot
(212)fig
= sm
.graphics
.tsa
.plot_pacf
(data
, lags
=40, ax
=ax2
)plt
.show
()def choose_model(data
):"""獲取最佳模型:param data::return:"""arma_mod70
= sm
.tsa
.ARMA
(data
, (7, 0)).fit
()print(arma_mod70
.aic
, arma_mod70
.bic
, arma_mod70
.hqic
)arma_mod30
= sm
.tsa
.ARMA
(data
, (0, 1)).fit
()print(arma_mod30
.aic
, arma_mod30
.bic
, arma_mod30
.hqic
)arma_mod71
= sm
.tsa
.ARMA
(data
, (7, 1)).fit
()print(arma_mod71
.aic
, arma_mod71
.bic
, arma_mod71
.hqic
)arma_mod80
= sm
.tsa
.ARMA
(data
, (8, 0)).fit
()print(arma_mod80
.aic
, arma_mod80
.bic
, arma_mod80
.hqic
)def valid_model(data
):"""模型檢驗:param data::return:"""arma_mod80
= sm
.tsa
.ARMA
(data
, (8, 0)).fit
()resid
= arma_mod80
.residfig
= plt
.figure
(figsize
=(12, 8))ax1
= fig
.add_subplot
(211)fig
= sm
.graphics
.tsa
.plot_acf
(data
, lags
=40, ax
=ax1
)ax2
= fig
.add_subplot
(212)fig
= sm
.graphics
.tsa
.plot_pacf
(data
, lags
=40, ax
=ax2
)plt
.show
()print(sm
.stats
.durbin_watson
(arma_mod80
.resid
.values
))fig
= plt
.figure
(figsize
=(12, 8))ax
= fig
.add_subplot
(111)fig
= qqplot
(resid
, line
='q', ax
=ax
, fit
=True)plt
.show
()r
, q
, p
= sm
.tsa
.acf
(resid
.values
.squeeze
(), qstat
=True)data
= np
.c_
[range(1, 41), r
[1:], q
, p
]table
= pd
.DataFrame
(data
, columns
=['lag', 'AC', 'Q', 'Prob(>Q)'])print(table
.set_index
('lag'))def predict(data
):"""模型預測:param data::return:"""data
.index
= pd
.Index
(sm
.tsa
.datetools
.dates_from_range
('1927', '2016'))arma_mod80
= sm
.tsa
.ARMA
(data
, (8, 0)).fit
()predict_sunspots
= arma_mod80
.predict
('2016', '2026', dynamic
=True)print(predict_sunspots
)fig
, ax
= plt
.subplots
(figsize
=(12, 8))ax
= data
.ix
['1927':].plot
(ax
=ax
)fig
= arma_mod80
.plot_predict
('2016', '2026', dynamic
=True, ax
=ax
, plot_insample
=False)plt
.show
()if __name__
== '__main__':data
= get_data
()predict
(data
)
補充說明
參考了《Python3數據分析與機器學習實戰》,具體數據集和代碼可以查看我的GitHub,歡迎star或者fork。
總結
以上是生活随笔為你收集整理的机器学习-预测之时间序列分析预测法原理及实战的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。