在Python和R語(yǔ)言中使用Auto ARIMA構(gòu)建高性能時(shí)間序列模型

想象一下,你的任務(wù)是預(yù)測(cè)下一部iPhone的價(jià)格,并提供了歷史數(shù)據(jù)。這包括季度銷售、月度支出,以及蘋果資產(chǎn)負(fù)債表上的一大堆東西。作為一個(gè)數(shù)據(jù)科學(xué)家,你會(huì)把這個(gè)問(wèn)題歸類為什么?當(dāng)然是時(shí)間序列建模。

從預(yù)測(cè)產(chǎn)品的銷售到估計(jì)家庭的用電量,時(shí)間序列預(yù)測(cè)是任何數(shù)據(jù)科學(xué)家都應(yīng)該知道的核心技能之一,如果不是精通的話。有很多不同的技術(shù)可供您使用,在本文中,我們將介紹一種最有效的技術(shù),稱為Auto ARIMA。

我們將首先了解ARIMA的概念,這將帶領(lǐng)我們進(jìn)入我們的主要話題——Auto ARIMA。為了鞏固我們的概念,我們將拿起一個(gè)數(shù)據(jù)集并在Python和R語(yǔ)言中實(shí)現(xiàn)它。


目錄

1.什么是時(shí)間序列?

2.時(shí)間序列預(yù)測(cè)方法

3.ARIMA概論

4.ARIMA實(shí)施步驟

5.為什么我們需要Auto ARIMA?

6.Auto ARIMA實(shí)現(xiàn)(空中乘客數(shù)據(jù)集)

7.Auto ARIMA如何選擇參數(shù)?

如果您熟悉時(shí)間序列及其技術(shù)(如移動(dòng)平均、指數(shù)平滑和ARIMA),則可以直接跳到第4節(jié)。對(duì)于初學(xué)者來(lái)說(shuō),從下面的部分開(kāi)始,這是對(duì)時(shí)間序列和各種預(yù)測(cè)技術(shù)的簡(jiǎn)要介紹。


1.什么是時(shí)間序列?

在我們學(xué)習(xí)處理時(shí)間序列數(shù)據(jù)的技術(shù)之前,我們必須首先理解時(shí)間序列實(shí)際上是什么,以及它與任何其他類型的數(shù)據(jù)有什么不同。這里是時(shí)間序列的形式定義,它是一系列以一致的時(shí)間間隔測(cè)量的數(shù)據(jù)點(diǎn)。這僅僅意味著以固定的間隔記錄特定的值,該間隔可以是小時(shí)、每天、每周、每10天等等。使時(shí)間序列不同的是,該系列中的每個(gè)數(shù)據(jù)點(diǎn)都依賴于先前的數(shù)據(jù)點(diǎn)。讓我們通過(guò)幾個(gè)例子來(lái)更清楚地理解差異。

例1:

假設(shè)你有一個(gè)從某個(gè)公司貸款的人的數(shù)據(jù)集(如下表所示)。你認(rèn)為每一行都與前一行相關(guān)嗎?當(dāng)然不是!一個(gè)人的貸款將基于他的經(jīng)濟(jì)狀況和需要(可能有其他因素,如家庭規(guī)模等,但為了簡(jiǎn)單起見(jiàn),我們只考慮收入和貸款類型)。此外,數(shù)據(jù)沒(méi)有收集在任何特定的時(shí)間間隔。這取決于公司何時(shí)收到貸款申請(qǐng)。

免費(fèi)視頻教程:www.mlxs.top

讓我們?cè)倥e一個(gè)例子。假設(shè)你有一個(gè)數(shù)據(jù)集包含每天的空氣中的二氧化碳含量(下面的截圖)。你能通過(guò)看過(guò)去幾天的數(shù)值來(lái)預(yù)測(cè)第二天的二氧化碳量嗎?當(dāng)然。如果你觀察到,數(shù)據(jù)已經(jīng)被記錄在每天的基礎(chǔ)上,也就是說(shuō),時(shí)間間隔是恒定的(24小時(shí))。

免費(fèi)視頻教程:www.mlxs.top

