在這篇文章中,我們將深入探討時間序列預(yù)測的基本概念和方法。我們將首先介紹單元預(yù)測和多元預(yù)測的概念,然后詳細介紹各種深度學(xué)習(xí)和傳統(tǒng)機器學(xué)習(xí)方法如何應(yīng)用于時間序列預(yù)測,包括循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)、一維卷積神經(jīng)網(wǎng)絡(luò)(1D-CNN)、Transformer、自回歸模型(AR)、狀態(tài)空間模型、支持向量機(SVM)和隨機森林(RF)等。我們還會討論這些方法在單元預(yù)測和多元預(yù)測中的適用性。 時間序列分析基本概念在我們的日常生活中,時間序列數(shù)據(jù)無處不在。無論是市場的價格波動,氣象站的天氣記錄,還是社交媒體的用戶活動,這些都是時間序列數(shù)據(jù)的例子,類似于下面的圖片。 其中橫坐標代表著時間的信息,縱坐標代表著價格,從其中我們可以看出隨著時間的推移其價格會有一定的波動,這一現(xiàn)象我們就稱之為時間序列。 那么什么是時間序列的定義呢? 時間序列數(shù)據(jù)是指按照時間順序收集的數(shù)據(jù),每個數(shù)據(jù)點都與一個特定的時間點相關(guān)聯(lián)。這些數(shù)據(jù)點通常按照均勻的時間間隔(如每日、每周、每月等)進行測量和記錄。例如,每天的股票價格、每月的銷售額、每年的人口總數(shù)等都是時間序列數(shù)據(jù)的例子。 核心概念 在進行時間序列分析時,有幾個核心概念需要理解: 趨勢:趨勢是時間序列數(shù)據(jù)中長期的上升或下降模式。例如,一個公司的年銷售額可能會顯示出持續(xù)增長的趨勢。 季節(jié)性:季節(jié)性是時間序列數(shù)據(jù)中的周期性波動,這些波動通常與季節(jié)或其他固定的時間間隔有關(guān)。例如,零售業(yè)的銷售額可能在節(jié)假日期間顯著增加。 周期性:周期性是時間序列數(shù)據(jù)中的波動,這些波動的周期不固定,與季節(jié)性不同。例如,經(jīng)濟周期就是一種周期性。 隨機(或不規(guī)則)波動:這是時間序列中不可預(yù)測的部分,不能被趨勢、季節(jié)性或周期性解釋。 自相關(guān)性:自相關(guān)性是時間序列中相鄰觀察值之間的相關(guān)性。例如,今天的股票價格可能與昨天的股票價格高度相關(guān)。 平穩(wěn)性:平穩(wěn)時間序列的統(tǒng)計特性(如均值、方差等)不隨時間變化。許多時間序列模型都假設(shè)數(shù)據(jù)是平穩(wěn)的,或可以通過某種轉(zhuǎn)換(如差分)變?yōu)槠椒€(wěn)。 滯后值:滯后值是過去的數(shù)據(jù)值。例如,在t-1時刻的值就是在t時刻的滯后值。滯后值在許多時間序列模型(如自回歸模型)中都有應(yīng)用。 理解這些基本概念是進行有效的時間序列分析和預(yù)測的關(guān)鍵。在接下來的文章中,我們將深入探討如何應(yīng)用這些概念,并介紹一些常見的時間序列預(yù)測方法,包括深度學(xué)習(xí)和傳統(tǒng)的機器學(xué)習(xí)方法。 時間序列預(yù)處理 在數(shù)據(jù)科學(xué)領(lǐng)域,我們經(jīng)常聽到這樣一句話:“數(shù)據(jù)預(yù)處理占據(jù)了大部分的時間和精力。”這句話在時間序列預(yù)測中同樣適用。在我們開始預(yù)測未來的趨勢和模式之前,我們需要確保我們的數(shù)據(jù)是準確的、一致的,并且適合我們的模型。 (PS:數(shù)據(jù)預(yù)處理是非常重要的,同樣的數(shù)據(jù)如果你進行了處理可能精度提升要有十個點甚至二十個點,我曾經(jīng)就實驗過Xgboost數(shù)據(jù)處理和未處理時候的精度對比效果竟然相差百分之三十!所以大家一定要重視數(shù)據(jù)的預(yù)處理) 以下是時間序列預(yù)處理的一些關(guān)鍵步驟以及代碼示例: 處理缺失值:缺失值是時間序列數(shù)據(jù)中常見的問題。處理方法可能包括插值(例如,使用前后觀察值的平均值填充缺失值)。 import pandas as pd # 假設(shè)df是一個DataFrame,其中有一些缺失值 df = pd.DataFrame({'value': [1, None, 2, 3, None, 4]}) # 使用線性插值填充缺失值 df = df.interpolate(method='linear') 輸出 :可以看出用相鄰兩個數(shù)之間的值替換了缺失的Nan值 季節(jié)性調(diào)整:許多時間序列數(shù)據(jù)包含季節(jié)性變化,這可能會掩蓋數(shù)據(jù)的真實趨勢。季節(jié)性調(diào)整是一種方法,可以去除數(shù)據(jù)中的季節(jié)性效應(yīng),使得趨勢更加明顯。 # 假設(shè)df是一個DataFrame,其中包含時間序列數(shù)據(jù) df = pd.DataFrame({'value': [1,2,3,4,5,6,7,8,9,10,11,12]}) # 進行季節(jié)性分解 res = sm.tsa.seasonal_decompose(df.value, model='additive', period=3) # 季節(jié)性調(diào)整 df_deseasonalized = df.value - res.seasonal 輸出: 去噪:時間序列數(shù)據(jù)可能包含噪聲,這可能會影響預(yù)測的準確性。去噪方法可能包括平滑技術(shù)(例如,移動平均法)或者更復(fù)雜的方法(例如,使用濾波器)。 檢查并確保平穩(wěn)性:許多時間序列模型假設(shè)數(shù)據(jù)是平穩(wěn)的,即數(shù)據(jù)的統(tǒng)計特性(如均值、方差等)不隨時間變化。如果數(shù)據(jù)不是平穩(wěn)的,可能需要進行一些轉(zhuǎn)換(如取對數(shù)、差分等)。 檢查并處理異常值:異常值是時間序列數(shù)據(jù)中的極端值,可能會影響預(yù)測的準確性。處理方法可能包括修剪(限制極端值的大?。?,或者使用更復(fù)雜的方法(例如,使用模型識別并處理異常值)。 (PS:在上述的方法中一般使用的是Nan值的處理和異常值的檢測,這兩個方法在實際生產(chǎn)的過程中運用的比較多,首先如果你的數(shù)據(jù)中有NaN值對于python來說一般會報錯導(dǎo)致你的程序運行報錯,而異常值我們可以稱之為離群點,往往會導(dǎo)致模型預(yù)測精度的不準) 特征工程在時間序列預(yù)測中的應(yīng)用 經(jīng)過了時間序列預(yù)測的處理,我們的數(shù)據(jù)已經(jīng)符合了模型的需要,那么我們就該進行一些特征工程的操作,下面我們來講解特征工程。 特征工程是將原始數(shù)據(jù)轉(zhuǎn)化為更適合機器學(xué)習(xí)模型的特征的過程。在時間序列預(yù)測中,特征工程尤其重要,因為它可以幫助模型捕捉到數(shù)據(jù)的時間依賴性。 以下是一些在時間序列預(yù)測中常用的特征工程技術(shù): 滯后特征:滯后特征是用過去的數(shù)據(jù)作為新的特征。例如,我們可以創(chuàng)建一個新的特征,表示在過去一天、一周或一月的數(shù)據(jù)。 滑動窗口統(tǒng)計:滑動窗口統(tǒng)計是對過去一段時間內(nèi)的數(shù)據(jù)進行統(tǒng)計分析,如求和、平均、最大值、最小值等。 時間特征:時間特征是從時間戳中提取的特征,如年份、月份、一周的第幾天、一天的第幾小時等。 趨勢特征:趨勢特征是表示數(shù)據(jù)的長期趨勢,可以通過線性回歸或其他方法來捕捉。 季節(jié)性特征:季節(jié)性特征是表示數(shù)據(jù)的周期性波動,可以通過傅立葉變換或其他方法來捕捉。 以上這些特征工程的操作只是一些非常常見的操作,實際過程當中我們會結(jié)合數(shù)據(jù)來進行一些特定的特征工程操作(特征工程的操作以及特征的選取往往是通過假設(shè)的方式來確定的,一些特征的選取在沒有實驗結(jié)論之前誰也無法確定其是否能作為一個特征) 例如:一份數(shù)據(jù)如下圖, 這份數(shù)據(jù)是一份油溫數(shù)據(jù)的預(yù)測數(shù)據(jù)其中根據(jù)HUFL——LULL預(yù)測OT,其中HUFL-LULL我們就稱之為特征當然時間date列我們也稱之為特征,那么在這份數(shù)據(jù)中我們能否增加一些特征工程的操作呢? 答案是當然能,其中我們可以進行一些 常見的特征工程操作例如:將時間列date提取出來,進行拆分處理對于天日期我們可以分出是否是周六、周日,對于時間我們可以細分為當天的第幾個時間段, 一些其它的特征工程操作例如:我們可以將OT列的過去三天同一時間段的數(shù)據(jù)取出來生成三個新的特征列,將同一時間段的所有數(shù)據(jù)的平均值全部求出來算一個平均值生成一個新的特征列,這些操作都是可以的。 下面是一個示例我們來展示一下對于進行特征工程和未進行特征工程操作的數(shù)據(jù)進行結(jié)果的對比。 對于這段代碼,選用的是Xgboost模型進行一個四分類任務(wù)的實驗其是一個基于某公司的業(yè)務(wù)進行預(yù)測然后進行的一個分類實驗代碼,其中有一段特征工程的操作代碼 這一份是是否進行特征工程的操作當feature為True的時候我們就選取一些特征過程的部分進行模型訓(xùn)練以及預(yù)測,為False時候不進行特征工程的操作,下面讓我們來對比一下結(jié)果。 可以看出對于是否進行特征工程的精度差距為0.86-0.71=0..15所以進行特征工程是一個十分重要的操作。 通過使用這些特征工程技術(shù),我們可以創(chuàng)建出更具代表性的特征,從而提高模型的預(yù)測性能。 常見的時間序列預(yù)測方法 經(jīng)過了時間序列預(yù)測處理和特征工程的操作,下面我們就需要來了解一些模型了和一些模型的概念。 預(yù)測方法的分類概念 我們可以將時間序列預(yù)測方法分為幾個主要類別,包括單變量預(yù)測、多變量預(yù)測,以及其他一些其它的預(yù)測方法。 單變量時間序列預(yù)測:單變量時間序列預(yù)測是最常見的預(yù)測方法,它只依賴于一個單一的時間序列數(shù)據(jù)源。這種類型的預(yù)測主要關(guān)注如何根據(jù)過去的數(shù)據(jù)來預(yù)測未來的數(shù)據(jù)。常見的單變量預(yù)測方法包括自回歸移動平均模型(ARIMA)、指數(shù)平滑模型、隨機森林和深度學(xué)習(xí)模型等。 多變量時間序列預(yù)測:與單變量預(yù)測相比,多變量時間序列預(yù)測使用兩個或更多的相關(guān)時間序列來進行預(yù)測。這種方法可以幫助我們更好地理解和利用不同變量之間的相互關(guān)系。多變量預(yù)測方法包括向量自回歸模型(VAR)、協(xié)整模型和多變量深度學(xué)習(xí)模型等。 除了上述分類,還有一些其他類型的時間序列預(yù)測方法: 混合模型預(yù)測:混合模型預(yù)測是將多個預(yù)測模型的結(jié)果結(jié)合起來,以得到更好的預(yù)測結(jié)果。這種方法可以利用不同模型的優(yōu)點,并減少模型偏差的影響。例如,可以將ARIMA模型的預(yù)測結(jié)果與深度學(xué)習(xí)模型的預(yù)測結(jié)果結(jié)合起來。 頻域方法預(yù)測:頻域方法預(yù)測是通過分析數(shù)據(jù)的頻率成分來進行預(yù)測。這種方法特別適用于具有明顯周期性的數(shù)據(jù)。例如,傅立葉變換就是一種常用的頻域分析方法。 異常檢測預(yù)測:異常檢測預(yù)測是一種旨在識別和預(yù)測異常時間點的方法。這種方法常用于信用卡欺詐檢測、網(wǎng)絡(luò)入侵檢測等場景。 下面來就這些模型進行一個詳細的解決以及舉例 單變量預(yù)測 移動平均模型 移動平均模型(Moving Average Model):移動平均模型使用時間序列過去的幾個觀測值的均值作為未來預(yù)測的依據(jù)。它適用于沒有明顯趨勢或季節(jié)性的數(shù)據(jù)。 (PS:移動平均就是指根據(jù)過去未來一定時間段內(nèi)的值賦予給其中的每一個值一個權(quán)重然后進行加權(quán)求和就是最新的值) 下面是一個簡單的示例: 可以看出我們的窗口為3因為頭兩個數(shù)值前面的數(shù)據(jù)并不夠窗口的大小所以填充值為NaN 指數(shù)平滑 指數(shù)平滑(Exponential Smoothing):指數(shù)平滑模型根據(jù)時間序列的加權(quán)平均來進行預(yù)測,其中較近的數(shù)據(jù)點具有較高的權(quán)重。這種方法適用于平滑對稱或非對稱季節(jié)性的數(shù)據(jù)。 指數(shù)平滑一般分為三種:簡單指數(shù)平滑、雙指數(shù)平滑和三指數(shù)平滑(Holt-Winters) 。 下面是三種指數(shù)平滑的例子,大家有需要可以自己運行嘗試一下看看效果,其中比較重要的是三指數(shù)平滑。 簡單指數(shù)平滑 二指數(shù)平滑三指數(shù)平滑 三指數(shù)平滑又稱為Holt-Winters大家有想詳細了解的可以看我的另一篇博客里面有詳細的講解 Xgboost模型 XGBoost是一種梯度提升樹算法,它通過迭代地訓(xùn)練多個決策樹,并使用梯度下降方法來最小化目標函數(shù)(常用的是均方誤差)。XGBoost通過合并多個弱學(xué)習(xí)器(決策樹)的預(yù)測結(jié)果來提升整體模型的性能和穩(wěn)定性。它可以同時考慮特征的非線性關(guān)系、交互作用和特征重要性等因素,并具有較高的預(yù)測準確度。 ARIMA模型 ARIMA模型(Autoregressive Integrated Moving Average Model):ARIMA模型是一種基于時間序列自回歸和移動平均的模型。它用過去觀測值的線性組合來預(yù)測未來值。ARIMA模型可以處理具有明顯趨勢和季節(jié)性的數(shù)據(jù)。 大家有需要的可以關(guān)注我后期的博客和專欄,我會出ARIMA模型的詳細講解這里就不再過多的贅述了,因為這一篇博客主要是介紹一些概念,后期我也會添加鏈接到這里。 ARIMA還有一些增強的模型包括SARIMA模型(Seasonal ARIMA Model):SARIMA模型是ARIMA模型在具有明顯季節(jié)性的數(shù)據(jù)上的擴展。它考慮季節(jié)性的影響,并根據(jù)歷史數(shù)據(jù)中的季節(jié)模式進行預(yù)測。 隨機森林 隨機森林是一種基于決策樹的集成學(xué)習(xí)方法,它通過隨機選擇特征子集和樣本的子集來訓(xùn)練多個決策樹。每個決策樹都是根據(jù)隨機選擇的特征和樣本進行訓(xùn)練,并通過投票或平均預(yù)測結(jié)果來做出最終的預(yù)測。隨機森林能夠有效地處理高維特征空間和大規(guī)模數(shù)據(jù),并具有一定的抗過擬合能力。 大家有需要的可以關(guān)注我后期的博客和專欄,我會出Xgboost模型的詳細講解這里就不再過多的贅述了,因為這一篇博客主要是介紹一些概念,后期我也會添加鏈接到這里。 多變量預(yù)測 當涉及多變量時間序列預(yù)測時,有幾種常見的模型可以使用。 VAR模型 VAR模型是一種基于向量自回歸的多變量時間序列預(yù)測模型。它基于兩個關(guān)鍵概念:自回歸(Autoregression)和向量(Vector)。自回歸表示每個變量的值可以由它自身的歷史值來預(yù)測。向量表示我們考慮多個變量同時作為預(yù)測變量。VAR模型假設(shè)每個變量的當前值與過去一段時間內(nèi)所有變量的值相關(guān),通過建立一個包含所有變量的回歸模型來預(yù)測未來的變量值。VAR模型可以通過最小二乘法或最大似然估計進行參數(shù)估計。 LSTM模型 LSTM是一種遞歸神經(jīng)網(wǎng)絡(luò)(RNN)的變體,用于處理具有長期時間依賴關(guān)系的序列數(shù)據(jù)。在多變量時間序列預(yù)測中,每個變量被視為一個輸入序列,模型通過學(xué)習(xí)時間序列中的模式和關(guān)聯(lián)來預(yù)測未來的變量值。LSTM通過使用一種稱為'門'的機制來解決傳統(tǒng)RNN中的梯度消失和梯度爆炸問題,使其能夠有效地捕捉長期依賴。LSTM模型具有記憶單元,可以處理和存儲先前的信息,并根據(jù)需要更新和使用這些信息。 大家有需要的可以看我的另一篇博客或者訂閱我的專欄里面有詳細的講解。 GARCH模型 GARCH模型是一種常用于金融領(lǐng)域的多變量時間序列預(yù)測模型,特別用于建模序列的方差變化。它基于兩個概念:自回歸(Autoregressive)和條件異方差(Conditional Heteroskedasticity)。自回歸表示方差的當前值與其過去的方差值相關(guān)。條件異方差表示方差是隨時間變化的,并且與過去的變量值相關(guān)。GARCH模型通過建立自回歸和條件異方差的模型來預(yù)測未來的方差值,進而根據(jù)方差估計變量的預(yù)測值。 Prophet模型 Prophet是由Facebook開發(fā)的一種開源的多變量時間序列預(yù)測框架。它適用于具有季節(jié)性、趨勢性和節(jié)假日等復(fù)雜特征的預(yù)測問題。Prophet模型擁抱時間序列的非線性趨勢,并使用加性模型來組合季節(jié)性、趨勢性和節(jié)假日效應(yīng)。該模型使用基于分解的方法來捕捉不同的時間組件,并結(jié)合回歸分析來處理外部影響因素。Prophet模型在預(yù)測中提供了可解釋性,并且非常適合用于具有多種時間特征的多變量時間序列數(shù)據(jù)。 以下是一個簡單Prophet模型的實現(xiàn)案例大家有需要的可以copy運行以下,別忘了下載運行庫 所要的csv文件我也會在后面的下載鏈接里面提供。 GRU模型 GRU模型引入了門控機制,目的是解決傳統(tǒng)RNN中的梯度消失和梯度爆炸問題,并提供一種有效地捕捉長期依賴關(guān)系的方法。 GRU模型中包含兩個關(guān)鍵的門:更新門(update gate)和重置門(reset gate)。更新門決定了模型需要在當前步驟中記住多少舊信息,并融合進來,同時接收新的信息。重置門決定了模型需要忽略多少舊信息,并且在當前步驟中重置隱藏狀態(tài)。 GRU模型通過這兩個門的組合,可以選擇性地保留和丟棄信息,并根據(jù)序列的特點自適應(yīng)地更新內(nèi)部狀態(tài)。這使得GRU在處理長序列數(shù)據(jù)時可以更好地捕捉長期依賴關(guān)系,而且相對于LSTM模型而言,GRU模型的參數(shù)數(shù)量更少,計算量更小。 在多變量時間序列預(yù)測中,GRU模型可以被應(yīng)用于每個變量的輸入序列,并通過并行處理多個變量的信息來進行預(yù)測。通過學(xué)習(xí)序列中的模式和關(guān)聯(lián),GRU模型能夠預(yù)測未來的變量值,并提供關(guān)于時間序列數(shù)據(jù)內(nèi)部模式的解釋。 總結(jié)來說,GRU模型是一種適用于處理多變量時間序列預(yù)測的神經(jīng)網(wǎng)絡(luò)模型。它通過引入更新門和重置門的機制,能夠有效地處理長期依賴關(guān)系,并提供了一種學(xué)習(xí)時間序列模式和預(yù)測未來值的方法。GRU模型在序列預(yù)測和生成任務(wù)中表現(xiàn)出色,得到了廣泛應(yīng)用。 Transformer模型 Transformer模型是一種基于注意力機制的序列建模方法,最初在自然語言處理領(lǐng)域引起了廣泛的關(guān)注和成功應(yīng)用。然而,Transformer模型同樣適用于處理多變量時間序列數(shù)據(jù)。 Transformer模型使用自注意力機制來學(xué)習(xí)序列中不同位置的依賴關(guān)系,并根據(jù)這些依賴關(guān)系來編碼輸入序列。它使用多層的自注意力層和前饋神經(jīng)網(wǎng)絡(luò)層,通過多次迭代學(xué)習(xí)序列中的信息。Transformer模型通過避免傳統(tǒng)的遞歸結(jié)構(gòu),實現(xiàn)了并行計算,使得它更適合處理長序列數(shù)據(jù)。在多變量時間序列預(yù)測中,Transformer模型可以將每個變量視為一個序列,并將它們作為輸入來進行預(yù)測。 MTS-Mixers MTS-Mixers(Multi-Time-Series Mixers)是一種基于深度學(xué)習(xí)的多元時間序列預(yù)測方法。MTS-Mixers是在Transformer的基礎(chǔ)上進行了改進和擴展,以應(yīng)對多變量時間序列數(shù)據(jù)的特殊要求。 MTS-Mixers模型將多個時間序列數(shù)據(jù)混合在一起,并結(jié)合Transformer的編碼器和解碼器進行建模和預(yù)測。它利用交叉注意力機制來學(xué)習(xí)序列之間的相關(guān)性,并根據(jù)這些相關(guān)性進行聯(lián)合預(yù)測。MTS-Mixers模型還考慮了不同時間尺度(比如小時、天、周等)之間的關(guān)系,并通過適當?shù)臅r間間隔對輸入序列進行采樣和處理。 時間序列預(yù)測的應(yīng)用領(lǐng)域 時間序列預(yù)測在很多領(lǐng)域都具有廣泛的應(yīng)用。以下是一些常見的應(yīng)用領(lǐng)域: 金融和股票市場預(yù)測:時間序列預(yù)測可以幫助預(yù)測股票價格、貨幣匯率、利率變動等金融指標,為投資決策提供參考。 銷售和需求預(yù)測:通過分析歷史銷售數(shù)據(jù),時間序列預(yù)測可以幫助企業(yè)預(yù)測產(chǎn)品銷售情況、需求量等,以優(yōu)化庫存管理和生產(chǎn)計劃。 能源需求和負荷預(yù)測:時間序列模型可以用于預(yù)測電力、天然氣等能源需求,以及負荷變化,從而支持能源供應(yīng)和節(jié)能策略。 交通流量預(yù)測:時間序列預(yù)測可以幫助預(yù)測交通擁堵情況、交通流量高峰等,協(xié)助交通規(guī)劃和優(yōu)化交通運輸系統(tǒng)。 天氣和氣候預(yù)測:時間序列模型在氣象學(xué)中起著重要作用,可以用于預(yù)測氣溫、濕度、降水量等天氣和氣候變量,支持天氣預(yù)報和氣候研究 這只是時間序列預(yù)測的一些應(yīng)用領(lǐng)域示例,實際上,時間序列預(yù)測在許多其他行業(yè)和領(lǐng)域中具有廣泛的應(yīng)用,隨著數(shù)據(jù)的不斷積累和技術(shù)的進步,時間序列預(yù)測的應(yīng)用前景將不斷擴大。 |
|