Πρόβλεψη χρονοσειρών με statsmodels και Prophet

Πρόβλεψη χρονοσειρών με statsmodels και Prophet

Κόμβος πηγής: 1996963
Πρόβλεψη χρονοσειρών με statsmodels και Prophet
Εικόνα από jcomp on Freepik
 

Οι χρονοσειρές είναι ένα μοναδικό σύνολο δεδομένων στον τομέα της επιστήμης δεδομένων. Τα δεδομένα καταγράφονται σε χρονική συχνότητα (π.χ. ημερήσια, εβδομαδιαία, μηνιαία κ.λπ.), και κάθε παρατήρηση σχετίζεται με την άλλη. Τα δεδομένα χρονοσειρών είναι πολύτιμα όταν θέλετε να αναλύσετε τι συμβαίνει με τα δεδομένα σας με την πάροδο του χρόνου και να δημιουργήσετε μελλοντικές προβλέψεις. 

Η πρόβλεψη χρονοσειρών είναι μια μέθοδος για τη δημιουργία μελλοντικών προβλέψεων με βάση δεδομένα ιστορικών χρονοσειρών. Υπάρχουν πολλές στατιστικές μέθοδοι για την πρόβλεψη χρονοσειρών, όπως π.χ ΑΡΙΜΑ or Εκθετική εξομάλυνση.

Η πρόβλεψη χρονοσειρών συναντάται συχνά στην επιχείρηση, επομένως είναι ωφέλιμο για τον επιστήμονα δεδομένων να γνωρίζει πώς να αναπτύξει ένα μοντέλο χρονοσειρών. Σε αυτό το άρθρο, θα μάθουμε πώς να προβλέπουμε χρονοσειρές χρησιμοποιώντας δύο δημοφιλή πακέτα Python προβλέψεων. statsmodels και Προφήτης. Ας μπούμε σε αυτό.

Η στατιστικά μοντέλα Το πακέτο Python είναι ένα πακέτο ανοιχτού κώδικα που προσφέρει διάφορα στατιστικά μοντέλα, συμπεριλαμβανομένου του μοντέλου πρόβλεψης χρονοσειρών. Ας δοκιμάσουμε το πακέτο με ένα παράδειγμα δεδομένων. Αυτό το άρθρο θα χρησιμοποιήσει το Χρονική σειρά ψηφιακού νομίσματος δεδομένα από το Kaggle (CC0: Public Domain). 

Ας καθαρίσουμε τα δεδομένα και ας ρίξουμε μια ματιά στο σύνολο δεδομένων που έχουμε.

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()

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Για το παράδειγμά μας, ας υποθέσουμε ότι θέλουμε να προβλέψουμε τη μεταβλητή 'close_USD'. Ας δούμε πώς το μοτίβο δεδομένων με την πάροδο του χρόνου.

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

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Ας δημιουργήσουμε το μοντέλο πρόβλεψης με βάση τα παραπάνω δεδομένα μας. Πριν από τη μοντελοποίηση, ας χωρίσουμε τα δεδομένα σε δεδομένα αμαξοστοιχίας και δοκιμής.

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

 

Δεν διαχωρίζουμε τα δεδομένα τυχαία επειδή είναι δεδομένα χρονοσειρών και πρέπει να διατηρήσουμε τη σειρά. Αντίθετα, προσπαθούμε να έχουμε τα δεδομένα του τρένου από παλαιότερα και τα δεδομένα δοκιμών από τα πιο πρόσφατα δεδομένα.

Ας χρησιμοποιήσουμε statsmodels για να δημιουργήσουμε ένα μοντέλο πρόβλεψης. ο στατιστικό μοντέλο παρέχει πολλά API μοντέλων χρονοσειρών, αλλά θα χρησιμοποιούσαμε το μοντέλο ARIMA ως παράδειγμά μας.

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

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Στο παραπάνω παράδειγμά μας, χρησιμοποιούμε το μοντέλο ARIMA από τα statsmodels ως μοντέλο πρόβλεψης και προσπαθούμε να προβλέψουμε τις επόμενες 200 ημέρες.

Είναι καλό το αποτέλεσμα του μοντέλου; Ας προσπαθήσουμε να τα αξιολογήσουμε. Η αξιολόγηση του μοντέλου χρονοσειρών χρησιμοποιεί συνήθως ένα γράφημα οπτικοποίησης για να συγκρίνει την πραγματική και την πρόβλεψη με μετρήσεις παλινδρόμησης, όπως το μέσο απόλυτο σφάλμα (MAE), το ριζικό μέσο τετραγωνικό σφάλμα (RMSE) και το MAPE (Μέσο απόλυτο ποσοστό σφάλματος).

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%

 

Η παραπάνω βαθμολογία φαίνεται ωραία, αλλά ας δούμε πώς είναι όταν τα οπτικοποιούμε.

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()

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Όπως μπορούμε να δούμε, η πρόβλεψη ήταν χειρότερη καθώς το μοντέλο μας δεν μπορεί να προβλέψει την αυξητική τάση. Το μοντέλο ARIMA που χρησιμοποιούμε φαίνεται πολύ απλό για πρόβλεψη.

Ίσως είναι καλύτερα αν δοκιμάσουμε να χρησιμοποιήσουμε ένα άλλο μοντέλο εκτός των statsmodels. Ας δοκιμάσουμε το διάσημο πακέτο προφητών από το Facebook.

