原作 Arnaud Zinflou
郭一璞 編譯
量子位 出品 | 公眾號(hào) QbitAI
時(shí)序數(shù)據(jù),也就是時(shí)間序列的數(shù)據(jù)。
像股票價(jià)格、每日天氣、體重變化這一類,都是時(shí)序數(shù)據(jù),這類數(shù)據(jù)相當(dāng)常見(jiàn),也是所有數(shù)據(jù)科學(xué)家們的挑戰(zhàn)。
所以,如果你有朝一日碰到了時(shí)序數(shù)據(jù),該怎么用Python搞定它呢?
時(shí)序數(shù)據(jù)采樣
數(shù)據(jù)集
這里用到的例子,是2011年11月到2014年2月期間倫敦家庭的用電量。
可以看出,這個(gè)數(shù)據(jù)集是按照每半小時(shí)統(tǒng)計(jì)一次的節(jié)奏,記下每家每戶用了多少電??梢愿鶕?jù)這些數(shù)據(jù),生成一些圖表分析。
當(dāng)然,因?yàn)槲覀兛紤]的數(shù)據(jù)主要是時(shí)間和用電量?jī)蓚€(gè)維度,所以可以把其他的維度刪掉。
重采樣
我們先從重采樣開(kāi)始。重采樣意味著改變時(shí)序數(shù)據(jù)中的時(shí)間頻率,在特征工程中這個(gè)技能非常有用,給監(jiān)督學(xué)習(xí)模型補(bǔ)充一些結(jié)構(gòu)。
依靠pandas進(jìn)行重采樣的方法類似groupby,通過(guò)下面的例子,可以更方便的理解。
首先,需要把采樣周期變成每周:
· data.resample() 用來(lái)重采樣數(shù)據(jù)幀里的電量(kWh)那一列。
· The ‘W’ 表示我們要把采樣周期變?yōu)槊恐埽╳eek)。
· sum()用來(lái)求得這段時(shí)間里的電量之和。
當(dāng)然,我們也可以依葫蘆畫(huà)瓢把采樣周期變成每天。
pandas里內(nèi)置了很多重采樣的選項(xiàng),比如不同的時(shí)間段:
還有不同的采樣方式:
這些你可以直接用,也可以自己定義。
用Prophet建模
Facebook Prophet誕生于2017年,可以用Python和R語(yǔ)言操作。
Prophet天生就是分析時(shí)序數(shù)據(jù)的一把好手,適配任何時(shí)間尺度,還能很好的處理異常值和缺失數(shù)據(jù),對(duì)趨勢(shì)變化非常敏感,還考慮到了假期等特殊時(shí)間的影響,可以自定義變更點(diǎn)。
在使用Prophet之前,我們先重命名一下數(shù)據(jù)集中的每列。數(shù)據(jù)列為ds,我們要預(yù)測(cè)的值列為y。
下面的例子就是以每天為間隔的時(shí)序數(shù)列。
導(dǎo)入Prophet,創(chuàng)建模型,填充數(shù)據(jù)。
在Prophet里,changeprior prior scale這個(gè)參數(shù)可以控制對(duì)趨勢(shì)變化的敏感程度,參數(shù)越高越敏感,設(shè)置為0.15比較合適
為了實(shí)現(xiàn)預(yù)測(cè)功能,我們創(chuàng)建未來(lái)數(shù)據(jù)幀,設(shè)置預(yù)測(cè)未來(lái)多少時(shí)間和頻率,然后Prophet就可以開(kāi)始預(yù)測(cè)了。
這里設(shè)置的是預(yù)測(cè)兩周,以天為單位。
搞定了,可以預(yù)測(cè)未來(lái)兩個(gè)月的家庭用電量了。
圖中,黑點(diǎn)為實(shí)際值,藍(lán)點(diǎn)為預(yù)測(cè)值,淺藍(lán)色陰影區(qū)域表示不確定性。
當(dāng)然,如果預(yù)測(cè)的時(shí)間很長(zhǎng),不確定性也會(huì)增大。
利用Prophet,我們還可以簡(jiǎn)單地看到可視化的趨勢(shì)圖。
看上面第二張圖,以年份為單位,可以明顯看出秋冬家庭耗電量增大,春夏則減少;周日耗電量要比一周里的其他六天多。
LSTM預(yù)測(cè)
LSTM-RNN可以進(jìn)行長(zhǎng)序列觀察,這是LSTM內(nèi)部單元的架構(gòu)圖:
LSTM似乎很適合時(shí)序數(shù)據(jù)預(yù)測(cè),讓它來(lái)處理一下我們按照一天為周期的數(shù)據(jù):
LSTM對(duì)輸入數(shù)據(jù)的規(guī)模很敏感,特別是在使用sigmoid或tanh激活函數(shù)時(shí)。
你也可以把數(shù)據(jù)標(biāo)準(zhǔn)化,也就是將數(shù)據(jù)重新調(diào)整到[0,1]或[-1,1]的范圍,可以使用scikit-learn庫(kù)中的MinMaxScaler預(yù)處理類輕松地標(biāo)準(zhǔn)化數(shù)據(jù)集。
現(xiàn)在,把數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集。
下面的代碼把80%的數(shù)據(jù)分成訓(xùn)練集,剩下的20%留著當(dāng)測(cè)試集。
定義一個(gè)函數(shù)來(lái)創(chuàng)建新的數(shù)據(jù)集,用這個(gè)函數(shù)來(lái)準(zhǔn)備建模。
LSTM網(wǎng)絡(luò)的輸入數(shù)據(jù)需要設(shè)置成特定的陣列結(jié)構(gòu):[樣本,時(shí)間步長(zhǎng),特征]。
現(xiàn)在用的是[樣本,特征],我們需要加上時(shí)間步長(zhǎng),通過(guò)下面的方法把訓(xùn)練集和測(cè)試集變成我們想要的樣子
搞定,現(xiàn)在設(shè)計(jì)調(diào)試LSTM網(wǎng)絡(luò)。
從損失圖中,我們可以看到該模型在訓(xùn)練集和測(cè)試集上的表現(xiàn)相似。
看下圖,LSTM在擬合測(cè)試集的時(shí)候表現(xiàn)的非常好。
聚類
最后,我們還要用我們例子中的數(shù)據(jù)集進(jìn)行聚類。
聚類的方法很多,其中一種是分層聚類(clusters hierarchically)。
分層的方法有兩種:從頂部開(kāi)始分,和從底部開(kāi)始分。我們這里選擇從底部開(kāi)始。
方法很簡(jiǎn)單,導(dǎo)入原始數(shù)據(jù),然后為一年中的某一天和一天中的某一小時(shí)添加兩列。
連接和樹(shù)形圖
連接函數(shù)將距離信息和分組對(duì)象根據(jù)相似性聚類,他們相互連接,創(chuàng)造更大的聚類。這個(gè)進(jìn)程一直迭代,直到原始數(shù)據(jù)集中的所有對(duì)象都在分層樹(shù)里相互連接在一起。
這樣完成我們數(shù)據(jù)的聚類:
搞定,是不是很簡(jiǎn)單?
不過(guò),代碼里的ward是啥?
這是一種新的聚類方法,關(guān)鍵詞ward讓連接函數(shù)使用ward方差最小化算法。
現(xiàn)在,看一下聚類樹(shù)形圖:
x軸上就是標(biāo)簽,或者說(shuō)是樣本索引;
y軸上是距離;
豎線是聚類合并;
橫線表示哪些集群/標(biāo)簽是合并的一部分,形成新聚類;
豎線的長(zhǎng)度是形成新聚類的距離。
簡(jiǎn)化一下,更清楚:
傳送門
https://towardsdatascience.com/playing-with-time-series-data-in-python-959e2485bff8
—完—
加入社群
量子位AI社群開(kāi)始招募啦,歡迎對(duì)AI感興趣的同學(xué),在量子位公眾號(hào)(QbitAI)對(duì)話界面回復(fù)關(guān)鍵字“交流群”,獲取入群方式;
此外,量子位專業(yè)細(xì)分群(自動(dòng)駕駛、CV、NLP、機(jī)器學(xué)習(xí)等)正在招募,面向正在從事相關(guān)領(lǐng)域的工程師及研究人員。
進(jìn)專業(yè)群請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面回復(fù)關(guān)鍵字“專業(yè)群”,獲取入群方式。(專業(yè)群審核較嚴(yán),敬請(qǐng)諒解)
誠(chéng)摯招聘
量子位正在招募編輯/記者,工作地點(diǎn)在北京中關(guān)村。期待有才氣、有熱情的同學(xué)加入我們!相關(guān)細(xì)節(jié),請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面,回復(fù)“招聘”兩個(gè)字。
喜歡就點(diǎn)「好看」吧 !
聯(lián)系客服