手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

點擊上方 "程序員小樂"關注公眾號, 星標或置頂一起成長

每天凌晨00點00分, 第一時間與你相約

每日英文

Whatever you are facing today, remember to give yourself some credit for making it this far. You are stronger than you know.

無論你今天要面對什麼,既然走到了這一步,就奮 鬥下去,給自己一些肯定,你比自己想象中要堅強。

每日掏心話

生活需要活潑的思考,不被煩惱所糾纏,不被得失所困擾,不呆板,不拖延,瀟灑安然,平淡自在,這才是智慧的活著。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

程序員小樂(ID:study_tech)第 663 次推文 圖片來自網絡

往日回顧:告別AV畫質:實時把動畫變成4k高清,延時僅3毫秒,登上GitHub趨勢榜

正文

  

時序數據,也就是時間序列的數據。

像股票價格、每日天氣、體重變化這一類,都是時序數據,這類數據相當常見,也是所有數據科學家們的挑戰。

所以,如果你有朝一日碰到了時序數據,該怎麼用Python搞定它呢?

時序數據採樣

數據集

這裡用到的例子,是2011年11月到2014年2月期間倫敦家庭的用電量。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

可以看出,這個數據集是按照每半小時統計一次的節奏,記下每家每戶用了多少電。可以根據這些數據,生成一些圖表分析。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

當然,因為我們考慮的數據主要是時間和用電量兩個維度,所以可以把其他的維度刪掉。

重採樣

我們先從重採樣開始。重採樣意味著改變時序數據中的時間頻率,在特徵工程中這個技能非常有用,給監督學習模型補充一些結構。

依靠pandas進行重採樣的方法類似groupby,通過下面的例子,可以更方便的理解。

首先,需要把採樣週期變成每週:

· data.resample() 用來重採樣數據幀裡的電量(kWh)那一列。

· The ‘W’ 表示我們要把採樣週期變為每週(week)。

· sum()用來求得這段時間裡的電量之和。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

當然,我們也可以依葫蘆畫瓢把採樣週期變成每天。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

pandas裡內置了很多重採樣的選項,比如不同的時間段:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

還有不同的採樣方式:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

這些你可以直接用,也可以自己定義。

用Prophet建模

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

Facebook Prophet誕生於2017年,可以用Python和R語言操作。

Prophet天生就是分析時序數據的一把好手,適配任何時間尺度,還能很好的處理異常值和缺失數據,對趨勢變化非常敏感,還考慮到了假期等特殊時間的影響,可以自定義變更點。

在使用Prophet之前,我們先重命名一下數據集中的每列。數據列為ds,我們要預測的值列為y。

下面的例子就是以每天為間隔的時序數列。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

導入Prophet,創建模型,填充數據。

在Prophet裡,changeprior prior scale這個參數可以控制對趨勢變化的敏感程度,參數越高越敏感,設置為0.15比較合適

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

為了實現預測功能,我們創建未來數據幀,設置預測未來多少時間和頻率,然後Prophet就可以開始預測了。

這裡設置的是預測兩週,以天為單位。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

搞定了,可以預測未來兩個月的家庭用電量了。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

圖中,黑點為實際值,藍點為預測值,淺藍色陰影區域表示不確定性。

當然,如果預測的時間很長,不確定性也會增大。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

利用Prophet,我們還可以簡單地看到可視化的趨勢圖。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

看上面第二張圖,以年份為單位,可以明顯看出秋冬家庭耗電量增大,春夏則減少;週日耗電量要比一週裡的其他六天多。

LSTM預測

LSTM-RNN可以進行長序列觀察,這是LSTM內部單元的架構圖:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

LSTM似乎很適合時序數據預測,讓它來處理一下我們按照一天為週期的數據:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

LSTM對輸入數據的規模很敏感,特別是在使用sigmoid或tanh激活函數時。

你也可以把數據標準化,也就是將數據重新調整到[0,1]或[-1,1]的範圍,可以使用scikit-learn庫中的MinMaxScaler預處理類輕鬆地標準化數據集。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

現在,把數據集分成訓練集和測試集。

下面的代碼把80%的數據分成訓練集,剩下的20%留著當測試集。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

定義一個函數來創建新的數據集,用這個函數來準備建模。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

LSTM網絡的輸入數據需要設置成特定的陣列結構:[樣本,時間步長,特徵]。

現在用的是[樣本,特徵],我們需要加上時間步長,通過下面的方法把訓練集和測試集變成我們想要的樣子

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

搞定,現在設計調試LSTM網絡。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

從損失圖中,我們可以看到該模型在訓練集和測試集上的表現相似。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

看下圖,LSTM在擬合測試集的時候表現的非常好。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

聚類

最後,我們還要用我們例子中的數據集進行聚類。

聚類的方法很多,其中一種是分層聚類(clusters hierarchically)。

分層的方法有兩種:從頂部開始分,和從底部開始分。我們這裡選擇從底部開始。

方法很簡單,導入原始數據,然後為一年中的某一天和一天中的某一小時添加兩列。

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

連接和樹形圖

連接函數將距離信息和分組對象根據相似性聚類,他們相互連接,創造更大的聚類。這個進程一直迭代,直到原始數據集中的所有對象都在分層樹裡相互連接在一起。

這樣完成我們數據的聚類:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

搞定,是不是很簡單?

不過,代碼裡的ward是啥?

這是一種新的聚類方法,關鍵詞ward讓連接函數使用ward方差最小化算法。

現在,看一下聚類樹形圖:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

x軸上就是標籤,或者說是樣本索引;

y軸上是距離;

豎線是聚類合併;

橫線表示哪些集群/標籤是合併的一部分,形成新聚類;

豎線的長度是形成新聚類的距離。

簡化一下,更清楚:

手把手教你用Python玩轉時序數據,從採樣、預測到聚類,含代碼

傳送門

towardsdatascience.com/playing-with-time-series-data-in-python-959e2485bff8

歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。

歡迎各位讀者加入程序員小樂技術群,在公眾號後臺回覆“加群”或者“學習”即可。

猜你還想看

阿里、騰訊、百度、華為、京東最新面試題彙集

SSM 框架!實現分頁和搜索分頁

JVM 發生內存溢出的 8 種原因、及解決辦法

一起來學Java註解(Annotation),看了都說好!

關注微信公眾號「程序員小樂」,收看更多精彩內容

嘿,你在看嗎?

"


分享到:


相關文章: