Nachiketa Hebbar

Follow

18 sep, 2020 – 8 min read

Time Series forecasting is een van de meest gevraagde technieken van data science, of het nu in de aandelenhandel, het voorspellen van zakelijke verkoop of het weer voorspellen. Het is duidelijk een zeer handige vaardigheid om te hebben en ik ga je uitrusten met precies dat aan het einde van dit artikel.

In deze tutorial gaan we een ARIMA-model bouwen (maak je geen zorgen als je nog niet precies weet hoe dit werkt) om de toekomstige temperatuurwaarden van een bepaalde stad te voorspellen met behulp van python. GitHub link voor de code en data set vind je aan het eind van deze blog. Ik heb ook mijn YouTube video aan het einde bijgevoegd, voor het geval je geïnteresseerd bent in een video uitleg. Dus laten we zonder tijd te verspillen aan de slag gaan.

De eerste stap in elke tijdreeks is om je gegevens te lezen en te zien hoe ze eruit zien. De volgende code demonstreert hoe dat moet.

De code is vrij rechttoe rechtaan. We lezen de gegevens met pd.read_csv en schrijven parse_date=True, zodat pandas begrijpt dat het te maken heeft met datumwaarden en niet met string-waarden.

Daarna laten we alle ontbrekende waarden vallen en drukken we de vorm van de gegevens af. df.head() drukt de eerste 5 rijen van de dataset af. Dit is de uitvoer die u hiervoor zou moeten zien:

Plot uw gegevens

Het volgende is het plotten van uw gegevens. Dit geeft je een idee of de gegevens stationair zijn of niet. Voor degenen die niet weten wat stationariteit betekent, zal ik de essentie ervan geven. Hoewel ik verschillende video’s over dit onderwerp heb gemaakt, komt het hier op neer:

Alle tijdreeksgegevens die moeten worden gemodelleerd, moeten stationair zijn. Stationair betekent dat de statistische eigenschappen min of meer constant zijn in de tijd. Klinkt logisch, toch? Hoe moet je anders voorspellingen doen als de statistische eigenschappen variëren met de tijd? Dit zijn de volgende eigenschappen die elk stationair model zal hebben:

  1. Constant gemiddelde
  2. Constante variantie(Er kunnen variaties zijn, maar de variaties mogen niet onregelmatig zijn)
  3. Geen seizoensgebondenheid(Geen herhalende patronen in de dataset)

De eerste stap is dus om te controleren op stationariteit. Als uw gegevensverzameling niet stationair is, moet u ze omzetten in een stationaire reeks. Voordat je je hier allemaal zorgen over gaat maken, ontspan je! We hebben een vaste eenvoudige test om op stationariteit te controleren, de ADF (Augmented Dickey Fuller Test). Maar voordat we dat laten zien, laten we eerst de gegevens plotten.

Sinds ik alleen geïnteresseerd ben in het voorspellen van de gemiddelde temperatuur, is dat de enige kolom die ik zal plotten.

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

Checking For Stationarity

Right off the bat, we kunnen zien dat het lijkt te hebben iets van een constante gemiddelde rond 45. En de fluctuaties lijken ook min of meer gelijk te zijn. Maar om zeker te weten of de gegevens stationair zijn of niet, voeren we een vaste statistische test uit met de volgende code:

U krijgt de volgende uitvoer:

U hoeft zich geen zorgen te maken over alle ingewikkelde statistieken. Om de testresultaten te interpreteren, hoeft u alleen maar naar de p-waarde te kijken. En u gebruikt de volgende eenvoudige methode:

Als p< 0.05 ; Gegevens zijn stationair

Als p>0.05 ; Gegevens zijn niet stationair

Het is geen harde en snelle regel, maar een stationaire gegevens moet een kleine p-waarde hebben. Een grotere p-waarde kan ook wijzen op de aanwezigheid van bepaalde trends (variërend gemiddelde) of seizoensafhankelijkheid.

Beslis ten slotte over uw ARIMA-model

Nou, hoewel ik verschillende YouTube-video’s over dit onderwerp heb gemaakt, als u niet volledig begrijpt wat een ARIMA-model is, sta me toe om een eenvoudig overzicht te geven:

ARIMA bestaat uit 3 termen (Auto-Regressie + Geïntegreerd+Verplaatsend-gemiddelde)

  1. Auto-Regressie:

Dit betekent in feite dat je de vorige waarden van de tijdreeks gebruikt om de toekomst te voorspellen. Hoeveel waarden uit het verleden je gebruikt, bepaalt de volgorde van het AR-model. Zo ziet een AR(1)-model eruit:

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

Simpel genoeg, toch?

2. Geïntegreerd:

Dus, herinner je je ons gesprek over stationariteit, en hoe uiterst belangrijk dat is? Welnu, als uw gegevensverzameling niet stationair is, moet u meestal een soort verschiloperatie uitvoeren om ze stationair te maken. Als je een verschil maakt met de vorige waarde, is de volgorde 1, enzovoort. Hier is daar een voorbeeld van:

Vertrouw me voor mijn slechte tekening. Maar zoals u ziet is de reeks Y(t) niet stationair, omdat er een stijgende tendens is die resulteert in een variërend gemiddelde. We trekken het gewoon af van de vorige waarden en voila! Hij wordt stationair. Afhankelijk van uw gegevens moet u misschien de differentiëring herhalen om een tweede-ordeverschil te krijgen, een derde-ordeverschil enzovoort.

