時間序列預測基本概念

什麼是時間序列:

時間序列可以看作是普通的二維的無序的特征矩陣向時間空間的拓展,相對來說多瞭僅僅一個維度但也是非常重要的時間維度;

時間序列是按時間順序進行的一系列觀察,通常包括瞭連續性時間序列數據和離散型時間序列數據,後者是nlp的主要數據類型,例如典型的句子、段落等等;

本文主要針對的是連續性時間序列數據的分析、處理、預測,因為後者在nlp領域裡面已經有很多很好的教材或者文章描述的很清楚詳細瞭;

時間序列問題和表格數據問題的相似和差異性

常規的表格數據一般和時間序列問題沒什麼關系,但是很多時候,現實中我們拿到的數據往往是存在時間先後的,隻不過有的問題我們默認時間上的先後關系沒有影響或者影響很小而直接作為無序的典型的tabular data數據的應用來看待。但是有時候,有的數據集中,時序確是必須考慮的問題。

一般來說,帶有時間上的依賴性,但是數據形式是表格形式的數據大概是長這樣的:

例如kaggle上的這兩個比賽,都是帶有時序性質,但形式上確實tabular data的形式的問題。

二者很多時候是可以直接做轉化的。即我們可以把這類問題通過滑窗的方式轉化為時間序列回歸或時間序列分類的問題。

帶有時序信息的tabular data的形式是每個item的每個time step都帶有標簽信息,對於item而言共有time step個標簽,而純粹的時序應用則是每個item的多個step隻有1個標簽信息,這是二者的數據形式上的區別。

時間序列分析:

類似於處理圖數據或者是文本數據,時間序列有其專門的eda的方式,除瞭傳統的無序的結構化數據之外,時間序列分析還需要分析序列數據的其它方面;時間序列分析提供瞭一系列技術,可以更好地理解數據集。 其中最有用的是將時間序列分解為4個組成部分:

1、base-level 序列的baseline值,是某個常數的定值。

2、趨勢: 隨時間變化的序列的變化模式,通常是線性的增加或減少行為。

3、季節性:我更喜歡稱之為周期性,即序列數據隨時間變化的重復模式或周期行為。

4、噪音:模型無法解釋(擬合)的噪音

所有的時間序列數據都有一個level值,大部分時間序列數據都有噪聲,並不是所有時間序列數據都有趨勢性和周期性,時間序列數據的一個重要特征是時間上存在相互依賴性,即樣本不是獨立同分佈的而是存在相關性的例如股票的數據,今天的股票價格可能受昨天的封板影響。

時間序列的這些特性是經典的時間序列方法的基礎,例如ma、arima等經典的經濟學模型(為瞭區分機器學習和深度學習方法,我們這裡稱之為經濟學模型,因為金融專業的教材裡專門涉及到這類問題)

實際的時間序列分析面臨的問題:

在實際應用過程中,時間序列的分量往往是非常復雜的,這也是為什麼業界的forecasting做的效果一直差強人意的主要原因,因為我們目前面臨的很多時序應用的數據,除瞭上述的基本分量之外,還存在著例如:

1.節假日效應;

2.政治風險事件;

3.特殊的網絡事件(流量預測相關尤其是);

4.多周期多個趨勢的混合構成;

。。。。

除此之外,在典型的例如金融領域,stock的價格預測常常更加復雜,因為可能存在很多的變量是無法觀測的(例如輿情事件的獲取涉及到爬蟲和nlp,技術上是比較復雜的)或觀測很復雜的。

建模前的目的要明確

在進行時序數據建模之前,進行預測時,明確建模的目的很重要。

1.擁有多少數據,並且如何將它們匯總在一起?更多的數據通常更有用,這為探索性數據分析,模型測試和調整以及模型穩定性、準確性等提供瞭更好的基礎。

2.所需的預測時間跨度是多少?短期,中期還是長期?較短的時間范圍通常更容易以較高的置信度進行預測,時間序列預測的周期越長,其預測的置信度越難以保證;

3.預測是否可以隨時間推移而經常更新,或者必須進行一次建模並保持不變?當新信息可用時更新模型通常會得到更準確的預測模型。

4.需要什麼時間頻率?通常可以以較低或較高的頻率進行預測,通常短周期的數據噪聲較多,曲線較為坑坑窪窪,中場周期的數據噪聲較少,曲線較為平滑,時間序列數據通常需要清理,縮放甚至轉換。

例如:

1、頻率:也許數據提供的頻率太高而無法建模,或者由於時間間隔不均勻,需要重新采樣才能用於某些模型。

2、離群值:可能存在需要識別和處理的時間序列異常。

