Tidsserieprognoser med statistikmodeller och profet

Tidsserieprognoser med statistikmodeller och profet

Källnod: 1996963
Tidsserieprognoser med statistikmodeller och profet
Bild av jcomp on Freepik
 

Tidsserier är ett unikt dataset inom datavetenskapsområdet. Uppgifterna registreras på tidsfrekvens (t.ex. dagligen, veckovis, månadsvis, etc.), och varje observation är relaterad till den andra. Tidsseriedata är värdefull när du vill analysera vad som händer med din data över tid och skapa framtida förutsägelser. 

Tidsserieprognoser är en metod för att skapa framtida förutsägelser baserat på historiska tidsseriedata. Det finns många statistiska metoder för tidsserieprognoser, som t.ex ARIMA or Exponentiell utjämning.

Tidsserieprognoser påträffas ofta i verksamheten, så det är fördelaktigt för dataforskaren att veta hur man utvecklar en tidsseriemodell. I den här artikeln kommer vi att lära oss hur man prognostiserar tidsserier med hjälp av två populära prognoser Python-paket; statsmodels och Prophet. Låt oss gå in i det.

Smakämnen statistikmodeller Python-paketet är ett paket med öppen källkod som erbjuder olika statistiska modeller, inklusive tidsserieprognosmodellen. Låt oss prova paketet med en exempeldatauppsättning. Den här artikeln kommer att använda Digital valuta tidsserie data från Kaggle (CC0: Public Domain). 

Låt oss rensa upp data och ta en titt på datamängden som 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 statistikmodeller och profet
 

För vårt exempel, låt oss säga att vi vill prognostisera variabeln 'close_USD'. Låt oss se hur datamönstret över tiden.

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

 

Tidsserieprognoser med statistikmodeller och profet
 

Låt oss bygga prognosmodellen utifrån våra ovanstående data. Innan vi modellerar, låt oss dela upp data i tåg- och testdata.

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

 

Vi delar inte upp data slumpmässigt eftersom det är tidsseriedata, och vi måste bevara ordningen. Istället försöker vi ha tågdata från tidigare och testdata från senaste data.

Låt oss använda statistikmodeller för att skapa en prognosmodell. De statsmodell tillhandahåller många tidsseriemodeller API:er, men vi skulle använda ARIMA-modellen som vårt exempel.

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 statistikmodeller och profet
 

I vårt exempel ovan använder vi ARIMA-modellen från statsmodeller som prognosmodell och försöker förutsäga de kommande 200 dagarna.

Är modellresultatet bra? Låt oss försöka utvärdera dem. Utvärderingen av tidsseriemodeller använder vanligtvis en visualiseringsgraf för att jämföra den faktiska och förutsägelse med regressionsmått som Mean Absolute Error (MAE), Root Mean Square Error (RMSE) och 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%

 

Poängen ovan ser bra ut, men låt oss se hur det är när vi visualiserar 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 statistikmodeller och profet
 

Som vi kan se var prognosen sämre eftersom vår modell inte kan förutse den ökande trenden. Modellen ARIMA som vi använder verkar för enkel för prognoser.

Kanske är det bättre om vi försöker använda en annan modell utanför statsmodeller. Låt oss prova det berömda profetpaketet från Facebook.

Profet är ett modellpaket för tidsserieprognos som fungerar bäst på data med säsongseffekter. Prophet ansågs också vara en robust prognosmodell eftersom den kunde hantera saknade data och extremvärden.

Låt oss prova profetpaketet. Först måste vi installera paketet.

pip install prophet

 

Efter det måste vi förbereda vår datauppsättning för prognosmodellutbildningen. Profeten har ett specifikt krav: tidskolumnen måste namnges som 'ds' och värdet som 'y'.

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

 

Med vår data redo, låt oss försöka skapa prognos förutsägelse baserat på data.

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 statistikmodeller och profet
 

Det som var bra med profeten var att varje prognosdatapunkt var detaljerad för oss användare att förstå. Det är dock svårt att förstå resultatet bara utifrån data. Så vi kunde försöka visualisera dem med hjälp av Profeten.

model.plot(predictions)

 

Tidsserieprognoser med statistikmodeller och profet
 

Förutsägelseplottfunktionen från modellen skulle ge oss hur säkra förutsägelserna var. Från ovanstående plot kan vi se att förutsägelsen har en uppåtgående trend men med ökad osäkerhet ju längre förutsägelserna är.

Det är också möjligt att undersöka prognoskomponenterna med följande funktion.

model.plot_components(predictions)

 

Tidsserieprognoser med statistikmodeller och profet
 

Som standard skulle vi få datatrenden med årliga och veckovisa säsongsvariationer. Det är ett bra sätt att förklara vad som händer med vår data.

Skulle det vara möjligt att utvärdera profetmodellen också? Absolut. Profeten inkluderar en diagnostisk mätning som vi kan använda: korsvalidering av tidsserier. Metoden använder en del av den historiska datan och passar modellen varje gång med hjälp av data fram till cutoff-punkten. Sedan skulle profeten jämföra förutsägelserna med de verkliga. Låt oss försöka använda 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 statistikmodeller och profet
 

I resultatet ovan hämtade vi utvärderingsresultatet från det faktiska resultatet jämfört med prognosen för varje prognosdag. Det är också möjligt att visualisera resultatet med följande kod.

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 statistikmodeller och profet
 

Om vi ​​ser handlingen ovan kan vi se att förutsägelsefelet varierade efter dagarna, och det kunde uppnå 50 % fel vid vissa tillfällen. På så sätt kanske vi vill finjustera modellen ytterligare för att åtgärda felet. Du kan kontrollera dokumentation för vidare utforskning.

Prognoser är ett av de vanligaste fallen som förekommer i verksamheten. Ett enkelt sätt att utveckla en prognosmodell är att använda statsforecast och Prophet Python-paketen. I den här artikeln lär vi oss hur man skapar en prognosmodell och utvärderar dem med statsforecast och Prophet.
 
 
Cornellius Yudha Wijaya är biträdande chef för datavetenskap och dataskribent. Medan han arbetar heltid på Allianz Indonesia älskar han att dela Python- och Data-tips via sociala medier och skrivande media.
 

Tidsstämpel:

Mer från KDnuggets