到現(xiàn)在為止,你一定已經(jīng)對(duì)此有了直覺(jué)——第一種情況是簡(jiǎn)單的回歸問(wèn)題,第二種情況是時(shí)間序列問(wèn)題。雖然這里的時(shí)間序列難題也可以用線性回歸來(lái)解決,但這并不是最好的方法,因?yàn)樗雎粤酥蹬c所有相對(duì)過(guò)去值的關(guān)系。現(xiàn)在讓我們來(lái)看看用于解決時(shí)間序列問(wèn)題的一些常用技術(shù)。


2.時(shí)間序列預(yù)測(cè)方法

有許多方法用于時(shí)間序列預(yù)測(cè),我們將在這一節(jié)中簡(jiǎn)要地介紹它們。下面提到的所有技術(shù)的詳細(xì)說(shuō)明和python代碼可以在本文中找到:7種時(shí)間序列預(yù)測(cè)技術(shù)(使用python代碼)

樸素方法:在這種預(yù)測(cè)技術(shù)中,新數(shù)據(jù)點(diǎn)的值被預(yù)測(cè)為等于前一個(gè)數(shù)據(jù)點(diǎn)。結(jié)果是一條平直的線,因?yàn)樗行碌闹刀既∏懊娴闹怠?/p>

免費(fèi)視頻教程:www.mlxs.top

簡(jiǎn)單平均值:下一個(gè)值作為所有先前值的平均值。這里的預(yù)測(cè)優(yōu)于“樸素方法”,因?yàn)樗粫?huì)導(dǎo)致一條直線,但在這里,所有過(guò)去的值都被考慮在內(nèi),這可能并不總是有用的。例如,當(dāng)被要求預(yù)測(cè)今天的溫度時(shí),你會(huì)考慮過(guò)去7天的溫度,而不是一個(gè)月前的溫度。

免費(fèi)視頻教程:www.mlxs.top

移動(dòng)平均值:這是對(duì)先前技術(shù)的改進(jìn)。不是取所有先前點(diǎn)的平均值,取先前點(diǎn)的平均值作為預(yù)測(cè)值。

免費(fèi)視頻教程:www.mlxs.top

加權(quán)移動(dòng)平均:加權(quán)移動(dòng)平均是一個(gè)移動(dòng)平均值,其中過(guò)去的n個(gè)值被賦予不同的權(quán)重。

免費(fèi)視頻教程:www.mlxs.top

簡(jiǎn)單指數(shù)平滑:在這種技術(shù)中,與來(lái)自遠(yuǎn)古的觀測(cè)相比,更大的權(quán)重被分配給最近的觀測(cè)。

免費(fèi)視頻教程:www.mlxs.top

霍爾特的線性趨勢(shì)模型:該方法考慮了數(shù)據(jù)集的趨勢(shì)。從趨勢(shì)來(lái)看,我們指的是級(jí)數(shù)的遞增或遞減性質(zhì)。假設(shè)旅館的預(yù)訂數(shù)量每年都在增加,那么我們可以說(shuō)預(yù)訂數(shù)量呈現(xiàn)出增加的趨勢(shì)。該方法的預(yù)測(cè)功能是水平和趨勢(shì)的函數(shù)。

免費(fèi)視頻教程:www.mlxs.top

霍爾特-溫特斯方法:該算法同時(shí)考慮了該系列的趨勢(shì)和季節(jié)性。例如,一家酒店的預(yù)訂數(shù)量在周末很高,而在工作日則很低,并且每年都在增加;存在每周的季節(jié)性和增長(zhǎng)的趨勢(shì)。

免費(fèi)視頻教程:www.mlxs.top

ARIMA:ARIMA是一種非常流行的時(shí)間序列建模技術(shù)。它描述了數(shù)據(jù)點(diǎn)之間的相關(guān)性,并考慮了值的差異。ARIMA的改進(jìn)是SARIMA(或季節(jié)性ARIMA)。我們將在下面的部分更詳細(xì)地介紹ARIMA。


3.ARIMA概論

在這一節(jié)中,我們將對(duì)ARIMA做個(gè)簡(jiǎn)短介紹,這將有助于理解Auto ARIMA。本文包括對(duì)Arima、參數(shù)(p,q,d)、繪圖(ACF PACF)和實(shí)現(xiàn)的詳細(xì)說(shuō)明:時(shí)間序列的完整教程。

