0
本文作者: 三川 | 2017-05-08 19:03 |
雷鋒網(wǎng)按:本文作者 Jason Brownlee 為澳大利亞知名機器學(xué)習(xí)專家,對時間序列預(yù)測尤有心得。原文發(fā)布于其博客。雷鋒網(wǎng)編譯。
Jason Brownlee
機器學(xué)習(xí)方法,比如深度學(xué)習(xí),是可以用來解決時間序列預(yù)測問題的。
但在使用機器學(xué)習(xí)之前,時間序列問題需要被轉(zhuǎn)化為監(jiān)督學(xué)習(xí)問題。從僅僅是一個序列,變成成對的輸入、輸出序列。
這篇教程里,你將學(xué)到如何把單變量、多變量時間序列問題轉(zhuǎn)為機器學(xué)習(xí)算法能解決的監(jiān)督學(xué)習(xí)問題。本教程包含:
如何創(chuàng)建把時間序列數(shù)據(jù)集轉(zhuǎn)為監(jiān)督學(xué)習(xí)數(shù)據(jù)集的函數(shù);
如何讓單變量時間序列數(shù)據(jù)適配機器學(xué)習(xí)
如何讓多變量時間序列數(shù)據(jù)適配機器學(xué)習(xí)
現(xiàn)在我們開始。
正式開始前,我們需要更好地理解時間序列和監(jiān)督學(xué)習(xí)的數(shù)據(jù)形式。時間序列是一組按照時間指數(shù)排序的數(shù)字序列,可被看成是一列有序的值。比如:
監(jiān)督學(xué)習(xí)問題由輸入(X)和輸出(y)速成,其算法能學(xué)習(xí)如何根據(jù)輸入模式預(yù)測輸出模式。
比如:
對于把時間序列數(shù)據(jù)轉(zhuǎn)化為監(jiān)督學(xué)習(xí)問題,這是一個關(guān)鍵的函數(shù)。
給定一個 DataFrame, shift() 函數(shù)可被用來創(chuàng)建數(shù)據(jù)列的副本,然后 push forward (NaN 值組成的行添加到前面)或者 pull back(NaN 值組成的行添加到末尾)。為了給時間序列數(shù)據(jù)集創(chuàng)建滯后觀察(lag observation)列以及預(yù)測觀察(forecast observation)列,并按照監(jiān)督學(xué)習(xí)的格式來,這是必須的操作。
我們來看看一些 shift 函數(shù)的實操例子。
我們可以定義一個由 10 個數(shù)字序列組成的偽時間序列數(shù)據(jù)集,該例子中,DataFrame 中的單個一列如下所示:
運行該例子,輸出時間序列數(shù)據(jù),每個觀察要有對應(yīng)的行指數(shù)。
我們通過在頂端插入新的一行,用一個時間步(time step)把所有的觀察降檔(shift down)。由于新的一行不含數(shù)據(jù),可以用 NaN 來表示“無數(shù)據(jù)”。
Shift 函數(shù)能完成該任務(wù)。我們可以把處理過的列插入到原始序列旁邊。
運行該例子,使數(shù)據(jù)集有了兩列。第一列是原始觀察,第二列是 shift 過新產(chǎn)生的列。
可看到,把序列向前 shift 一個時間步,產(chǎn)生了一個原始的監(jiān)督學(xué)習(xí)問題,雖然 X 、y 的順序不對。無視行標(biāo)簽的列。由于 NaN 值,第一行需要被拋棄。第二行第二列(輸入 X)現(xiàn)實輸入值是 0.0,第一列的值是 1 (輸出 y)。
我們能看到,如果在 shift 2、3 ……重復(fù)該過程,要如何創(chuàng)建能用來預(yù)測輸出值 y 的長輸出序列(X)。
Shift 操作器可以接受一個負(fù)整數(shù)值。這起到了通過在末尾插入新的行,來拉起觀察的作用。下面是例子:
運行該例子顯示出,新的一列的最后一個值是一個 NaN 值??梢钥吹?,預(yù)測列可被作為輸入 X,第二行作為輸出值 (y)。輸入值 0 就可以用來預(yù)測輸出值 1。
技術(shù)上,在時間序列預(yù)測術(shù)語里,當(dāng)前時間是(t),未來是(t+1, t+n) 它們都是預(yù)測時間。過去的觀察 (t-1, t-n) 被用來做預(yù)測。對于一個監(jiān)督學(xué)習(xí)問題,在一個有輸入、輸出模式的時間序列里,我們可以看到如何用正負(fù) shift 來生成新的 DataFrame 。
這不僅可用來解決經(jīng)典的 X -> y 預(yù)測問題, 還可用到輸入、輸出都是序列的 X -> Y 上。
另外,shift 函數(shù)也在所謂的多元時間序列問題上有效。這種情況下,并不是時間序列不只有一組觀察,而是多組(舉個例子,氣溫和氣壓)。所有時間序列中的變量可被向前或向后 shift,來創(chuàng)建多元輸入輸出序列。更多詳情下文會提到。
給定理想的輸入、輸出序列長度,我們可以用 Pandas 里的 shift() 函數(shù)自動生成時間序列問題的框架。
這是一個很有用的工具。它幫助我們用機器學(xué)習(xí)算法探索同一個時間序列問題的不同框架,來找出哪一個將會產(chǎn)生具有更好效果的模型。這部分中,我們?yōu)?series_to_supervised() ,一個新的 Python 函數(shù)定義。它能把單變量、多變量時間序列轉(zhuǎn)化為監(jiān)督學(xué)習(xí)數(shù)據(jù)集。
該函數(shù)有四個參數(shù):
Data:作為一個列表或 2D NumPy 陣列的觀察序列。必需。
n_in: 作為輸入 X 的 lag observation 的數(shù)量。值可能在 [1..len(data)] 之間??蛇x。默認(rèn)為 1 。
n_out: 作為輸出 y 的觀察的數(shù)量。值可能在 [0..len(data)-1] 之間??蛇x。默認(rèn)為 1 。
dropnan: 不管隨著 NaN 值是否丟掉一些行,它都是布爾值(Boolean)??蛇x。默認(rèn)為 True。
函數(shù)返回一個單個的值:
return: 序列的 Pandas DataFrame 轉(zhuǎn)為監(jiān)督學(xué)習(xí)。
新數(shù)據(jù)集創(chuàng)建為一個 DataFrame,每一列通過變量字?jǐn)?shù)和時間步命名。這使得開發(fā)者能設(shè)計各種各樣時間步序列類型的預(yù)測問題。
當(dāng) DataFrame 被返回,你可以決定怎么把它的行,分為監(jiān)督學(xué)習(xí)的 X 和 y 部分。這里可完全按照你的想法。該函數(shù)用默認(rèn)參數(shù)定義,因此,如果你僅僅用你的數(shù)據(jù)調(diào)用它。它會創(chuàng)建一個 X 為 t-1,y 是 t 的 DataFrame。
該函數(shù)兼容 Python 2 和 Python 3。完整函數(shù)在下面,包括注解。
有了整個的函數(shù),現(xiàn)在可以開始探索怎么用它。
在時間序列預(yù)測中,使用滯后觀察(比如 t-1)作為輸入變量來預(yù)測當(dāng)前時間不,是通用做法。這被稱為一步預(yù)測(one-step forecasting)。下面的例子,展示了如何一個滯后時間步( t-1)預(yù)測當(dāng)前時間步(t).
運行例子,輸出改造過的時間序列的輸出。
可看到,觀察被命名為“var1”,輸入觀察被命名為 (t-1),輸出時間步被命名為 (t)。還可以看到,NaN 值得行,已經(jīng)自動從 DataFrame 中移除。我們可以用隨機數(shù)字長度的輸入序列重復(fù)該例子,比如 3。這可以通過把輸入序列的長度確定為參數(shù)來實現(xiàn)。比如:
data = series_to_supervised(values, 3)
完整例子如下:
再一次,運行例子輸出改造的序列??梢钥吹捷斎胄蛄惺钦_的從左到右的順序。輸出變量在最右邊進行預(yù)測。
有另一類預(yù)測問題,是用過去的觀察,來預(yù)測出將來貫徹的一個序列。這可以被稱作序列預(yù)測或者多步驟預(yù)測。通過確定另一個參數(shù),我們能把一個時間序列轉(zhuǎn)化為序列預(yù)測。比如,我們可以把一個輸入序列為兩個過去觀察,要預(yù)測兩個未來觀察的序列問題,進行如下轉(zhuǎn)化:
data = series_to_supervised(values, 2, 2)
完整例子如下:
運行該例子,顯示出分別把 (t-n)、(t+n) 作為輸入、輸出變量,以及把當(dāng)前觀察 (t)作為輸出之間的區(qū)別。
另一種重要的時間序列類型被稱為多元時間序列。這時有對多個不同度量(measure)的觀察,以及我們對預(yù)測其中的一個或更多的興趣。比如說,也許有兩組時間序列觀察 obs1 和 obs2 ,我們想要預(yù)測其中之一,或者兩個都預(yù)測。我們可用同樣的方法調(diào)用 series_to_supervised()。舉個例子:
運行這個例子會輸出數(shù)據(jù)的新框架,顯示出兩個變量在一個時間步下的輸入模式,以及兩個變量一個時間不的輸出模式。
取決去問題的具體內(nèi)容。可以隨機把列分為 X 和 Y 部分,比如說,如果當(dāng)前觀察 var1 也被作為輸入提供,那么只有 var2 會被預(yù)測。
通過上面這樣確定具體的輸入輸出序列長度,可輕松完成多元時間序列的預(yù)測。下面是一個把一個時間步作為輸入,兩個時間步作為預(yù)測序列的轉(zhuǎn)化例子。
運行該例子會顯示改造過的大 DataFrame。
建議:拿你自己的數(shù)據(jù)集做實驗,試試多個不同的框架來看哪個效果更好。
該課程將系統(tǒng)介紹人工智能中的神經(jīng)網(wǎng)絡(luò),特別是深度學(xué)習(xí)的發(fā)展現(xiàn)狀、基本原理和主要方法。包括:人工智能綜述,生物神經(jīng)系統(tǒng),人工神經(jīng)元模型,BP網(wǎng)絡(luò),Hopfield網(wǎng)絡(luò),深度卷積神經(jīng)網(wǎng)絡(luò)(CNN),長短期記憶網(wǎng)絡(luò)(LSTM)和深度強化學(xué)習(xí)等。重點分析若干典型CNN模型,并結(jié)合具體應(yīng)用案例,進行編程實操剖析。
課程將補充介紹最新的科研成果與前沿領(lǐng)域(提供50篇以上最原始與最新的人工神經(jīng)網(wǎng)絡(luò)代表性英文論文,包括深度學(xué)習(xí)2016年的最新論文),強調(diào)各種理論方法在解決實際問題中的綜合應(yīng)用。雷鋒網(wǎng)傾情推薦!
視頻地址:http://www.mooc.ai/course/65
相關(guān)文章:
手把手教你用 Python 實現(xiàn)針對時間序列預(yù)測的特征選擇
時間序列預(yù)測教程:如何利用 Python 預(yù)測波士頓每月持械搶劫案數(shù)量?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。