如何使用 Python 进行时间序列预测?
建立基線對于任何時間序列預測問題都是至關重要的。
性能基準讓您了解所有其他模型如何在您的問題上實際執行。
在本教程中,您將了解如何開發持久性預測,以便用Python計算時間序列數據集的性能基準級別。
完成本教程后,您將知道:
- 計算時間序列預測問題的性能基線的重要性。
- 如何在Python中從頭開發一個持久化模型。
- 如何評估來自持久性模型的預測,并用它來建立性能基準。
讓我們開始吧。
預測基準性能(Forecast Performance Baseline)
預測基準性能給我們提供了一個比較點。
這是您的問題的所有其他建模技術的參考點。如果一個模型達到或低于基線的性能,該技術應該被固定或放棄。
用于生成預測以計算基線性能的技術必須易于實施,并且針對特定問題的細節尚未實現。
在為預測問題建立性能基準之前,您必須開發一個測試工具。這包括:
- 您打算用來訓練和評估模型的數據集。
- 您打算用來估計技術性能的重采樣技術(如,訓練/測試分離)。
- 您打算用于評估預測的性能指標(例如均方誤差)。
準備好之后,您需要選擇一個樸素的方法,您可以使用此方法進行預測并計算基準性能。
目標是盡可能快地獲得時間序列預測問題的基線性能,以便您更好地了解數據集并開發更高級的模型。
制定基線預測的好技術的三個屬性是:
- 簡單:只需要很少或根本不需要訓練和智力的方法。
- 快速:一種快速執行的方法,在計算上可以做出預測。
- 可重復:一種確定性的方法,意味著它在給定相同的輸入的情況下產生預期的輸出。
用于建立基準性能的常用算法是持久性算法。
持久性算法("樸素"預測)
監督機器學習最常見的基線方法是零規則算法。
該算法在分類時可以預測大多數類別,或者在回歸時可以預測平均結果。這可以用于時間序列,但不可以用于時間序列數據集中與序列相關的結構。
與時間序列數據集一起使用的等效技術是持久性算法。
持久性算法使用前一時間步(t-1)的值來預測下一時間步(t + 1)的預期結果。
這滿足了上述三個基準線預測的條件。
為了做到這一點,我們將研究如何開發一個持久性模型,并用它來建立一個簡單的單變量時間序列問題的基線性能。首先,我們來回顧一下洗發水銷售的數據集。
洗發水銷售數據集
該數據集描述了3年期間洗發劑銷售的每月數量。
這些單位是計數單位,有36個數據點。原始數據集歸功于Makridakis,Wheelwright和Hyndman(1998)的搜集工作。
以下是前5行數據的示例,包括標題行。
"Month","Sales" "1-01",266.0 "1-02",145.9 "1-03",183.1 "1-04",119.3 "1-05",180.3以下是從Data Market獲取的整個數據集的圖表,您可以下載數據集并了解更多信息。
洗發水銷售數據集
數據集呈現增長趨勢,當然可能還有一些季節性因素。
下載數據集并將其放在當前工作目錄中,文件名為 " shampoo-sales.csv "。
以下代碼片段將加載Shampoo Sales數據集并繪制時間序列。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! ''' from pandas import read_csv from pandas import datetime from matplotlib import pyplot def parser(x):return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) series.plot() pyplot.show()運行程序可以繪制時間序列,如下所示:
持久性算法
持久模型可以在Python中輕松實現。
我們將這個部分分成4個步驟:
- 將單變量數據集轉換為監督學習問題。
- 建立測試設備的訓練和測試數據集。
- 定義持久性模型。
- 進行預測并建立基準性能。
- 查看完整的示例并繪制輸出。
讓我們來具體實施下把
第一步:定義監督學習問題
第一步是加載數據集并創建一個滯后表示。也就是說,給定t-1的數據值,預測t + 1的數據值。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! ''' # Create lagged dataset values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] print(dataframe.head(5))這段代碼創建數據集并打印新數據集的前5行。
我們可以看到,第一行(索引0)的數據將被剔除,因為在第一個數據點之前沒有用于進行預測的數據點。
從監督學習的角度來看,t-1列是輸入變量或稱為x變量,而t + 1列是輸出變量或稱為y變量。
t-1 t+1 0 NaN 266.0 1 266.0 145.9 2 145.9 183.1 3 183.1 119.3 4 119.3 180.3第2步:訓練集和測試集
下一步是將數據集分成訓練集和測試集。
我們將保留"訓練集"的前66%的數據點,其余的34%的數據用于評估。在劃分過程中,我們要注意剔除掉第一行數據(值為NaN)。
在這種情況下不需要訓練了; 因為訓練只是我們習慣做的,并不是必須的。每個訓練集和測試集然后被分成輸入和輸出變量。
# split into train and test sets X = dataframe.values train_size = int(len(X) * 0.66) train, test = X[1:train_size], X[train_size:] train_X, train_y = train[:,0], train[:,1] test_X, test_y = test[:,0], test[:,1]第3步:持久性算法
我們可以將我們的持久性模型定義為直接返回輸入值的函數。
例如,如果提供的t-1值為266.0,則將其作為預測返回,而實際的實際值或期望值恰好為145.9(取自滯后數據集的第一個可用行)。
# persistence model def model_persistence(x):return x步驟4:制定和評估預測
現在我們可以在測試數據集上評估這個模型。
我們使用前向驗證方法來做到這一點。
不需要進行模型訓練或再訓練,所以本質上,我們按照時間序列逐步完成測試數據集并得到預測。
一旦完成對訓練數據集中的每個時間點進預測,就將其與預期值進行比較,并計算均方差(MSE)。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! ''' # walk-forward validation predictions = list() for x in test_X:yhat = model_persistence(x)predictions.append(yhat) test_score = mean_squared_error(test_y, predictions) print('Test MSE: %.3f' % test_score)在這種情況下,測試數據集的均方差超過17730。
Test MSE: 17730.518
第5步:完成示例
最后,在同一個圖中繪制測試數據集合的預期值曲線、訓練數據集的數據曲線和不一致的預測圖。
從持久性模型預測的情節來看,這個模型顯然是落后于現實的一步。銷售數字有上升的趨勢并且會受累月的干擾數據影響,凸顯了持久性技術的局限性。
洗發水銷售持久性模型
完整的例子如下所示。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! ''' from pandas import read_csv from pandas import datetime from pandas import DataFrame from pandas import concat from matplotlib import pyplot from sklearn.metrics import mean_squared_erro def parser(x):return datetime.strptime('190'+x, '%Y-%m') series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # Create lagged dataset values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] print(dataframe.head(5)) # split into train and test sets X = dataframe.values train_size = int(len(X) * 0.66) train, test = X[1:train_size], X[train_size:] train_X, train_y = train[:,0], train[:,1] test_X, test_y = test[:,0], test[:,1] # persistence model def model_persistence(x):return x # walk-forward validation predictions = list() for x in test_X:yhat = model_persistence(x)predictions.append(yhat) test_score = mean_squared_error(test_y, predictions) print('Test MSE: %.3f' % test_score) # plot predictions and expected results pyplot.plot(train_y) pyplot.plot([None for i in train_y] + [x for x in test_y]) pyplot.plot([None for i in train_y] + [x for x in predictions]) pyplot.show()我們已經學習了從頭開發一個針對洗發水銷售問題的持久性模型的例子。
持久性算法是樸素的。它通常被稱為樸素的預測(naive forecast)。
它并不假定它所適用的時間序列問題的具體情況。這使得理解變得容易,實施和評估也變得很快。
作為一名機器學習的,也可以進行大量的改進。
請吧這些改進的想法都記下來。這是非常有用的,因為這些想法可以成為特征工程工作中的輸入特征,或者可以在后來的合成工作中組合成簡單的模型。
結論
在本教程中,您了解到了如何建立Python時間序列預測問題的基準性能。
具體來說,你了解到:
- 建立一個基線和你可以使用的持久化算法的重要性。
- 如何從頭開始在Python中實現持久化算法。
- 如何評估持久化算法的預測并將其用作基準。
總結
以上是生活随笔為你收集整理的如何使用 Python 进行时间序列预测?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文读懂:从 Python 打包到 CL
- 下一篇: websocket python爬虫_p