ARIMA是一種非常流行的時(shí)間序列預(yù)測(cè)的統(tǒng)計(jì)方法。ARIMA代表自回歸綜合移動(dòng)平均線。ARIMA模型的工作原理如下:

數(shù)據(jù)序列是固定的,這意味著均值和方差不應(yīng)該隨時(shí)間而變化。利用對(duì)數(shù)變換或差分級(jí)數(shù)可以使一系列平穩(wěn)。

作為輸入的數(shù)據(jù)必須是單變量序列,因?yàn)锳RIMA使用過(guò)去的值來(lái)預(yù)測(cè)未來(lái)值。

ARIMA有三個(gè)組成部分——AR(自回歸項(xiàng))、I(差分項(xiàng))和MA(移動(dòng)平均項(xiàng))。讓我們了解這些組件中的每一個(gè)——

AR項(xiàng)是指用于預(yù)測(cè)下一個(gè)值的過(guò)去值。AR項(xiàng)由ARIMA中的參數(shù)“p”定義。使用PACF圖確定p′的值。

MA項(xiàng)用于定義用于預(yù)測(cè)未來(lái)值的過(guò)去預(yù)測(cè)誤差的數(shù)目。ARIMA中的參數(shù)“q”表示MA項(xiàng)。ACF圖用于識(shí)別正確的“q”值。

差分的順序指定差分運(yùn)算在序列上執(zhí)行的次數(shù)以使其平穩(wěn)。類似ADF和KPSS的測(cè)試可以用來(lái)確定該系列是否是固定的并且有助于識(shí)別D值。


4.ARIMA實(shí)施步驟

實(shí)現(xiàn)ARIMA模型的一般步驟是:

加載數(shù)據(jù):模型建立的第一步當(dāng)然是加載數(shù)據(jù)集。

預(yù)處理:取決于數(shù)據(jù)集,預(yù)處理的步驟將被定義。這將包括創(chuàng)建時(shí)間戳、轉(zhuǎn)換日期/時(shí)間列的dType、制作系列單變量等。

使系列平穩(wěn):為了滿足假設(shè),有必要使系列平穩(wěn)。這將包括檢查序列的平穩(wěn)性和執(zhí)行所需的變換。

確定值:為了使序列平穩(wěn),將執(zhí)行差值操作的次數(shù)作為d值

創(chuàng)建ACF和PACF圖:這是ARIMA實(shí)施中最重要的一步。ACF PACF圖用于確定我們的ARIMA模型的輸入?yún)?shù)。

確定p和q值:從前一步的圖中讀取p和q的值

擬合ARIMA模型:使用處理后的數(shù)據(jù)和我們先前步驟計(jì)算的參數(shù)值,擬合ARIMA模型

預(yù)測(cè)集上的預(yù)測(cè)值:預(yù)測(cè)未來(lái)價(jià)值

計(jì)算RMSE:為了檢查模型的性能,使用驗(yàn)證集上的預(yù)測(cè)和實(shí)際值檢查RMSE值


5.為什么我們需要Auto ARIMA?

雖然ARIMA是預(yù)測(cè)時(shí)間序列數(shù)據(jù)的一個(gè)非常強(qiáng)大的模型,但是數(shù)據(jù)準(zhǔn)備和參數(shù)調(diào)整過(guò)程最終非常耗時(shí)。在實(shí)現(xiàn)ARIMA之前,您需要使序列平穩(wěn),并使用上面討論的圖確定p和q的值。Auto ARIMA使這個(gè)任務(wù)對(duì)我們來(lái)說(shuō)非常簡(jiǎn)單,因?yàn)樗宋覀冊(cè)谏弦还?jié)中看到的步驟3到6。下面是實(shí)現(xiàn)Auto ARIMA所需遵循的步驟:

加載數(shù)據(jù):這一步將是相同的。將數(shù)據(jù)加載到筆記本中

預(yù)處理數(shù)據(jù):輸入應(yīng)該是單變量的,因此放棄其他列。

擬合Auto ARIMA:在單變量序列上擬合模型