3、缺失:可能存在需要插入或估算的缺失數據。通常,時間序列問題是實時的,不斷為預測提供新的機會。這增加瞭時間序列預測的實時性,可以迅速彌補錯誤的假設,建模錯誤以及我們可能愚弄自己的所有其他方式。

時間序列預測的應用

1、根據患者的心電圖序列數據判斷患者的健康狀態;

2、預測每天的股票收盤價。

3、預測城市中所有醫院每年的出生率。

4、預測電商、商店每天售出的產品的銷售量。

5、預測每天通過火車站的乘客數量。

6、預測每個季度的州失業情況。

7、預測每小時預測服務器上的利用率需求。

8、預測每個繁殖季節某個州的兔子數量。

9、預測一個城市每天的平均汽油價格。

。。。。。

時間序列問題的細分:

首先,時間序列問題可以劃分為許多塊:

1.forecasting;

2.時序回歸和分類;

3.時序聚類;

4.時序異常檢測

等等等等。

這裡主要介紹forecasting部分。

forecasting分為單序列/多序列+單變量/多變量+單步/多步 時間序列預測,

其中,統計學模型,例如arima,holtwinters,fbprophet等等隻能處理單序列問題,所謂單序列,即我們自始自終分析和預測的數據都是來自於同一個客觀存在的事物,例如發電廠的電力預測,我們常常就是隻對這一個發電廠的電力數據負責而不涉及到去處理其它電廠的序列數據。如果要處理多序列的問題,則使用統計學方法需要為每一個單序列單獨訓練一個模型,本質上還是做單序列的事情;

單變量時間序列預測問題,你隻有標簽,例如股票每天的收盤價,網頁每天的流量,你所做的事情就是用歷史的價格或者流量預測未來的價格或流量;

目前大部分互聯網公司或量化基金公司處理的數據類型都不可能是單變量,基本上是多變量問題,因為歷史的數據隻能為未來的洞見提供一小部分的見解。

多變量時間序列預測,除瞭標簽之外,你還有其它的特征,例如以股票的收盤價為例,你還有股票的換手率、股票對應的上市公司所屬的行業等,這些額外的特征可以是序列相關的也可以是序列無關的,不過很多地方認為多變量時間序列預測中,額外的多個變量應該也是序列型數據,對此並不認同,例如股票的行業也可以按照時間做repeat轉化為類似序列的數據形式來建模,常見的業務場景並不一定所有特征都是序列形式的。

除此之外,單變量和多變量時間序列預測又分別有兩個更加細致的分類,即單步時間序列預測與多步時間序列預測,單步指你隻需要預測未來一個時間單位的結果,例如你需要預測未來一天、一周、一個月的電商的某個商品的銷量,但是註意,如果你預測的是未來一天,你的訓練樣本也要保證相同的時間維度,不能用以天為單位的樣本預測未來一個周或者以周為單位預測未來一天;多步時間序列預測,顧名思義,就是預測未來多個時間單位的結果,例如以天為單位的訓練樣本,預測為瞭5天、10天。。。等多個時間單位的結果;

關於多步時間序列預測,比單步預測復雜得多,後面會詳細描述。

如何處理時間序列預測問題?

轉化為有監督的機器學習或深度學習問題:

最常見最直接也比較簡單強大的一種做法,時間序列問題轉化為有監督學習問題的核心在於:

1.特征工程:

實際上很簡單,就是把時間序列數據的序列性通過特征工程的方式表征出來,因為傳統的機器學習(lr,gbdt等)主要處理二維數據,對於時序這種三維數據往往無法直接建模,因此我們需要通過特征工程將時序的依賴性表達出來;

2.網絡結構的設計:

對於傳統的ml而言,核心在於特征工程,而對於dl而言,特征工程和網絡結構的設計(超參數的各種調整)都是很重要的,dl在forecasting問題中的成果也是相當的多;

時間序列數據中的特征工程方法:

核心就是3個特征工程方法:

1、lag features;

2、時間窗函數;

3、滯後算子+時間窗函數

除此之外,還有一個常見的特征工程方法就是對日期進行展開,包括瞭:

1、一天中的小時,可以用於表示凌晨、上午、中午、下午、晚上、半夜

2、是否營業時間

3、是否周末。

4、是哪一個積極額

5、一年中的業務季度。

6、是否夏令時。

7、是否有公共假期,例如國慶、勞動節等,對於電商時序預測來說,雙十一、六一八等是非常重要的節日;

8、是否是閏年

。。。。。 基本上pandas的時間函數可以囊括大部分功能瞭

