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