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