舉個例子就能說清楚瞭,下面我們分四種類型問題來說明:

1、單變量單步:

067f5bcc75531d453a5106e01ca1777d

上圖是典型的單變量時間序列預測問題,假設我們要預測1-18號的序列數據是多少,首先,加入長度為1day的滯後算子:

可以看到,這樣就轉化為我們熟悉的回歸問題瞭,特征是標簽的shift(1)變換(pandas的shift函數可以直接處理),這樣問題就轉化為“用昨天的序列數據來預測今天的序列數據”,當然也可以加入更多的shift操作例如:

a6ee7cc1c3a26ec25303041d6a00615e

這樣問題就變成瞭“用過去三天的序列數據來預測今天的序列數據”

因此,通過滯後算子我們可以很簡單的將序列問題轉化為有監督學習中的回歸問題,假設業務的需要是提前三天預測,則我們隻需要去掉shift(2)和shift(1)就可以瞭;

當然瞭,如果業務需求如上,我們可以加入shift4,shift5.。。shiftn的滯後數據來構建有監督回歸模型,具體取多少個shift,根據實際的問題和效果以及業務經驗來定瞭;

上面介紹瞭滯後算子,下面介紹時間窗,其實原理也很簡單,和風控裡常用的時間窗概念是一樣的,還是以上面的問題為例,我們可以通過pandas的rolling或者expand來計算過去XX天的的時間段內的標簽的均值、標準差、方差、最大、最小、中位數、求和等,例如:

開源的時間序列處理的python library,比如tsfresh、scikit-time,darts等等所包含的重要概念都有時間窗函數,不過說老實話,真的懶得去看框架的api,一方面源碼看起來費勁,如果不知道他內部怎麼處理的用起來心有點慌,一方面感覺pandas能實現很多東西就不搞瞭。。。

滯後算子+時間窗很好理解瞭,就是你特征工程算的是多少天前的某個時間段的統計指標,比如滯後算子是3,時間窗為7,則計算的是當前時間點往前推3天,到達瞭A時間點,然後A時間點再往前推七天來計算sum mean之類的,通過pandas的shift+rolling的方式很容易實現的;

2、單變量多步:

單變量多步的做法大體雷同,但是需要註意一些重要的細節問題:

還是以上面的例子為例,假設我們要預測未來三天的序列數據:

這個時候我們的滯後算子就不能用shift(1)也就是一天的滯後瞭,因為實際預測的時候,我們需要提前三天進行預測,也就是我們站在2020-01-17這一天,要預測未來三天的序列數據,這個時候,我們僅僅直到1-18號的前一天,也就是今天的序列數據是17,但是不可能知道19和20號的前一天的值是多少,因此,面對多步預測的時候,滯後算子是有一個上限的,例如這裡預測未來三天,則我們的shift至少要從3開始取,

時間窗以及滯後算子+時間窗的思路也是一樣的,不贅述;

上面是多步時間序列預測最簡單的處理方法,通過放大滯後算子的窗口來構造特征,最終的形式還是轉化為常規的回歸問題來處理,我們可以用線性回歸、xgb之類的常用算法來處理這個問題莫得問題,除此之外還有兩種思路:

1、把多步預測轉化為多個單步預測:

處理方法和單步預測一樣,比如我們這裡要預測未來三天,則我們按照預測未來一天來建模,當我們預測出1-18號的結果之後,假設預測結果為17.8,則我們可以將17.8作為1-19號的特征:

依次類推;

2、將多步預測轉化為單步預測問題,局限性較大:

我們要預測未來三天,沒問題,我們把未來三天直接轉化為一個樣本,表示 18 19 20三天的序列數據之和,然後樣本也進行轉換,(1、2、3),(2,3,4),(3,4,5)。。。(15,16,17),到此為止,我們將原始的數據轉化為以3days為一個時間周期,這樣問題又變成瞭單步時間序列預測瞭,不過這樣方法局限性比較大,假設業務需求是要預測每一天的,這種方法就行不通;

前面提到的多步預測都是按照單標簽回歸的思路來建模的,復雜一點的,轉化為多標簽回歸問題,對於多標簽問題,目前常見的算法還是使用nn的靈活結構來構造,轉化為一個多輸出的問題:

這種形式的數據,用lr或者gbdt之類的直接建模也可以,就是將多標簽轉化為多個單標簽,我們可以針對未來一天先建模得到模型1,模型1的預測結果作為新的特征然後預測未來2天。。。就是前面我們提到的多步轉單步的思路,還可以預測未來一天後,以預測的結果作為特征,構建一個未來兩天的模型2.。。。。依此類推,然後構建,

