jason brownlee
機器學習方法,比如深度學習,是可以用來解決時間序列預測問題的。
但在使用機器學習之前,時間序列問題需要被轉化為監督學習問題。從僅僅是一個序列,變成成對的輸入、輸出序列。
這篇教程裡,你将學到如何把單變量、多變量時間序列問題轉為機器學習算法能解決的監督學習問題。本教程包含:
如何建立把時間序列資料集轉為監督學習資料集的函數;
如何讓單變量時間序列資料适配機器學習
如何讓多變量時間序列資料适配機器學習
現在我們開始。
正式開始前,我們需要更好地了解時間序列和監督學習的資料形式。時間序列是一組按照時間指數排序的數字序列,可被看成是一列有序的值。比如:
監督學習問題由輸入(x)和輸出(y)速成,其算法能學習如何根據輸入模式預測輸出模式。
比如:
對于把時間序列資料轉化為監督學習問題,這是一個關鍵的函數。
給定一個 dataframe, shift() 函數可被用來建立資料列的副本,然後 push forward (nan 值組成的行添加到前面)或者 pull back(nan 值組成的行添加到末尾)。為了給時間序列資料集建立滞後觀察(lag observation)列以及預測觀察(forecast observation)列,并按照監督學習的格式來,這是必須的操作。
我們來看看一些 shift 函數的實操例子。
我們可以定義一個由 10 個數字序列組成的僞時間序列資料集,該例子中,dataframe 中的單個一列如下所示:
運作該例子,輸出時間序列資料,每個觀察要有對應的行指數。
我們通過在頂端插入新的一行,用一個時間步(time step)把所有的觀察降檔(shift down)。由于新的一行不含資料,可以用 nan 來表示“無資料”。
shift 函數能完成該任務。我們可以把處理過的列插入到原始序列旁邊。
運作該例子,使資料集有了兩列。第一列是原始觀察,第二列是 shift 過新産生的列。
可看到,把序列向前 shift 一個時間步,産生了一個原始的監督學習問題,雖然 x 、y 的順序不對。無視行标簽的列。由于 nan 值,第一行需要被抛棄。第二行第二列(輸入 x)現實輸入值是 0.0,第一列的值是 1 (輸出 y)。
我們能看到,如果在 shift 2、3 ……重複該過程,要如何建立能用來預測輸出值 y 的長輸出序列(x)。
shift 操作器可以接受一個負整數值。這起到了通過在末尾插入新的行,來拉起觀察的作用。下面是例子:
運作該例子顯示出,新的一列的最後一個值是一個 nan 值。可以看到,預測列可被作為輸入 x,第二行作為輸出值 (y)。輸入值 0 就可以用來預測輸出值 1。
技術上,在時間序列預測術語裡,目前時間是(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。完整函數在下面,包括注解。
有了整個的函數,現在可以開始探索怎麼用它。
在時間序列預測中,使用滞後觀察(比如 t-1)作為輸入變量來預測目前時間不,是通用做法。這被稱為一步預測(one-step forecasting)。下面的例子,展示了如何一個滞後時間步( t-1)預測目前時間步(t).
運作例子,輸出改造過的時間序列的輸出。
可看到,觀察被命名為“var1”,輸入觀察被命名為 (t-1),輸出時間步被命名為 (t)。還可以看到,nan 值得行,已經自動從 dataframe 中移除。我們可以用随機數字長度的輸入序列重複該例子,比如 3。這可以通過把輸入序列的長度确定為參數來實作。比如:
data = series_to_supervised(values, 3)
完整例子如下:
再一次,運作例子輸出改造的序列。可以看到輸入序列是正确的從左到右的順序。輸出變量在最右邊進行預測。
有另一類預測問題,是用過去的觀察,來預測出将來貫徹的一個序列。這可以被稱作序列預測或者多步驟預測。通過确定另一個參數,我們能把一個時間序列轉化為序列預測。比如,我們可以把一個輸入序列為兩個過去觀察,要預測兩個未來觀察的序列問題,進行如下轉化:
data = series_to_supervised(values, 2, 2)
運作該例子,顯示出分别把 (t-n)、(t+n) 作為輸入、輸出變量,以及把目前觀察 (t)作為輸出之間的差別。
另一種重要的時間序列類型被稱為多元時間序列。這時有對多個不同度量(measure)的觀察,以及我們對預測其中的一個或更多的興趣。比如說,也許有兩組時間序列觀察 obs1 和 obs2 ,我們想要預測其中之一,或者兩個都預測。我們可用同樣的方法調用 series_to_supervised()。舉個例子:
運作這個例子會輸出資料的新架構,顯示出兩個變量在一個時間步下的輸入模式,以及兩個變量一個時間不的輸出模式。
取決去問題的具體内容。可以随機把列分為 x 和 y 部分,比如說,如果目前觀察 var1 也被作為輸入提供,那麼隻有 var2 會被預測。
通過上面這樣确定具體的輸入輸出序列長度,可輕松完成多元時間序列的預測。下面是一個把一個時間步作為輸入,兩個時間步作為預測序列的轉化例子。
運作該例子會顯示改造過的大 dataframe。
建議:拿你自己的資料集做實驗,試試多個不同的架構來看哪個效果更好。
====================================分割線================================
本文作者:三川