天天看點

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

 jason brownlee

機器學習方法,比如深度學習,是可以用來解決時間序列預測問題的。

但在使用機器學習之前,時間序列問題需要被轉化為監督學習問題。從僅僅是一個序列,變成成對的輸入、輸出序列。

這篇教程裡,你将學到如何把單變量、多變量時間序列問題轉為機器學習算法能解決的監督學習問題。本教程包含:

如何建立把時間序列資料集轉為監督學習資料集的函數;

如何讓單變量時間序列資料适配機器學習

如何讓多變量時間序列資料适配機器學習

現在我們開始。

正式開始前,我們需要更好地了解時間序列和監督學習的資料形式。時間序列是一組按照時間指數排序的數字序列,可被看成是一列有序的值。比如:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

監督學習問題由輸入(x)和輸出(y)速成,其算法能學習如何根據輸入模式預測輸出模式。

比如:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

對于把時間序列資料轉化為監督學習問題,這是一個關鍵的函數。

給定一個 dataframe, shift() 函數可被用來建立資料列的副本,然後 push forward (nan 值組成的行添加到前面)或者 pull back(nan 值組成的行添加到末尾)。為了給時間序列資料集建立滞後觀察(lag observation)列以及預測觀察(forecast observation)列,并按照監督學習的格式來,這是必須的操作。

我們來看看一些 shift 函數的實操例子。

我們可以定義一個由 10 個數字序列組成的僞時間序列資料集,該例子中,dataframe 中的單個一列如下所示:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作該例子,輸出時間序列資料,每個觀察要有對應的行指數。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

我們通過在頂端插入新的一行,用一個時間步(time step)把所有的觀察降檔(shift down)。由于新的一行不含資料,可以用 nan 來表示“無資料”。

shift 函數能完成該任務。我們可以把處理過的列插入到原始序列旁邊。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作該例子,使資料集有了兩列。第一列是原始觀察,第二列是 shift 過新産生的列。

可看到,把序列向前 shift 一個時間步,産生了一個原始的監督學習問題,雖然  x 、y 的順序不對。無視行标簽的列。由于 nan 值,第一行需要被抛棄。第二行第二列(輸入 x)現實輸入值是 0.0,第一列的值是 1 (輸出 y)。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

我們能看到,如果在 shift 2、3 ……重複該過程,要如何建立能用來預測輸出值 y 的長輸出序列(x)。

shift 操作器可以接受一個負整數值。這起到了通過在末尾插入新的行,來拉起觀察的作用。下面是例子:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作該例子顯示出,新的一列的最後一個值是一個 nan 值。可以看到,預測列可被作為輸入 x,第二行作為輸出值  (y)。輸入值 0 就可以用來預測輸出值 1。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

技術上,在時間序列預測術語裡,目前時間是(t),未來是(t+1, t+n) 它們都是預測時間。過去的觀察 (t-1, t-n) 被用來做預測。對于一個監督學習問題,在一個有輸入、輸出模式的時間序列裡,我們可以看到如何用正負 shift 來生成新的 dataframe 。

這不僅可用來解決經典的 x -> y 預測問題, 還可用到輸入、輸出都是序列的 x -> y 上。

另外,shift 函數也在所謂的多元時間序列問題上有效。這種情況下,并不是時間序列不隻有一組觀察,而是多組(舉個例子,氣溫和氣壓)。所有時間序列中的變量可被向前或向後 shift,來建立多元輸入輸出序列。更多詳情下文會提到。

給定理想的輸入、輸出序列長度,我們可以用 pandas 裡的 shift() 函數自動生成時間序列問題的架構。

這是一個很有用的工具。它幫助我們用機器學習算法探索同一個時間序列問題的不同架構,來找出哪一個将會産生具有更好效果的模型。這部分中,我們為 series_to_supervised() ,一個新的 python 函數定義。它能把單變量、多變量時間序列轉化為監督學習資料集。

該函數有四個參數:

data:作為一個清單或 2d numpy 陣列的觀察序列。必需。

n_in: 作為輸入 x 的 lag observation 的數量。值可能在 [1..len(data)] 之間。可選。預設為 1 。

n_out: 作為輸出 y 的觀察的數量。值可能在 [0..len(data)-1] 之間。可選。預設為 1 。

dropnan: 不管随着 nan 值是否丢掉一些行,它都是布爾值(boolean)。可選。預設為 true。

函數傳回一個單個的值:

return: 序列的 pandas dataframe 轉為監督學習。

新資料集建立為一個 dataframe,每一列通過變量字數和時間步命名。這使得開發者能設計各種各樣時間步序列類型的預測問題。

當 dataframe 被傳回,你可以決定怎麼把它的行,分為監督學習的 x 和 y 部分。這裡可完全按照你的想法。該函數用預設參數定義,是以,如果你僅僅用你的資料調用它。它會建立一個 x 為 t-1,y 是 t 的 dataframe。

該函數相容 python 2 和 python 3。完整函數在下面,包括注解。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

有了整個的函數,現在可以開始探索怎麼用它。

在時間序列預測中,使用滞後觀察(比如 t-1)作為輸入變量來預測目前時間不,是通用做法。這被稱為一步預測(one-step forecasting)。下面的例子,展示了如何一個滞後時間步( t-1)預測目前時間步(t).

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作例子,輸出改造過的時間序列的輸出。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

可看到,觀察被命名為“var1”,輸入觀察被命名為  (t-1),輸出時間步被命名為 (t)。還可以看到,nan 值得行,已經自動從 dataframe 中移除。我們可以用随機數字長度的輸入序列重複該例子,比如 3。這可以通過把輸入序列的長度确定為參數來實作。比如:

data = series_to_supervised(values, 3)

完整例子如下:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

再一次,運作例子輸出改造的序列。可以看到輸入序列是正确的從左到右的順序。輸出變量在最右邊進行預測。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

有另一類預測問題,是用過去的觀察,來預測出将來貫徹的一個序列。這可以被稱作序列預測或者多步驟預測。通過确定另一個參數,我們能把一個時間序列轉化為序列預測。比如,我們可以把一個輸入序列為兩個過去觀察,要預測兩個未來觀察的序列問題,進行如下轉化:

data = series_to_supervised(values, 2, 2)
如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作該例子,顯示出分别把 (t-n)、(t+n) 作為輸入、輸出變量,以及把目前觀察 (t)作為輸出之間的差別。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

另一種重要的時間序列類型被稱為多元時間序列。這時有對多個不同度量(measure)的觀察,以及我們對預測其中的一個或更多的興趣。比如說,也許有兩組時間序列觀察 obs1 和 obs2 ,我們想要預測其中之一,或者兩個都預測。我們可用同樣的方法調用 series_to_supervised()。舉個例子:

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作這個例子會輸出資料的新架構,顯示出兩個變量在一個時間步下的輸入模式,以及兩個變量一個時間不的輸出模式。

取決去問題的具體内容。可以随機把列分為 x 和 y 部分,比如說,如果目前觀察 var1 也被作為輸入提供,那麼隻有 var2 會被預測。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

通過上面這樣确定具體的輸入輸出序列長度,可輕松完成多元時間序列的預測。下面是一個把一個時間步作為輸入,兩個時間步作為預測序列的轉化例子。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

運作該例子會顯示改造過的大 dataframe。

如何把時間序列問題轉化為監督學習問題?通俗易懂的 Python 教程

建議:拿你自己的資料集做實驗,試試多個不同的架構來看哪個效果更好。

====================================分割線================================

本文作者:三川