驗(yàn)證集上的預(yù)測(cè)值:對(duì)驗(yàn)證集進(jìn)行預(yù)測(cè)

計(jì)算RMSE:使用實(shí)際值的預(yù)測(cè)值檢查模型的性能

我們完全繞過(guò)P和Q特征的選擇,如您所見(jiàn)。多么令人寬慰??!在下一節(jié)中,我們將使用玩具數(shù)據(jù)集實(shí)現(xiàn)AutoARIMA。


6.在Python和R語(yǔ)言中的實(shí)現(xiàn)

我們將使用國(guó)際航空旅客數(shù)據(jù)集。這個(gè)數(shù)據(jù)集包含每月的乘客總數(shù)(數(shù)以千計(jì))。它有兩列——月和乘客數(shù)。您可以從這個(gè)鏈接下載數(shù)據(jù)集。

#load the data

data = pd.read_csv('international-airline-passengers.csv')

#divide into train and validation set

train = data[:int(0.7*(len(data)))]

valid = data[int(0.7*(len(data))):]

#preprocessing (since arima takes univariate series as input)

train.drop('Month',axis=1,inplace=True)

valid.drop('Month',axis=1,inplace=True)

#plotting the data

train['International airline passengers'].plot()

valid['International airline passengers'].plot()

免費(fèi)視頻教程:www.mlxs.top

#building the model

from pyramid.arima import auto_arima

model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)

model.fit(train)

forecast = model.predict(n_periods=len(valid))

forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])

#plot the predictions for validation set

plt.plot(train, label='Train')

plt.plot(valid, label='Valid')

plt.plot(forecast, label='Prediction')

plt.show()

免費(fèi)視頻教程:www.mlxs.top

#calculate rmsefrommathimportsqrtfromsklearn.metricsimportmean_squared_errorrms = sqrt(mean_squared_error(valid,forecast))print(rms)

output -

76.51355764316357

以下是相同問(wèn)題的R語(yǔ)言代碼:

#loading packageslibrary(forecast)library(Metrics)#reading datadata = read.csv("international-airline-passengers.csv")#splitting data into train and valid setstrain = data[1:100,]valid = data[101:nrow(data),]#removing"Month"columntrain$Month = NULL#training modelmodel = auto.arima(train)#model summarysummary(model)#forecastingforecast = predict(model,44)#evaluationrmse(valid$International.airline.passengers, forecast$pred)


7.Auto ARIMA如何選擇最佳參數(shù)

在上面的代碼中,我們僅僅使用.fit()命令來(lái)擬合模型,而不必選擇p、q、d的組合。但是模型如何確定這些參數(shù)的最佳組合呢?Auto ARIMA考慮生成的AIC和BIC值(如代碼所示),以確定參數(shù)的最佳組合。AIC(AKaiKe信息準(zhǔn)則)和BIC(貝葉斯信息準(zhǔn)則)值是比較模型的估計(jì)量。這些值越低,模型越好。

看看這些鏈接,如果你感興趣的數(shù)學(xué)背后的AICBIC。


8.小結(jié)與延伸閱讀

我發(fā)現(xiàn)Auto ARIMA是執(zhí)行時(shí)間序列預(yù)測(cè)的最簡(jiǎn)單的技術(shù)。知道一條捷徑是好的,但是熟悉它背后的數(shù)學(xué)也是很重要的。在本文中,我瀏覽了ARIMA如何工作的細(xì)節(jié),但是請(qǐng)確保您瀏覽了本文中提供的鏈接。為了便于參考,以下是鏈接:

Python中時(shí)間序列預(yù)測(cè)初學(xué)者的綜合指南

R語(yǔ)言中時(shí)間序列的完整教程

時(shí)間序列預(yù)測(cè)的7種技術(shù)(用Python碼)

我建議在這里實(shí)踐我們?cè)谶@個(gè)實(shí)踐問(wèn)題上學(xué)到的東西:時(shí)間序列實(shí)踐問(wèn)題。你也可以把我們的培訓(xùn)課程創(chuàng)建在同一個(gè)實(shí)踐問(wèn)題上,時(shí)間序列預(yù)測(cè),為你提供一個(gè)開(kāi)頭。免費(fèi)視頻教程:www.mlxs.top

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容