通俗易懂看時間序列,大神是怎麼在python中使用它的?

格伯納發表於2018-08-08

作者:Arnaud Zinflou

時間序列是日常生活中遇到的最常見的資料型別之一。股票價格、銷售資料、氣候資料、能源使用、甚至個人體重都是可以定期收集的資料。幾乎每個資料科學家都會在工作中遇到時間序列,能夠有效地處理這些資料是資料科學工具箱中的一項重要技能。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


本文簡要介紹瞭如何在python中使用時間序列。這包括使用Pandas訪問倫敦家庭智慧電錶能耗資料的時間序列和一些資料操作。可以在此處檢索此帖子中使用的資料。包含了我認為可能有用的程式碼。(https://data.london.gov.uk/dataset/smartmeter-energy-use-data-in-london-households)

讓我們從基礎知識開始看起,看看時間序列的定義:

時間序列是按時間順序索引,列出或繪製的資料點的集合。通常,時間序列是在連續的等間隔時間點採取的序列。因此,它是離散時間資料的序列。

時間序列資料圍繞相對確定的時間戳來組織的,因此,與隨機樣本相比,可能包含我們將嘗試提取的其他資訊。

載入和處理時間序列

資料集

舉例來說,讓我們用千瓦時(每半小時)的能耗讀數資料為例,在2011年11月至2014年2月期間,我們從參與了英國電網公司領導的"低碳倫敦"專案的倫敦家庭提取樣本。我們可以製作一些探索圖,最好能夠對結構和範圍有概念,這也將使我們能夠尋找到需要糾正的最終缺失值。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


對於本文的其餘部分,我們將只關注DateTime和kWhcolumns。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


重取樣

讓我們從簡單的重取樣技術開始。重取樣涉及更改時間序列觀察的頻率。你可能對重取樣時間序列資料感興趣的一個原因是特徵工程。實際上,它可以用於為監督學習模型提供額外的結構或指出洞察學習問題。pandas中的重取樣方法類似於groupby方法,因為你實際上是按特定時間跨度來進行分組。然後,你可以指定重取樣的方法。讓我們通過檢視一些例子使重取樣更加具體化。 我們將從每週總結開始:

  • data.resample()將用於重新對我們的DataFrame的kWh列進行取樣

  • "W"表示我們希望按周重取樣。

  • sum()用於表示我們希望在此期間使用的總和為kWh。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


我們可以在每日總結中做同樣的事情,我們可以使用groupby和mean函式進行每小時總結:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


為了進一步重取樣,pandas附帶了許多內建選項,你甚至可以定義自己的方法。以下兩個表分別提供了表週期選項以及可能用於重取樣的一些常用方法。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


其他探索

以下是你可以對資料進行的一些探索:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


建模與prophet框架

通俗易懂看時間序列,大神是怎麼在python中使用它的?


Facebook Prophet於2017年釋出,它可用於Python和R. Prophet設計用於分析時間序列,每天的觀察顯示不同時間尺度上的模式。Prophet非常善於處理缺失的資料和對於趨勢的變化,並且通常能很好地處理異常值。它還具有用於假期對時間序列的影響進行建模和實現自定義變更點的高階功能,但我將堅持使用基礎知識建立並執行模型。我認為Prophet是做出快速預測的一個很好的選擇,因為它具有直觀的引數,可以由具有良好領域知識但缺乏預測模型技術技能的人對其進行調整。有關Prophet的更多資訊,可以參考此處的官方文件。(https://facebook.github.io/prophet/docs/quick_start.html)

在使用Prophet之前,我們將資料中的列重新命名為正確的格式。 Date列必須被稱為'ds',而值列我們希望預測'y'。我們在下面的示例中使用了每日總結資料。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


然後我們匯入Prophet,建立一個模型並適合資料。在Prophet中,changepoint_prior_scale(https://facebook.github.io/prophet/docs/trend_changepoints.html)引數用於控制趨勢對變化的敏感程度,較高的值更敏感,較低的值不敏感。在嘗試了一系列值後,我將此引數從預設值0.05設定為0.10。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


為了進行預測,我們需要建立所謂的未來資料幀。我們指定預測的未來週期(在我們的例子中為兩個月)和預測的頻率(每日)。 然後,我們使用我們建立的Prophet模型和未來的資料框進行預測。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


這很簡單!未來的資料框包含未來兩個月的估計家庭消費。我們可以用一個圖來視覺化預測:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


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

如下圖所示,隨著我們未來的進一步發展,不確定區域也會增長,因為最初的不確定性會隨著時間的推移而傳播和增長。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


Prophet也讓我們輕鬆地視覺化整體趨勢和元件模式:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


每年的模式都很有意思,因為它似乎表明秋季和冬季家庭消費增加,春季和夏季減少。直觀地說,這正是我們期望看到的。從周趨勢來看,週日的消費似乎比一週中的其他日子多。最後,總體趨勢表明,消費量在緩慢下降之前增加了一年。試圖解釋這一趨勢需要進一步調查。在下一篇文章中,我們將嘗試查詢它是否與天氣有關。

LSTM預測

長期短期記憶復發神經網路有望學習長時間的觀察序列。這篇題為"理解LSTM網路"的文章在以易於理解的方式解釋底層複雜性方面做得非常出色。(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)下圖是描述LSTM內部單元架構的影像。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


LSTM似乎非常適合時間序列預測。讓我們再次使用我們的每日總結資料。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


LSTM對輸入資料的大小很敏感,特別是在使用sigmoid或tanh啟用函式時。將資料重新調整到[0,1]或[-1,1]的範圍通常是一種很好的做法,也稱為規範化。我們可以使用scikit-learn庫中的MinMaxScaler預處理類輕鬆地規範化資料集。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


現在我們可以將有序資料集拆分為訓練和測試資料集。下面的程式碼計算了分割點的索引,並將資料分成訓練資料集,其中80%的觀測值可用於訓練我們的模型,剩下的20%用於測試模型。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


我們可以定義一個函式來建立一個新的資料集,並使用該函式來準備建模的訓練和測試資料集。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


LSTM網路期望輸入資料以以下形式提供特定的陣列結構:[樣本,時間步驟,特性]。

我們的資料目前採用[樣本,特性]的形式,我們將問題定為每個樣本的兩個時間步驟。我們可以將準備好的訓練和測試輸入資料轉換為預期的結構,如下所示:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


就這樣!我們現在已經準備好為我們的示例設計和調整我們的LSTM網路。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


從損失圖中,我們可以看到該模型在訓練和測試資料集上都具有類似的效能。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


在下圖中,我們看到LSTM在擬合測試資料集方面做得非常好。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


聚類

最後但同樣重要的是,我們還可以使用我們的示例資料進行聚類。有許多不同的方法來執行叢集,其中一種方法是分層地形成叢集。你可以通過兩種方式形成層次結構:從頂部開始拆分,或從底部開始合併。我決定在這篇文章中使用後者。

讓我們從資料開始,我們只需匯入原始資料,併為一年中的某一天和一天中的小時新增兩列。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


Linkage函式和樹狀圖

Linkage函式根據物體的相似性和距離資訊將物體分組。這些新形成的叢集彼此連結以建立更大的叢集。這個過程被迭代,直到原始資料集中的所有物件連結到一個分層樹中。

對我們的資料進行聚類:

通俗易懂看時間序列,大神是怎麼在python中使用它的?


完成了!但"ward"是什麼意思?這實際上是如何運作的?正如scipy linkage文件所告訴我們的那樣,ward是可用於計算新形成的叢集之間距離的方法之一。"ward"連結功能是Ward方差最小化演算法。

現在讓我們來看看這種分層聚類的樹形圖。樹形圖是聚類的分層圖,其中樹形圖的長度表示到下一個聚類中心的距離。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


如果這是你第一次看到樹狀圖,那看起來很嚇人,但不要擔心,讓我們把它分開:

· 在x軸上,你可以看到標籤。如果你沒有指定任何其他東西(比如我),它們就是X中樣本的索引。

· 在y軸上,你可以看到距離(在我們的例子中是word演算法)。

· 水平線是叢集合併

· 垂直線告訴你哪些叢集/標籤是合併,形成新叢集的一部分

· 水平線的高度告訴你新形成的叢集所需要的距離

即使有解釋,先前的樹狀圖仍然不明顯。我們可以"削減"一點,以便能夠更好地檢視資料。

通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


通俗易懂看時間序列,大神是怎麼在python中使用它的?


好多了,不是嗎? 檢視聚類文件以瞭解更多資訊並使用不同的引數。(http://scikit-learn.org/stable/modules/generated/sklearn.cluster.AgglomerativeClustering.html)

參考文獻和進一步閱讀:

· https://joernhees.de/blog/2015/08/26/scipy-hierarchical-clustering-and-dendrogram-tutorial/#Selecting-a-Distance-Cut-Off-aka-Determining-the-Number-of-Clusters

· https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-9-time-series-analysis-in-python-a270cb05e0b3

· https://petolau.github.io/TSrepr-clustering-time-series-representations/

· https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/

· http://colah.github.io/posts/2015-08-Understanding-LSTMs/

· http://docs.scipy.org/doc/scipy/reference/cluster.hierarchy.html

· https://facebook.github.io/prophet/docs/quick_start.html


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31509949/viewspace-2199388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章