如果使用nn的話,除瞭上述的這種方法,nn有自己特殊的建模方法直接進行多步預測,例如典型的LSTM,我們可以:

1、使用lstm的結構,不過這個lstm是多個輸入對應多個輸出的結構(比如過去7天預測未來3天),即MvN的結構;

2、使用seq2seq的結構(kaggle的web traffic比賽的top solution的方案,沒看過具體的代碼就知道用的這個方法)

ps:實際上這裡的多標簽回歸的描述還需要補充一點就是,時序問題轉化為多標簽回歸,多個標簽之間還是有時序的依賴關系的,這種情況下用rnn特別合適。

下面介紹多變量的時間序列預測問題,同樣:

多變量單步與多步:

前面已經介紹瞭單變量單步和多步瞭,後面多變量的就放在一起介紹吧:

多變量單步預測相對於單變量單步差不太多,隻不過多瞭更多的特征,一般來說,多出來的特征可以是有序的也可以是無序的例如典型的電商銷量預測問題,特征可以是一些序列數據也可以是城市這樣的無序數據,做法一樣的,對於無序特征來說,我們也可以使用滯後算子和時間窗函數,對於有序特征更可以瞭,其它的思路就和單步差不多瞭:

同樣,也可以我們上面提到的nn的結構來進行預測;

時間序列問題的特點在於,針對於同一個業務問題,我們可以轉化成不同類型的時間序列預測問題來求解,以電商的銷量預測為例,我們可以僅使用序列數據,結合arima、propeht這類模型來建模,也可以通過滯後算子和時間窗來構造有監督學習問題,多步可能可以轉單步,單步也可能可以轉多步預測,非常靈活;

除此之外,還有其它的一些問題形式,業務中和比賽中遇到的問題會更加復雜:

1、多序列數據,我們前面所說到的四種問題類型實際上都是單序列數據,以電商預測為例,假設我們要預測上海市的某個電商產品A的銷量,則問題是單序列問題,形式大概是這樣的:

94df42ac653f7547b6334f16951e6e41

但是假設這個電商在全國一共50個城市都有產品A的業務,則實際上我們一共有50個序列數據,即多序列問題,這種問題,比較naive的做法就是針對每個城市構建一個時序模型,則我們一共要構建50個時序模型,但是實際上這種方法往往行不通,因為很多中小城市的序列數據少的可憐,根本沒有辦法用於建模,這個時候我們的思路實際上是講所有的城市的序列數據按照 city進行合並,變成一個大矩陣,然後轉化為有監督學習問題來求解,城市作為一個特征city入模,形式大概是這樣:

當然,針對於單序列問題的算法比如arima、fbpropeht之類的可以作為benchmark,也可以作為上述有監督模型的特征提取工具進行特征提取等;

2、帶有序列特征的常規問題:

這種也很常見,例如 整體的無序數據中存在一些序列數據,典型的,風控中,同一個用戶的多條樣本記錄,例如借貸信息是按照時間排列的,常見的處理方法基本就是時間窗函數處理,實際上和第一種形式是類似的;

3、其它的有待補充,可能也許大概應該還有別的類型

示例代碼

下面我們就以一段demo代碼來學習一下時間序列預測問題的解法:

import pandas as pd
from pandas import read_csv
from pandas import DataFrame
series = read_csv('daily-minimum-temperatures-in-me.csv')
series.Date=pd.to_datetime(series.Date)
series.index=series.Date

发表回复

相关推荐

好看的BG向小说推荐

1、玄学文——《重生之天才神棍》作者:凤今 文案:夏芍因救一位落入冰湖的老人,重生回了童年时代。这一世,人生尚在起跑线上 ...

· 22秒前

六大健身网站推荐

39健身_中国专业健身网站 39减肥频道是国内领先的减肥瘦身网站,介绍各种健康的快速减肥方法和减肥食谱,包括瘦脸、瘦腰、瘦腿 ...

· 39秒前

孩子们超喜欢的小学生英语书单,值得分享~

孩子在放松休息之余,将时间用来看书是再好不过了。

· 4分钟前

拉丁舞伦巴基本步

基本点: 上半身的三个力量(肋骨中间、胳肢窝、肩胛骨)、主力腿(膝盖伸直、整腿绷紧、骨盆向前)、中段

· 4分钟前

做自己的“悅己者”

都說“女為悅己者容”,現實生活中,有多少人取悅他人多過取悅自己。但人生是自己的,人有時也需要自己取悅一下自己,活出自我...

· 7分钟前

Copyright 2015-2025 www.icpchaxun.com ©All Rights Reserved.