本次案例來自2022華為杯第E題,第2小問。給定了2012.01-2022.03的土壤濕度的月度數(shù)據(jù),需要預測2022.04-2023.12的土壤濕度的月度數(shù)據(jù)。典型的時間序列預測。
傳統(tǒng)的時間序列預測肯定是ARIMA模型,可以參考我之前的文章。Python統(tǒng)計學10——時間序列分析自回歸模型(ARIMA)
現(xiàn)在流行的方法肯定是深度學習的循環(huán)神經(jīng)網(wǎng)絡(RNN,LSTM,GRU),也可以參考我這篇文章。
Python深度學習05——Keras循環(huán)神經(jīng)網(wǎng)絡實現(xiàn)股價預測
本次我們要用的是一種比較數(shù)學的方法,灰色預測法。
灰色預測法是一種對含有不確定因素的系統(tǒng)進行預測的方法。在建立灰色預測模型之前,需先對原始時間序列進行數(shù)據(jù)處理,經(jīng)過數(shù)據(jù)處理后的時間序列即稱為生成列?;疑到y(tǒng)常用的數(shù)據(jù)處理方式有累加和累減兩種。
灰色預測是以灰色模型為基礎的,在眾多的灰色模型中,GM(1,1)模型最為常用。
原理公式就不介紹了。
灰色預測法的通用性較強,一般的時間序列場合都適用,尤其適合那些規(guī)律性差且不清楚數(shù)據(jù)產(chǎn)生機理的情況?;疑A測模型的優(yōu)點是預測精度高、模型可檢驗、參數(shù)估計方法簡單、對小數(shù)據(jù)集有很好的預測效果;缺點是對原始數(shù)據(jù)序列的光滑度要求很高,在原始數(shù)據(jù)列光滑性較差的情況下灰色預測模型的預測精度不高,甚至通不過檢驗。
認識數(shù)據(jù)
首先我們對問題要有清晰的認識。預測無非就是給一些數(shù)據(jù),然后需要預測其他的一些數(shù)據(jù),題目給的數(shù)據(jù)大概是這樣的:
給定了2012.01-2022.03的土壤濕度的月度數(shù)據(jù),需要預測2022.04-2023.12的土壤濕度的月度數(shù)據(jù)。
需要這代碼演示數(shù)據(jù)的同學可以參考:數(shù)據(jù)
?下面使用Python讀?。?/p>
導入包:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams ['font.sans-serif'] ='SimHei' #顯示中文
plt.rcParams ['axes.unicode_minus']=False #顯示負號
讀取數(shù)據(jù),將前兩列——年份和月份解析為時間,然后對時間索引進行排序,畫折線圖:
土壤濕度=pd.read_csv('土壤濕度.csv',parse_dates={'時間':[0,1]})
土壤濕度=土壤濕度.set_index('時間').sort_index()
土壤濕度.plot(figsize=(10,4))
?這就是初始數(shù)據(jù),從2012.01-2022.03的土壤濕度的月度數(shù)據(jù),需要預測2022.04-2023.12的土壤濕度數(shù)據(jù)。
灰色預測
定義灰色預測函數(shù):
def GM11(x0): #自定義灰色預測函數(shù)
x1 = x0.cumsum() #1-AGO序列
z1 = (x1[:len(x1)-1] + x1[1:])/2.0 #緊鄰均值(MEAN)生成序列
z1 = z1.reshape((len(z1),1))
B = np.append(-z1, np.ones_like(z1), axis = 1)
Yn = x0[1:].reshape((len(x0)-1, 1))
[[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) #計算參數(shù)
f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) #還原值
delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))
C = delta.std()/x0.std()
P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
return f, a, b, x0[0], C, P #返回灰色預測函數(shù)、a、b、首項、方差比、小殘差概率
其實不理解原理也沒什么,就按照我下面的流程用就行。
準備數(shù)據(jù)的值和時間索引:
new_reg_data = 土壤濕度.iloc[:,-4:] #取最后4列,即自己需要預測的四個變量
new_reg_data.index = pd.to_datetime(土壤濕度.index) #將原始數(shù)據(jù)的索引變?yōu)闀r間類型
?查看現(xiàn)在的數(shù)據(jù):
new_reg_data
?
?可以看到時間,現(xiàn)在是123條。
由于需要預測2022.04-2023.12期間的四個變量,我們先要定義一個時間索引,一個月份一個月份的去預測。然后對每個變量進行循環(huán),即每個變量都去擬合一個新的灰色預測函數(shù)。在每個月度預測完了后就給這一行賦值。這樣能保證上一個預測值可以加入下一輪的預測里面。
index=pd.Series(pd.date_range('2022-04','2024-1',freq='M')).astype('datetime64[M]')
for i,ind in enumerate(index):
pred=[]
for c in new_reg_data.columns:
f = GM11(new_reg_data.loc[:,c].values)[0]
pred.append(f(1+len(new_reg_data)))
new_reg_data.loc[ind,:] = np.array(pred)
查看結(jié)果:
new_reg_data
?可以看到時間,現(xiàn)在是144條。
畫圖看擬合效果:
new_reg_data.plot(figsize=(10,4),title='預測的土壤濕度')
#plt.savefig('第二問的預測結(jié)果.jpg',dpi=128)
?emmmm,效果一般般,雖然預測出來的不是常數(shù),但是預測的值也比較平滑。這也是灰色預測的一個特點。
當然建模比賽不會只用這么簡單的模型....那肯定是神經(jīng)網(wǎng)絡什么的都往上整了,不過由于這個題目的數(shù)據(jù)量小,神經(jīng)網(wǎng)絡不太合適?;疑A測適合小數(shù)據(jù)集,該案例算是提供一個新的時間序列預測的思路吧文章來源:http://www.zghlxwxcb.cn/news/detail-460755.html
創(chuàng)作不易,看官覺得寫得還不錯的話點個關注和贊吧,本人會持續(xù)更新python數(shù)據(jù)分析領域的代碼文章~(需要定制代碼可私信)文章來源地址http://www.zghlxwxcb.cn/news/detail-460755.html
到了這里,關于Python數(shù)據(jù)分析案例11——灰色預測法預測時間序列數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!