Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min read

Az idősoros előrejelzés az adattudomány egyik legkeresettebb technikája, legyen szó akár a tőzsdei kereskedésről, az üzleti eladások előrejelzéséről vagy az időjárás-előrejelzésről. Egyértelműen nagyon hasznos készség, és ennek a cikknek a végére éppen ezzel fogom felvértezni Önt.

Ezzel a bemutatóval egy ARIMA modellt fogunk létrehozni (ne aggódjon, ha még nem tudja pontosan, hogyan működik ez) egy adott város jövőbeli hőmérsékleti értékeinek előrejelzésére python segítségével. A kód és az adatkészlet GitHub linkje a blog végén található. A végén csatoltam a YouTube-videómat is, ha esetleg érdekel egy videós magyarázat. Tehát időt nem vesztegetve kezdjük el.

Az első lépés minden idősor esetében az, hogy beolvassuk az adatainkat, és megnézzük, hogyan néznek ki. Az alábbi kódrészlet bemutatja, hogyan kell ezt megtenni.

A kód elég egyszerű. Beolvassuk az adatokat a pd.read_csv segítségével, és a parse_date=True beírásával biztosítjuk, hogy a pandas megértse, hogy dátumértékekkel és nem string értékekkel van dolga.

A következő lépésben elhagyjuk a hiányzó értékeket, és kiírjuk az adatok alakját. df.head() kiírja az adathalmaz első 5 sorát. Íme az erre vonatkozó kimenet:

Az adatok kirajzolása

A következő lépés az adatok kirajzolása. Ezáltal képet kapsz arról, hogy az adatok stacionáriusak-e vagy sem. Azoknak, akik nem tudják, mit jelent a stacionaritás, hadd adjam meg a lényegét. Bár több videót is készítettem erről a témáról, az egész a következőkre fut ki:

Minden idősoros adatnak, amelyet modellezni kell, stacionáriusnak kell lennie. A stacionárius azt jelenti, hogy a statisztikai tulajdonságai többé-kevésbé állandóak az idővel. Van értelme, ugye? Hogyan másképp kellene előrejelzéseket készíteni, ha a statisztikai tulajdonságok az idővel változnak? A következő tulajdonságokkal kell rendelkeznie minden stacionárius modellnek:

  1. állandó átlag
  2. állandó variancia(Lehetnek eltérések, de az eltérések nem lehetnek szabálytalanok)
  3. Nincs szezonalitás(Nincsenek ismétlődő minták az adathalmazban)

Az első lépés tehát a stacionaritás ellenőrzése. Ha az adathalmazod nem stacionárius, akkor stacionárius sorozattá kell konvertálnod. Mielőtt elkezdenél aggódni mindezek miatt, nyugodj meg! Van egy fix egyszerű tesztünk a stacionaritás ellenőrzésére, az úgynevezett ADF(Augmented Dickey Fuller Test). De mielőtt ezt megmutatnánk, először ábrázoljuk az adatokat.

Mivel csak az átlaghőmérséklet előrejelzése érdekel, csak ezt az oszlopot fogom ábrázolni.

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

Sztacionaritás ellenőrzése

Rögtön az elején láthatjuk, hogy úgy tűnik, hogy a 45 körüli átlag kissé állandó. És az ingadozások is többé-kevésbé azonosnak tűnnek. Ahhoz azonban, hogy megbizonyosodjunk arról, hogy az adatok stacionáriusak-e vagy sem, a következő kód segítségével lefuttatunk egy rögzített statisztikai tesztet:

A kimenetet a következőképpen kapjuk:

Nem kell aggódnunk az összes bonyolult statisztika miatt. A teszteredmények értelmezéséhez csak a p-értéket kell megnézned. És a következő egyszerű módszert használja:

Ha p< 0,05 ; Az adat stacionárius

ha p>0,05; Az adat nem stacionárius

Ez nem egy kemény és gyors szabály, de egy stacionárius adatnak kis p-értékkel kell rendelkeznie. Nagyobb p-érték bizonyos trendek(változó átlag) vagy szezonalitás jelenlétére is utalhat.

Végül, döntse el az ARIMA modelljét

Most, bár több YouTube videót is készítettem ebben a témában, ha nem érti teljesen, mi az ARIMA modell, engedje meg, hogy bemutassak egy egyszerű áttekintést:

Az ARIMA 3 kifejezésből áll(Auto-Regression + Integrated+Moving-Average)

  1. Auto-Regression:

Ez alapvetően azt jelenti, hogy az idősor korábbi értékeit használod a jövő előrejelzéséhez. Az, hogy hány múltbeli értéket használsz, meghatározza az AR-modell sorrendjét. Így néz ki egy AR(1) modell:

Y(t)= Valamilyen_állandó*Y(t-1)+ Másik_állandó +Hiba(t)

Egyszerű, igaz?

2. Integrált:

Emlékszel a stacionaritásról szóló előadásunkra, és hogy ez rendkívül fontos? Nos, ha az adathalmazod nem stacionárius, akkor legtöbbször valamilyen differencia műveletet kell végrehajtanod, hogy stacionáriussá tedd. Ha az előző értékkel differenciálsz, akkor annak rendje 1 és így tovább. Íme egy példa erre:

Bocsánat a rossz rajzomért. De mint láthatod az Y(t) sorozat nem volt stacionárius, mert a növekvő trend változó átlagot eredményezett. Egyszerűen kivonjuk a korábbi értékekből és voilá! Állandóvá válik. Az adatoktól függően lehet, hogy meg kell ismételni a differenciálást, hogy egy másodrendű differenciálást , harmadrendű és így tovább..

3. Mozgóátlag:

