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