Tidsserieprognoser med statsmodeller og profet

Tidsserieprognoser med statsmodeller og profet

Kilde node: 1996963
Tidsserieprognoser med statsmodeller og profet
Bilde av jcomp on Freepik
 

Tidsserier er et unikt datasett innen datavitenskap. Dataene registreres på tidsfrekvens (f.eks. daglig, ukentlig, månedlig, osv.), og hver observasjon er relatert til den andre. Tidsseriedataene er verdifulle når du vil analysere hva som skjer med dataene dine over tid og lage fremtidige spådommer. 

Tidsserieprognoser er en metode for å lage fremtidige spådommer basert på historiske tidsseriedata. Det finnes mange statistiske metoder for tidsserieprognoser, som f.eks ARIMA or Eksponensiell utjevning.

Tidsserieprognoser er ofte påtruffet i virksomheten, så det er fordelaktig for dataforskeren å vite hvordan man utvikler en tidsseriemodell. I denne artikkelen vil vi lære hvordan du kan forutsi tidsserier ved å bruke to populære prognoser Python-pakker; statsmodeller og profet. La oss komme inn i det.

De statsmodeller Python-pakken er en åpen kildekode-pakke som tilbyr ulike statistiske modeller, inkludert tidsserieprognosemodellen. La oss prøve ut pakken med et eksempeldatasett. Denne artikkelen vil bruke Digital valuta tidsserie data fra Kaggle (CC0: Public Domain). 

La oss rydde opp i dataene og ta en titt på datasettet vi har.

import pandas as pd df = pd.read_csv('dc.csv') df = df.rename(columns = {'Unnamed: 0' : 'Time'})
df['Time'] = pd.to_datetime(df['Time'])
df = df.iloc[::-1].set_index('Time') df.head()

 

Tidsserieprognoser med statsmodeller og profet
 

For eksempelet vårt, la oss si at vi ønsker å forutsi variabelen 'close_USD'. La oss se hvordan datamønsteret over tid.

import matplotlib.pyplot as plt plt.plot(df['close_USD'])
plt.show()

 

Tidsserieprognoser med statsmodeller og profet
 

La oss bygge prognosemodellen basert på dataene ovenfor. Før modellering, la oss dele dataene inn i tog- og testdata.

# Split the data
train = df.iloc[:-200] test = df.iloc[-200:]

 

Vi deler ikke dataene tilfeldig fordi det er tidsseriedata, og vi må bevare rekkefølgen. I stedet prøver vi å ha togdataene fra tidligere og testdataene fra de siste dataene.

La oss bruke statistikkmodeller for å lage en prognosemodell. De statsmodell gir mange tidsseriemodell-APIer, men vi vil bruke ARIMA-modellen som vårt eksempel.

from statsmodels.tsa.arima.model import ARIMA #sample parameters
model = ARIMA(train, order=(2, 1, 0)) results = model.fit() # Make predictions for the test set
forecast = results.forecast(steps=200)
forecast

 

Tidsserieprognoser med statsmodeller og profet
 

I vårt eksempel ovenfor bruker vi ARIMA-modellen fra statsmodeller som prognosemodell og prøver å forutsi de neste 200 dagene.

Er modellresultatet bra? La oss prøve å evaluere dem. Tidsseriemodellevalueringen bruker vanligvis en visualiseringsgraf for å sammenligne den faktiske og prediksjon med regresjonsmålinger som gjennomsnittlig absolutt feil (MAE), Root Mean Square Error (RMSE) og MAPE (Mean Absolute Percentage Error).

from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np #mean absolute error
mae = mean_absolute_error(test, forecast) #root mean square error
mse = mean_squared_error(test, forecast)
rmse = np.sqrt(mse) #mean absolute percentage error
mape = (forecast - test).abs().div(test).mean() print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAPE: {mape:.2f}%")

 

MAE: 7956.23 RMSE: 11705.11 MAPE: 0.35%

 

Poengsummen ovenfor ser bra ut, men la oss se hvordan det er når vi visualiserer dem.

plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(forecast.index, forecast, label='Forecast')
plt.legend()
plt.show()

 

Tidsserieprognoser med statsmodeller og profet
 

