price1 = np.log(52.5) - np.log(50)
price2 = np.log(105) - np.log(100)
printf('The percentage variation of the first example is {round(price1*100,1)} and the second is {round(price2*100,1)}')
Box-Cox 變換(指數變換)Box-Cox 轉換也是一種轉換序列的方法,lambda(λ)的值是用於轉換序列的參數。簡而言之,這個函數是幾個指數變換函數的結合,我們需要找到轉換序列的 lambda 的最佳值,使其分布更接近正態高斯分布。使用此轉換的一個條件是序列只有正值,公式為:接下來我將繪製原始序列及其分布圖,然後用 lambda 最佳值繪製新的轉換序列及其分布圖,為了找到 lambda 的值,我們將使用庫 Scipy 的 boxcox 函數生成轉換的序列和理想 lambda 值:下面是一個交互式圖表,在圖中可以更改 lambda 值和檢查更改:此工具通常用於提高模型的性能,因為它使模型更趨於正態分布,記住在完成模型的預測後,必須根據以下公式反轉轉換到原始的基數:尋找相關時滯為了便於預測,具有單一變量的序列必須具有自相關性,即,當前時段必須是能夠基於較早的時段(滯後)而解釋的。由於這個序列每周為一周期,1 年大約 52 周,我將使用 60 的滯後期的自相關函數來驗證當前周期與這些滯後的相關性。通過對上述自相關圖的分析,似乎所有的滯後都可以用來為未來事件創建預測,因為它們的正相關接近 1 ,而且都在置信區間之外,但這一特徵屬於非平穩序列。另一個非常重要的函數是部分自相關函數,其中消除了先前的滯後對當前區間的影響,只保留了當前區間滯後的影響來分析,例如:第四個滯後的偏自相關將消除第一、第二和第三個滯後的影響。可以看到,幾乎沒有滯後對當前周期有影響,但是正如前面所演示的,沒有微分的序列不是平穩的,我們現在用一階微分的序列繪製這兩個函數來展示原理:自相關曲線變化顯著,表明該序列僅在第一個滯後期具有顯著相關,在第 26 個滯後(半年)左右具有負相關的季節效應。為了做出預測,我們必須注意一個找到相關的滯後現象的非常重要的細節,重要的是這種關聯背後的原因,因為如果沒有邏輯上的原因,就有可能是偶然的,當包含更多的數據時,這種關聯就會消失。另一個重點是自相關和部分自相關圖對異常值非常敏感,因此分析時間序列本身並與兩個自相關圖進行對比非常重要。在這個例子中,第一個滯後與當前周期具有高度相關性,因為前一周的價格歷史上沒有顯著變化,在相同的情況下,第 26 個滯後呈現負相關,表明與當前時期相反的趨勢,可能原因是一年內不同時期供需不同。隨著膨脹率調整後的序列已經趨於平穩,我們將使用它來創建我們的預測,下圖是調整後序列的自相關和部分自相關圖:想要了解更多信息的話,杜克大學教授 Robert Nau 的網站是與此主題相關的最佳網站之一。(http://people.duke.edu/~rnau/411home.htm)3 模型評價指標為了分析預測值是否接近當前值,必須對誤差進行測量,此種情況下的誤差(或殘差)基本上是 Yreal-YpredYreal-Ypred (這個暫時不知道怎麼翻譯, real 真實值, pred 預測值)。對訓練數據中的錯誤進行評估以驗證模型是否具有良好的確定性,然後通過檢查測試數據中的誤差(模型未「看到」的數據)來驗證模型。當將訓練數據與測試數據進行對比時,檢查誤差對於驗證你的模型是否過擬合或欠擬合非常重要。平均預測誤差——偏差(bias)它只是被評估序列的平均誤差,值可以是正的也可以是負的。該指標表明,模型傾向於預測實際值以上(負誤差)還是實際值以下(正誤差),因此也可以說平均預測誤差是模型的偏差。MAE——平均絕對誤差這個指標與上面提到的預測的平均誤差非常相似,唯一的區別是將誤差的負值轉化為正值,然後計算平均值。這個指標在時間序列中被廣泛使用,因為在一些情況下,負誤差可以抵消正誤差,使人誤以為模型是準確的,而在用 MAE 的情況下不會發生,因為這個指標顯示預測距離實際值有多遠,不管數值大還是小,示例如下:a = np.array([1,2,3,4,5])
b = np.array([5,4,3,2,1])
error = a - b
MFE = error.mean()
MAE = np.abs(error).mean()
print(f'The error of each model value looks like this: {error}')
print(f'The MFE error was {MFE}, the MAE error was {MAE}')
與 MAE 和 MFE 不同,MSE 值是平方單位,而不是模型單位。RMSE——均方根誤差這個指標只是 MSE 的平方根,使誤差返回到模型的度量單位(BRL/m3),因為它對時間序列在平方過程中產生的較大誤差更為敏感而非常有用。MAPE——平均絕對百分誤差這是另一個可用的有趣的指標,它通常在管理報告中使用,因為誤差是以百分比度量的,所以產品 X 的錯誤可以與產品 Y 的誤差進行比較。該指標的計算取誤差的絕對值除以當前價格,然後計算平均值:我們來創建一個函數,用幾個評估指標來評估訓練數據和測試數據的誤差:#Libraries to create the function:
from math import sqrt
from sklearn.metrics import mean_squared_error,mean_absolute_error, mean_absolute_error
def check_error(orig, pred, name_col='', index_name=''):
bias = np.mean(orig - pred)
mse = mean_squared_error(orig, pred)
rmse = sqrt(mean_squared_error(orig, pred))
mae = mean_absolute_error(orig, pred)
mape = np.mean(np.abs((orig - pred) / orig)) * 100
error_group = [bias, mse, rmse, mae, mape]
serie = pd.DataFrame(error_group, index=['BIAS','MSE','RMSE','MAE', 'MAPE'], columns=[name_col])
serie.index.name = index_name
return serie
分析這個圖是非常重要的,因為在這個圖中我們可以檢查模式,它可以告訴我們是否需要對模型進行一些修改,理想的情況是誤差沿著預測序列線性分布。https://en.wikipedia.org/wiki/Q–Q_plot總的來說這是一個顯示了殘差在理論上應該如何分布的圖形,遵循高斯分布,而不是實際情況。def plot_error(data, figsize=(18,8)):
# Creating the column error
data['Error'] = data.iloc[:,0] -data.iloc[:,1]
plt.figure(figsize=figsize)
ax1 = plt.subplot2grid((2,2), (0,0))
ax2 = plt.subplot2grid((2,2), (0,1))
ax3 = plt.subplot2grid((2,2), (1,0))
ax4 = plt.subplot2grid((2,2), (1,1))
#Plotting actual and predicted values
ax1.plot(data.iloc[:,0:2])
ax1.legend(['Real','Pred'])
ax1.set_title('Real Value vs Prediction')
# Error vs Predicted value
ax2.scatter(data.iloc[:,1], data.iloc[:,2])
ax2.set_xlabel('Predicted Values')
ax2.set_ylabel('Residual')
ax2.set_title('Residual vs Predicted Values')
## Residual QQ Plot
sm.graphics.qqplot(data.iloc[:,2], line='r', ax=ax3)
# Autocorrelation Plot of residual
plot_acf(data.iloc[:,2], lags=60, zero=False, ax=ax4)
plt.tight_layout()
plt.show()
許多人還使用這種方法作為 基線(baseline),試圖用更複雜的模型來改進。QQ 圖顯示了有一些比理論上要大些(包括正負值)的殘差,這些是所謂的異常值,但在第一,第六和第七個滯後中仍然存在明顯的自相關,這可以用於改進模型。同樣地,我們現在將在測試數據中進行預測。預測序列的第一個值將是訓練數據的最後一個值,然後這些值將按照測試的當前值逐步更新,依此類推:RMSE 和 MAE 的誤差與訓練數據相似,QQ 圖與殘差更符合理論值,可能是由於與訓練數據相比樣本值較少。在對比殘差與預測值的圖表中,我們注意到當價格上漲時,誤差絕對值有增加的趨勢,可能用對數調整會減少誤差的擴大並完成殘差相關圖,表明由於第一個滯後有很強的相關性,因此仍有改進的空間,可能添加基於第一個滯後的回歸來改進預測。下一個模型是簡單平均值:簡單平均另一種預測方法是使用序列平均值,通常當數值在平均值附近振蕩時,具有常數的方差,沒有上升或下降趨勢時,這種預測形式是好的,但是也能使用更好的方法,其中可以使用季節模式進行預測。此模型使用數據首端直到分析的前一個時期的平均值,並且按天擴展到數據結束,最後,趨勢是一條直線,我們現在將此模型與第一個模型的誤差進行比較:在測試數據中,我將繼續使用訓練數據一開始的均值,並展開添加到測試數據上:簡單均值模型無法捕獲序列的相關信息,如真實值和預測值圖中所示,也可以在相關性和殘差和預測圖中看到。簡單滑動平均:滑動平均是針對給定周期(例如 5 天)計算的平均值,它是滑動的並始終使用此特定時段進行計算,在這種情況下,我們將始終使用過去 5 天的平均值來預測下一天的值。誤差低於簡單平均,但仍高於簡單模型,以下是測試模型:與訓練數據相似,滑動平均模型優於簡單平均模型,但尚未比簡單模型基礎有所增益。預測具有 2 個時滯的自相關性,並且相對於預測值有很大的方差誤差。指數滑動平均:上述簡單滑動平均模型具有同等地處理最後 X 個觀測值並完全忽略所有先前觀測值的特性。直觀地說,過去的數據應該逐漸打折,例如,理論上最近的觀測結果應該比第二近的更重要,而第二近的觀測應該比第三近的數據更重要,等等, 指數滑動平均(Exponential Moving Average,EMM)模型就是這樣做的。由於 α(alpha)是一個常數,其值介於 0 和 1 之間,因此我們將使用以下公式計算預測值:如果預測的第一個值是相應的當前值,其他值將更新為實際值與前一個時段的預測之差的 α 倍。當α為零時,我們根據第一個預測值得到一個常數,當 α 為 1 時,我們有一個簡單方法的模型,因為結果是前一個實際周期的值。EMM 預測中的平均數據周期為 1 /α。例如,當 α= 0.5 時,滯後相當於 2 個周期; 當 α= 0.2 時,滯後是 5 個周期; 當 α= 0.1 時,滯後是 10 個周期,依此類推。在這個模型中,我們將任意選用 α 值為 0.5 ,而你可以通過網格搜索算法查找在訓練集和驗證集中都中減少了錯誤的 α,數據大概應是這樣:這個模型的誤差與滑動平均的誤差相似,但是我們需要在測試集對模型進行驗證:在驗證數據中,目前為止的誤差在我們已經訓練過的模型中排名第二,而殘差圖的特徵與 5 天滑動平均模型的特徵非常相似。自回歸自回歸模型基本上是一個具有顯著相關滯後的線性回歸,首先要繪製自相關圖和部分自相關圖來驗證是否存在相關關係。下面是訓練序列的自相關圖和部分自相關圖,顯示了自回歸模型的特徵為具有 2 個時滯的顯著相關性:接下來我們將根據訓練數據創建模型,得到模型的係數後,將其乘以測試數據將要執行的值:這個模型與我們所訓練的其他模型相比,誤差最小,現在我們用它的係數對訓練數據進行逐步預測:注意,在測試數據中,誤差不會保持穩定,甚至會比簡單模型更差,可以看到圖中的預測值幾乎總是低於當前值,偏差測量顯示實際值比預測值高 50.19 BRL, 也許在訓練模型中調整一些參數,這種差異會減小。要改進這些模型,你可以應用多個轉換,例如本文中介紹的轉換,也可以添加外部變量作為預測源,但是,這已然超出本文內容了。4 結束語每個時間序列模型都有自己的特點,應該分別單獨分析,這樣我們就可以提取儘可能多的信息來做出好的預測,減少未來的不確定性。檢驗平穩度、轉換數據、在訓練數據中建立模型、驗證測試數據、檢驗殘差是建立良好時間序列預測的關鍵步驟。https://www.kaggle.com/leandrovrabelo/climate-change-forecast-sarima-model原文來源:https://towardsdatascience.com/basic-principles-to-create-a-time-series-forecast-6ae002d177a4本文來自公眾號讀者翻譯,歡迎各位童鞋向公號投稿,點擊下面圖片了解詳情!李潔,北京師範大學香港浸會大學聯合學院 數據科學系助教,香港科技大學電信學碩士。----End----獲取一折本站知識星球優惠券,複製連結直接打開:
https://t.zsxq.com/662nyZF
本站qq群1003271085。
加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):