3. Voortschrijdend gemiddelde:

Dit betekent in feite dat u eerdere fouten gebruikt om de toekomstige voorspelling te maken. Is ook logisch, toch? Door te zien hoe fout u zat in uw voorspelling, houdt u daar rekening mee om een betere voorspelling te maken. En net als bij een AR-model bepaalt het aantal eerdere fouten (ook wel het aantal vertragingen genoemd) dat je gebruikt, de volgorde van het model.

Hier ziet de MA(1)-volgordevergelijking eruit:
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

Onze belangrijkste taak is dus de volgorde te bepalen van de AR-, I-, MA-onderdelen, die respectievelijk worden geschonken door(p,d,q).

En voordat je je zorgen gaat maken, laat me je vertellen dat alles automatisch zal gaan. pmdarima bibliotheek komt ons te hulp! Het doet het werk van het uitzoeken van de volgorde van de ARIMA helemaal zelf. Hier is hoe de code er uit ziet:

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

(Zorg ervoor dat je eerst de pmdarima bibliotheek installeert met pip install pmdarima)

De code spreekt voor zich. We leveren eenvoudig onze gegevens aan de auto_arima functie. De functie gebruikt in principe de AIC-score om te beoordelen hoe goed een bepaald ordermodel is. Er wordt gewoon geprobeerd de AIC-score te minimaliseren, en de uitvoer ziet er als volgt uit:

Modelprestaties voor verschillende combinaties van orders

We kunnen zien dat het beste ARIMA-model van de orde (1,0,5) lijkt te zijn met de minimale AIC-score=8294.785. Met deze kennis kunnen we eindelijk het model gaan trainen en fitten om voorspellingen te gaan doen!

Split Your Dataset

Voordat we het model daadwerkelijk trainen, moeten we de dataset splitsen in een training- en een testgedeelte. We doen dit omdat we eerst het model trainen op de gegevens en het testgedeelte verborgen houden voor het model. Zodra het model klaar is, vragen we het om voorspellingen te doen op de testgegevens en kijken we hoe goed het presteert.

Het volgende stukje code illustreert hoe dat moet:

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

Zoals u waarschijnlijk kunt zien, reserveren we de laatste 30 dagen van de gegevens als het testgedeelte.

Vorm van training- en testsectie

Eindelijk komen we bij het sappige spul!

Verrassend genoeg is het maken van het ARIMA-model eigenlijk een van de gemakkelijkste stappen als je alle vereiste stappen hebt gedaan. Het is zo eenvoudig als in de onderstaande codefragment:

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

Zoals u ziet roepen we eenvoudig de ARIMA-functie op, leveren onze dataset en vermelden de volgorde van het ARIMA-model dat we willen. U kunt de samenvatting van het model ook in uw uitvoer zien.

Modelsamenvatting

Hier kunt u een heleboel informatie over uw model zien. U zult ook de coëfficiënten van elke AR- en MA-term kunnen zien. Dit zijn niets anders dan de waarde van de variabelen die u in de vorige AR/MA-modelvergelijking hebt gezien en die als “Some_Constant” werden aangeduid. Over het algemeen betekent een grotere waarde van deze variabele dat hij een grotere invloed heeft op de output.

Check How Good Your Model Is

Hier komen onze testgegevens om de hoek kijken. We doen eerst een voorspelling voor de temperatuur op de testgegevens. Dan plotten we om te zien hoe onze voorspellingen zich verhouden tot de werkelijke gegevens.

Om daadwerkelijk voorspellingen te doen, moeten we de model.predict-functie gebruiken en het de begin- en eindindex vertellen waarin we de voorspellingen willen doen.

Omdat we willen beginnen met het doen van voorspellingen waar de trainingsgegevens eindigen, is dat wat ik in de startvariabele heb geschreven. We willen stoppen met het maken van voorspellingen wanneer de dataset eindigt, wat de eindvariabele verklaart. Als je ook toekomstige voorspellingen wilt maken, kun je dat in de start- en eindvariabele gewoon veranderen in de indexen die je wilt. Uw uitvoerplot zou er als volgt moeten uitzien:

Testwaarden vs Voorspellingen Plot

Zoals u ziet komen de voorspellingen vrij goed overeen met de werkelijke trend, al is er een zekere aanvaardbare vertraging.

Check your Accuracy Metric

Om te bepalen hoe goed of slecht uw model is, berekenen we de gemiddelde kwadratische fout van het model. Het volgende stukje code laat dat zien:

Eerst controleren we de gemiddelde waarde van de gegevensverzameling, die 45 blijkt te zijn. En de gemiddelde fout in het kwadraat voor dit model zou ongeveer 2,3 moeten zijn. Wat u ook in het oog moet houden, is dat het kwadratisch gemiddelde veel kleiner moet zijn dan de gemiddelde waarde van de testreeks. In dit geval zien we dat de gemiddelde fout ruwweg 2.3/45 *100=5.1% van de werkelijke waarde zal zijn.

Dus daarmee is uw ARIMA model klaar voor gebruik! In toekomstige blogs ga ik het hebben over verschillende modellen en hoe je de nauwkeurigheid van het model verder kunt verhogen.

Als je geïnteresseerd bent in de video-uitleg van hetzelfde, ga dan naar mijn YouTube-kanaal voor meer van dergelijke inhoud! De GitHub-link voor de code en de dataset vindt u hier: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Voel je vrij om ook op LinkedIn contact met me op te nemen!