Ez alapvetően azt jelenti, hogy a korábbi hibákat használjuk a jövőbeli előrejelzéshez. Ennek is van értelme, ugye? Látva, hogy mennyire tévedtél az előrejelzésedben, ezt figyelembe veszed, hogy jobb előrejelzést készíts. És akárcsak egy AR modellben, a korábbi hibák száma (más néven a késleltetések száma), amit használsz, meghatározza a modell sorrendjét.

Íme, így néz ki az MA(1) sorrendi egyenlet:
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

A fő feladatunk tehát az AR, I, MA részek sorrendjének eldöntése, amelyeket a(p,d,q) adományoz.

És mielőtt elkezdenénk aggódni, hadd mondjam el, hogy minden automatikusan fog történni. pmdarima könyvtár jön a segítségünkre! Az ARIMA sorrendjének kitalálását teljesen magától elvégzi. Így néz ki a kódrészlet:

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

(Ügyeljen arra, hogy először telepítse a pmdarima könyvtárat a pip install pmdarima segítségével)

A kód eléggé magától értetődő. Egyszerűen megadjuk az adatainkat az auto_arima függvénynek. A függvény alapvetően egy úgynevezett AIC pontszámot használ annak megítélésére, hogy mennyire jó egy adott sorrendmodell. Egyszerűen megpróbálja minimalizálni az AIC pontszámot, és így néz ki a kimenet:

Modell teljesítménye a különböző sorrendkombinációkhoz

Láthatjuk, hogy a legjobb ARIMA modellnek a (1,0,5) sorrend tűnik, a minimális AIC score=8294.785. Ezzel a tudással végre folytathatjuk a modell betanítását és illesztését, hogy elkezdhessük az előrejelzést!

Az adathalmaz felosztása

Mielőtt ténylegesen betanítanánk a modellt, fel kell osztanunk az adathalmazt egy képzési és egy tesztelési szakaszra. Ezt azért tesszük, mert először a modellt képezzük ki az adatokon, és a tesztelési részt rejtve tartjuk a modell elől. Miután a modell elkészült, megkérjük, hogy készítsen előrejelzéseket a tesztadatokon, és megnézzük, milyen jól teljesít.

A következő kódrészlet szemlélteti, hogyan kell ezt megtenni:

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

Amint valószínűleg láthatja, az adatok utolsó 30 napját tartjuk fenn tesztelési szakasznak. A kimeneten láthatja az aktuális adatok, valamint a tesztelési és a képzési szakasz alakját.

A képzési és a tesztelési szakasz alakja

Végre elérkezünk a szaftos dolgokhoz!

Meglepő módon az ARIMA-modell létrehozása valójában az egyik legegyszerűbb lépés, ha már minden előfeltételes lépést megtettünk. Ez olyan egyszerű, mint az alábbi kódrészletben látható:

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

Amint látható, egyszerűen meghívjuk az ARIMA függvényt, megadjuk neki az adathalmazunkat, és megemlítjük a kívánt ARIMA-modell sorrendjét. A kimenetben láthatjuk a modell összefoglalóját is.

Modell összefoglaló

A modellről egy csomó információt láthatunk itt. Emellett láthatja az egyes AR és MA kifejezések együtthatóit is. Ezek nem mások, mint azoknak a változóknak az értékei, amelyeket az előző AR/MA modellegyenletben láttál, és amelyek “Some_Constant” feliratúak voltak. Általában ennek a változónak a nagyobb nagysága azt jelenti, hogy nagyobb hatással van a kimenetre.

Check How Good Your Model Is

Itt jönnek be a tesztadataink. Először a hőmérsékletre készítünk előrejelzést a tesztadatokon. Ezután kirajzoljuk, hogy lássuk, hogyan viszonyulnak a jóslataink a tényleges adatokhoz.

Az előrejelzések tényleges elkészítéséhez a model.predict függvényt kell használnunk, és meg kell mondanunk neki a kezdő és a végindexet, amelyben a jóslatokat el akarjuk készíteni.

Mivel a jóslatok készítését ott akarjuk kezdeni, ahol a képzési adatok véget érnek , ezt írtam a start változóba. A jóslatok készítését akkor akarjuk abbahagyni, amikor az adathalmaz véget ér, ez magyarázza az end változót. Ha jövőbeli előrejelzéseket is szeretne készíteni, akkor csak ennek megfelelően módosíthatja a start és end változóban a kívánt indexeket. A kimeneti ábrának így kell kinéznie:

Tesztértékek vs. előrejelzések ábrája

Amint látható, az előrejelzések elég jól illeszkednek a tényleges trendhez, bár van egy bizonyos elfogadható késés.

Check your Accuracy Metric

Hogy ténylegesen megállapíthassuk, mennyire jó vagy rossz a modellünk, megkeressük a modell átlagos négyzetes hibagyökerét. Az alábbi kódrészlet ezt mutatja:

Először is ellenőrizzük az adathalmaz átlagértékét, ami 45-nek jön ki. Az adott modell átlagos négyzetes hiba négyzetgyöke pedig 2,3 körül kell, hogy legyen. Arra is ügyelnie kell, hogy a négyzetes középértékének nagyon kisebbnek kell lennie, mint a tesztkészlet átlagértéke. Ebben az esetben láthatjuk, hogy az átlagos hiba nagyjából 2,3/45 *100=5,1%-a lesz a tényleges értéknek.

Szóval ezzel az ARIMA modell készen áll! A jövőbeni blogokban a különböző modellekről fogok beszélni, és arról, hogyan lehet tovább növelni a modell pontosságát.

Ha érdekel a videós magyarázat ugyanerről, látogass el a YouTube csatornámra további ilyen tartalmakért! A kód és az adathalmaz GitHub linkjét itt találod: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Ne habozzon kapcsolatba lépni velem a LinkedIn-en is!