Nachiketa Hebbar

Sledovat

18. září, 2020 – 8 minut čtení

Prognózování časových řad je jednou z nejžádanějších technik datové vědy, ať už jde o obchodování s akciemi, předpovídání obchodních tržeb nebo předpověď počasí. Je to jednoznačně velmi užitečná dovednost a právě tou vás vybavím na konci tohoto článku.

V tomto tutoriálu sestavíme model ARIMA(nebojte se, pokud ještě přesně nevíte, jak to funguje) pro předpověď budoucích hodnot teploty v určitém městě pomocí jazyka python. Odkaz na GitHub pro kód a soubor dat najdete na konci tohoto blogu. Na konci jsem také připojil své video na YouTube, pokud byste měli zájem o video s vysvětlením. Takže bez ztráty času začněme.

Prvním krokem v každé časové řadě je načtení dat a zjištění, jak vypadají. Následující úryvek kódu ukazuje, jak to udělat.

Kód je poměrně jednoduchý. Data načteme pomocí pd.read_csv a zápisem parse_date=True se ujistíme, že pandas pochopí, že pracuje s hodnotami data, a ne s hodnotami řetězců.

Následuje vypuštění všech chybějících hodnot a vypsání tvaru dat. df.head() vypíše prvních 5 řádků datasetu. Zde je výstup, který byste při tom měli vidět:

Plot Your data

Následuje vykreslení dat. Tím získáte představu o tom, zda jsou data stacionární, nebo ne. Pro ty, kteří nevědí, co znamená stacionarita, uvedu její podstatu. Ačkoli jsem na toto téma natočil několik videí, vše se omezuje na toto:

Každá data časové řady, která mají být modelována, musí být stacionární. Stacionární znamená, že jeho statistické vlastnosti jsou v čase víceméně konstantní. To dává smysl, ne? Jak jinak chcete předpovídat, když se statistické vlastnosti s časem mění? Jedná se o následující vlastnosti, které bude mít každý model stacionarity:

  1. Konstantní průměr
  2. Konstantní rozptyl(Mohou se vyskytovat odchylky, ale odchylky by neměly být nepravidelné)
  3. Žádná sezónnost(Žádné opakující se vzory v souboru dat)

Takže prvním krokem je kontrola stacionarity. Pokud váš soubor dat není stacionární, budete jej muset převést na stacionární řadu. Než se tím vším začnete zabývat, uklidněte se! Máme pevně stanovený jednoduchý test pro kontrolu stacionarity, který se nazývá ADF(Augmented Dickey Fuller Test). Ale než si ho ukážeme, pojďme si nejprve vykreslit data.

Protože mě zajímá pouze předpověď průměrné teploty, bude to jediný sloupec, který budu vykreslovat.

df.plot(figsize=(12,5))

Kontrola stacionarity

Hned zpočátku můžeme vidět, že se zdá, že má poněkud konstantní průměr kolem 45. V tomto případě se jedná o průměrnou teplotu. A také výkyvy se zdají být víceméně stejné. Abychom si však byli jisti, zda jsou data stacionární, nebo ne, provedeme pevný statistický test pomocí následujícího kódu:

Výstup získáte takto:

Nemusíte se zabývat všemi složitými statistikami. Pro interpretaci výsledků testu se stačí podívat na hodnotu p. A použijete následující jednoduchou metodu:

If p< 0,05 ; Data jsou stacionární

if p>0,05; Data nejsou stacionární

Není to pevné pravidlo, ale stacionární data by měla mít malou p hodnotu. Větší hodnota p by mohla naznačovat přítomnost určitých trendů(měnící se průměr) nebo také sezónnost.

Nakonec se rozhodněte pro model ARIMA

Nyní, přestože jsem na toto téma natočil několik videí na YouTube, pokud plně nerozumíte tomu, co je model ARIMA, dovolte mi, abych vám předložil jednoduchý přehled:

ARIMA se skládá ze 3 členů(Auto-Regrese + Integrovaný+Pohyblivý průměr)

  1. Auto-Regrese:

To v podstatě znamená, že pro předpověď budoucnosti používáte předchozí hodnoty časové řady. Kolik minulých hodnot použijete, určuje pořadí AR modelu. Takto vypadá model AR(1):

Y(t)= Some_Constant*Y(t-1)+ Another_Constant +Error(t)

Je to dost jednoduché, že?“

2. Integrovaný:

Takže, vzpomínáte si na náš rozhovor o stacionaritě a o tom, jak je nesmírně důležitá? No, pokud váš soubor dat není stacionární, musíte nejčastěji provést nějakou diferenční operaci, aby byl stacionární. Pokud diferencujete s předchozí hodnotou, je její řád 1 atd. Zde je příklad:

Omluvte můj špatný nákres. Ale jak vidíte, řada Y(t) nebyla stacionární, protože rostoucí trend měl za následek měnící se střední hodnotu. Jednoduše ji odečteme od předchozích hodnot a voilá! Stane se stacionární. V závislosti na vašich datech budete možná muset diferencování opakovat, abyste získali diferencování druhého řádu , třetího řádu atd.

3. Klouzavý průměr:

To v podstatě znamená, že k předpovědi budoucnosti používáte předchozí chyby. Také to dává smysl, že? Tím, že vidíte, jak moc jste se ve své předpovědi mýlili, to zohledníte, abyste udělali lepší předpověď. A stejně jako v modelu AR počet předchozích chyb(také se mu říká počet zpoždění), které použijete, určuje pořadí modelu.

Takto vypadá rovnice pořadí MA(1):
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

Naším hlavním úkolem je tedy rozhodnout o pořadí částí AR, I, MA, které jsou darovány(p,d,q), resp.

A než se začnete bát, prozradím vám, že vše proběhne automaticky. na pomoc nám přichází knihovna pmdarima! Ta se o zjištění pořadí ARIMA postará úplně sama. Takto vypadá úryvek kódu:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Nezapomeňte nejprve nainstalovat knihovnu pmdarima pomocí příkazu pip install pmdarima)

Kód je celkem srozumitelný. Funkci auto_arima jednoduše dodáme naše data. Funkce v podstatě používá něco, co se nazývá jako skóre AIC, aby posoudila, jak dobrý je model určitého pořadí. Jednoduše se snaží minimalizovat skóre AIC a zde je vidět, jak vypadá výstup:

Výkonnost modelu pro různé kombinace řádů

Vidíme, že nejlepší model ARIMA se zdá být řád (1,0,5) s minimálním skóre AIC=8294.785. S touto znalostí můžeme konečně přistoupit k trénování a fitování modelu, abychom mohli začít předpovídat!“

Rozdělení datové sady

Před vlastním trénováním modelu musíme datovou sadu rozdělit na tréninkovou a testovací část. Děláme to proto, že model nejprve na datech natrénujeme a testovací část necháme před modelem skrytou. Jakmile je model připraven, požádáme ho, aby provedl předpovědi na testovacích datech, a zjistíme, jak dobře si vede.

Následující úryvek kódu ilustruje, jak to udělat:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Jak tedy asi tušíte, vyhrazujeme si posledních 30 dní dat jako testovací část. Ve výstupu můžete vidět tvary skutečných dat a testovací a tréninkové části.

Tvar tréninkové a testovací části

Konečně se dostáváme k tomu nejšťavnatějšímu!

Překvapivě je vytvoření modelu ARIMA vlastně jedním z nejjednodušších kroků, jakmile provedete všechny nezbytné kroky. Je to tak jednoduché, jak ukazuje následující úryvek kódu:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Jak vidíte, jednoduše zavoláme funkci ARIMA, dodáme jí náš soubor dat a zmíníme pořadí modelu ARIMA, které chceme. Ve výstupu uvidíte také souhrn modelu.

Souhrn modelu

Zde můžete vidět celou řadu informací o vašem modelu. Také si budete moci prohlédnout koeficienty jednotlivých členů AR a MA. Nejde o nic jiného než o hodnoty proměnných, které jste viděli v předchozí rovnici AR/MA modelu a které byly označeny jako ‚Some_Constant‘. Obecně vyšší velikost této proměnné znamená, že má větší vliv na výstup.

Zjistěte, jak dobrý je váš model

Tady přicházejí na řadu naše testovací data. Na testovacích datech nejprve provedeme předpověď pro teplotu. Poté vykreslíme graf, abychom zjistili, jak se naše předpovědi srovnaly se skutečnými daty.

Abychom mohli předpovědi skutečně provést, musíme použít funkci model.predict a sdělit jí počáteční a koncový index, ve kterém chceme předpovědi provést.

Protože chceme začít provádět předpovědi tam, kde končí trénovací data , to jsem napsal do proměnné start. Předpovědi chceme přestat dělat, když sada dat skončí, což vysvětluje proměnná end. Pokud chcete provádět i budoucí předpovědi, stačí to odpovídajícím způsobem změnit v proměnné start a end na požadované indexy. Váš výstupní graf by měl vypadat takto:

Testované hodnoty vs. graf předpovědí

Jak vidíte, předpovědi se docela dobře shodují se skutečným trendem, i když je zde určité přijatelné zpoždění.

Kontrola metriky přesnosti

Abychom skutečně zjistili, jak dobrý nebo špatný je váš model, zjistíme pro něj střední kvadratickou chybu. Následující úryvek kódu to ukazuje:

Nejprve zkontrolujeme střední hodnotu souboru dat, která vyjde na 45. Poté se podíváme, jaká je průměrná hodnota. A kořenová střední kvadratická chyba pro tento konkrétní model by měla vyjít přibližně 2,3. Také byste měli dbát na to, aby vaše střední kvadratická chyba byla velmi menší než střední hodnota testovacího souboru. V tomto případě vidíme, že průměrná chyba bude zhruba 2,3/45 *100=5,1 % skutečné hodnoty.

Takže s tímto je váš model ARIMA připraven! V příštích blozích budu hovořit o různých modelech a o tom, jak můžete přesnost modelu dále zvýšit.

Pokud vás zajímá video vysvětlení téhož, zamiřte na můj kanál YouTube, kde najdete více takového obsahu! Odkaz na GitHub pro kód a sadu dat najdete zde: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Neváhejte se se mnou spojit také na LinkedIn!

.