Som vi kan se, var prognosen dårligere ettersom modellen vår ikke kan forutsi den økende trenden. Modellen ARIMA som vi bruker virker for enkel for prognoser.

Kanskje det er bedre om vi prøver å bruke en annen modell utenfor statsmodeller. La oss prøve den berømte profetpakken fra Facebook.

Profeten er en modellpakke for tidsserieprognoser som fungerer best på data med sesongmessige effekter. Prophet ble også ansett som en robust prognosemodell fordi den kunne håndtere manglende data og uteliggere.

La oss prøve profetpakken. Først må vi installere pakken.

pip install prophet

 

Etter det må vi forberede datasettet vårt for opplæringen av prognosemodellen. Profeten har et spesifikt krav: Tidskolonnen må navngis som 'ds' og verdien som 'y'.

df_p = df.reset_index()[["Time", "close_USD"]].rename( columns={"Time": "ds", "close_USD": "y"}
)

 

Med dataene våre klare, la oss prøve å lage prognoseprediksjoner basert på dataene.

import pandas as pd
from prophet import Prophet model = Prophet() # Fit the model
model.fit(df_p) # create date to predict
future_dates = model.make_future_dataframe(periods=365) # Make predictions
predictions = model.predict(future_dates) predictions.head()

 

Tidsserieprognoser med statsmodeller og profet
 

Det som var bra med profeten var at hvert prognosedatapunkt var detaljert for oss brukere å forstå. Det er imidlertid vanskelig å forstå resultatet bare fra dataene. Så vi kan prøve å visualisere dem ved å bruke profeten.

model.plot(predictions)

 

Tidsserieprognoser med statsmodeller og profet
 

Prediksjonsplottfunksjonen fra modellen ville gi oss hvor sikre spådommene var. Fra plottet ovenfor kan vi se at spådommen har en oppadgående trend, men med økt usikkerhet jo lengre spådommene er.

Det er også mulig å undersøke prognosekomponentene med følgende funksjon.

model.plot_components(predictions)

 

Tidsserieprognoser med statsmodeller og profet
 

Som standard får vi datatrenden med årlig og ukentlig sesongvariasjon. Det er en god måte å forklare hva som skjer med dataene våre.

Ville det være mulig å evaluere profetmodellen også? Absolutt. Profeten inkluderer en diagnostisk måling som vi kan bruke: kryssvalidering av tidsserier. Metoden bruker en del av de historiske dataene og tilpasser modellen hver gang ved hjelp av data opp til cutoff-punktet. Så ville profeten sammenligne spådommene med de faktiske. La oss prøve å bruke koden.

from prophet.diagnostics import cross_validation, performance_metrics # Perform cross-validation with initial 365 days for the first training data and the cut-off for every 180 days. df_cv = cross_validation(model, initial='365 days', period='180 days', horizon = '365 days') # Calculate evaluation metrics
res = performance_metrics(df_cv) res

 

Tidsserieprognoser med statsmodeller og profet
 

I resultatet ovenfor hentet vi evalueringsresultatet fra det faktiske resultatet sammenlignet med prognosen i hver prognosedag. Det er også mulig å visualisere resultatet med følgende kode.

from prophet.plot import plot_cross_validation_metric
#choose between 'mse', 'rmse', 'mae', 'mape', 'coverage' plot_cross_validation_metric(df_cv, metric= 'mape')

 

Tidsserieprognoser med statsmodeller og profet
 

Hvis vi ser plottet ovenfor, kan vi se at prediksjonsfeilen varierer etter dagene, og den kan oppnå 50 % feil på noen punkter. På denne måten vil vi kanskje justere modellen ytterligere for å fikse feilen. Du kan sjekke dokumentasjon for videre utforskning.

Prognoser er en av de vanlige tilfellene som oppstår i virksomheten. En enkel måte å utvikle en prognosemodell på er å bruke statsforecast og Prophet Python-pakkene. I denne artikkelen lærer vi hvordan du lager en prognosemodell og evaluerer dem med statsforecast og Prophet.
 
 
Cornellius Yudha Wijaya er assistentleder for datavitenskap og dataskribent. Mens han jobber på heltid i Allianz Indonesia, elsker han å dele Python- og Data-tips via sosiale medier og skrivemedier.
 

Tidstempel:

Mer fra KDnuggets