Προφήτης είναι ένα πακέτο μοντέλων πρόβλεψης χρονοσειρών που λειτουργεί καλύτερα σε δεδομένα με εποχιακά εφέ. Το Prophet θεωρήθηκε επίσης ένα ισχυρό μοντέλο πρόβλεψης επειδή μπορούσε να χειριστεί δεδομένα που λείπουν και ακραίες τιμές.

Ας δοκιμάσουμε το πακέτο Προφήτης. Πρώτα, πρέπει να εγκαταστήσουμε το πακέτο.

pip install prophet

 

Μετά από αυτό, πρέπει να προετοιμάσουμε το σύνολο δεδομένων μας για την εκπαίδευση του μοντέλου πρόβλεψης. Ο Προφήτης έχει μια συγκεκριμένη απαίτηση: η στήλη χρόνου πρέπει να ονομαστεί ως 'ds' και η τιμή ως 'y'.

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

 

Έχοντας τα δεδομένα μας έτοιμα, ας προσπαθήσουμε να δημιουργήσουμε πρόβλεψη πρόβλεψης με βάση τα δεδομένα.

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()

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Αυτό που ήταν υπέροχο με τον Προφήτη ήταν ότι κάθε σημείο δεδομένων πρόβλεψης ήταν λεπτομερές για να κατανοήσουμε εμείς οι χρήστες. Ωστόσο, είναι δύσκολο να κατανοήσουμε το αποτέλεσμα μόνο από τα δεδομένα. Έτσι, θα μπορούσαμε να προσπαθήσουμε να τους οπτικοποιήσουμε χρησιμοποιώντας τον Προφήτη.

model.plot(predictions)

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Η συνάρτηση γραφικής παράστασης προβλέψεων από το μοντέλο θα μας έδινε πόσο σίγουρες ήταν οι προβλέψεις. Από την παραπάνω γραφική παράσταση, μπορούμε να δούμε ότι η πρόβλεψη έχει ανοδική τάση αλλά με αυξημένη αβεβαιότητα τόσο μεγαλύτερες είναι οι προβλέψεις.

Είναι επίσης δυνατό να εξεταστούν τα στοιχεία πρόβλεψης με την ακόλουθη συνάρτηση.

model.plot_components(predictions)

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Από προεπιλογή, θα λαμβάναμε την τάση δεδομένων με ετήσια και εβδομαδιαία εποχικότητα. Είναι ένας καλός τρόπος να εξηγήσουμε τι συμβαίνει με τα δεδομένα μας.

Θα ήταν δυνατόν να αξιολογηθεί και το μοντέλο του Προφήτη; Απολύτως. Ο Προφήτης περιλαμβάνει μια διαγνωστική μέτρηση που μπορούμε να χρησιμοποιήσουμε: διασταυρούμενη επικύρωση χρονοσειρών. Η μέθοδος χρησιμοποιεί μέρος των ιστορικών δεδομένων και ταιριάζει στο μοντέλο κάθε φορά χρησιμοποιώντας δεδομένα μέχρι το σημείο αποκοπής. Τότε ο Προφήτης θα συνέκρινε τις προβλέψεις με τις πραγματικές. Ας δοκιμάσουμε να χρησιμοποιήσουμε τον κώδικα.

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

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Στο παραπάνω αποτέλεσμα, αποκτήσαμε το αποτέλεσμα αξιολόγησης από το πραγματικό αποτέλεσμα σε σύγκριση με την πρόβλεψη κάθε ημέρας πρόβλεψης. Είναι επίσης δυνατό να οπτικοποιήσετε το αποτέλεσμα με τον ακόλουθο κώδικα.

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

 

Πρόβλεψη χρονοσειρών με statsmodels και Prophet
 

Αν δούμε την παραπάνω γραφική παράσταση, μπορούμε να δούμε ότι το σφάλμα πρόβλεψης διέφερε μετά τις ημέρες και θα μπορούσε να επιτύχει σφάλμα 50% σε ορισμένα σημεία. Με αυτόν τον τρόπο, ίσως θέλουμε να τροποποιήσουμε περαιτέρω το μοντέλο για να διορθώσουμε το σφάλμα. Μπορείτε να ελέγξετε το τεκμηρίωση για περαιτέρω εξερεύνηση.

Η πρόβλεψη είναι μια από τις συχνές περιπτώσεις που συμβαίνουν στην επιχείρηση. Ένας εύκολος τρόπος για να αναπτύξετε ένα μοντέλο πρόβλεψης είναι να χρησιμοποιήσετε τα πακέτα statsforecast και Prophet Python. Σε αυτό το άρθρο, μαθαίνουμε πώς να δημιουργήσουμε ένα μοντέλο πρόβλεψης και να το αξιολογήσουμε με το statsforecast και το Prophet.
 
 
Cornellius Yudha Wijaya είναι βοηθός διευθυντής επιστήμης δεδομένων και συγγραφέας δεδομένων. Ενώ εργάζεται με πλήρη απασχόληση στην Allianz Indonesia, του αρέσει να μοιράζεται συμβουλές για Python και Data μέσω των μέσων κοινωνικής δικτύωσης και των μέσων συγγραφής.
 

Σφραγίδα ώρας:

Περισσότερα από KDnuggets