Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri

Nút nguồn: 1996963
Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
Hình ảnh của jcomp on Freepik
 

Chuỗi thời gian là một tập dữ liệu duy nhất trong lĩnh vực khoa học dữ liệu. Dữ liệu được ghi lại theo tần suất thời gian (ví dụ: hàng ngày, hàng tuần, hàng tháng, v.v.) và mỗi quan sát có liên quan đến nhau. Dữ liệu chuỗi thời gian có giá trị khi bạn muốn phân tích những gì xảy ra với dữ liệu của mình theo thời gian và tạo dự đoán trong tương lai. 

Dự báo chuỗi thời gian là một phương pháp để tạo dự đoán trong tương lai dựa trên dữ liệu chuỗi thời gian lịch sử. Có nhiều phương pháp thống kê để dự báo chuỗi thời gian, chẳng hạn như ARIMA or Làm mịn theo cấp số nhân.

Dự báo chuỗi thời gian thường gặp trong doanh nghiệp, vì vậy sẽ rất có lợi cho nhà khoa học dữ liệu khi biết cách phát triển mô hình chuỗi thời gian. Trong bài viết này, chúng ta sẽ tìm hiểu cách dự báo chuỗi thời gian bằng cách sử dụng hai gói Python dự báo phổ biến; mô hình thống kê và nhà tiên tri. Hãy đi vào nó.

Sản phẩm số liệu thống kê Gói Python là một gói nguồn mở cung cấp nhiều mô hình thống kê khác nhau, bao gồm cả mô hình dự báo chuỗi thời gian. Hãy thử gói với tập dữ liệu mẫu. Bài viết này sẽ sử dụng Chuỗi thời gian tiền tệ kỹ thuật số dữ liệu từ Kaggle (CC0: Miền công cộng). 

Hãy dọn dẹp dữ liệu và xem tập dữ liệu mà chúng ta có.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Ví dụ của chúng ta, giả sử chúng ta muốn dự đoán biến 'close_USD'. Hãy xem mô hình dữ liệu theo thời gian như thế nào.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Hãy xây dựng mô hình dự báo dựa trên dữ liệu trên của chúng tôi. Trước khi lập mô hình, hãy chia dữ liệu thành dữ liệu huấn luyện và thử nghiệm.

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

 

Chúng tôi không phân chia dữ liệu một cách ngẫu nhiên vì đó là dữ liệu chuỗi thời gian và chúng tôi cần duy trì thứ tự. Thay vào đó, chúng tôi cố gắng có dữ liệu đào tạo từ trước đó và dữ liệu thử nghiệm từ dữ liệu mới nhất.

Hãy sử dụng mô hình thống kê để tạo mô hình dự báo. Các mô hình thống kê cung cấp nhiều API mô hình chuỗi thời gian, nhưng chúng tôi sẽ sử dụng mô hình ARIMA làm ví dụ.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Trong ví dụ ở trên, chúng tôi sử dụng mô hình ARIMA từ mô hình thống kê làm mô hình dự báo và cố gắng dự đoán 200 ngày tới.

Kết quả mô hình có tốt không? Hãy thử đánh giá chúng. Đánh giá mô hình chuỗi thời gian thường sử dụng biểu đồ trực quan để so sánh thực tế và dự đoán với các số liệu hồi quy, chẳng hạn như Lỗi tuyệt đối trung bình (MAE), Lỗi bình phương trung bình gốc (RMSE) và MAPE (Lỗi tỷ lệ phần trăm tuyệt đối trung bình).

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%

 

Điểm số ở trên có vẻ ổn, nhưng hãy xem nó như thế nào khi chúng ta hình dung chúng.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Như chúng ta có thể thấy, dự báo còn tồi tệ hơn vì mô hình của chúng ta không thể dự báo xu hướng tăng. Mô hình ARIMA mà chúng tôi sử dụng dường như quá đơn giản để dự báo.

Có lẽ sẽ tốt hơn nếu chúng ta thử sử dụng một mô hình khác ngoài mô hình thống kê. Hãy thử gói tiên tri nổi tiếng từ Facebook.

Tiên tri là gói mô hình dự báo chuỗi thời gian hoạt động tốt nhất trên dữ liệu có hiệu ứng theo mùa. Tiên tri cũng được coi là một mô hình dự báo mạnh mẽ vì nó có thể xử lý dữ liệu bị thiếu và các giá trị ngoại lai.

Hãy thử gói Tiên tri. Trước tiên, chúng ta cần cài đặt gói.

pip install prophet

 

Sau đó, chúng tôi phải chuẩn bị tập dữ liệu của mình để đào tạo mô hình dự báo. Nhà tiên tri có một yêu cầu cụ thể: cột thời gian cần được đặt tên là 'ds' và giá trị là 'y'.

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

 

Với dữ liệu của chúng tôi đã sẵn sàng, hãy thử tạo dự báo dựa trên dữ liệu.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Điều tuyệt vời về Nhà tiên tri là mọi điểm dữ liệu dự báo đều được trình bày chi tiết để người dùng chúng tôi hiểu được. Tuy nhiên, thật khó để hiểu kết quả chỉ từ dữ liệu. Vì vậy, chúng ta có thể cố gắng hình dung chúng bằng Tiên tri.

model.plot(predictions)

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Hàm biểu đồ dự đoán từ mô hình sẽ cung cấp cho chúng ta mức độ tin cậy của các dự đoán. Từ biểu đồ trên, chúng ta có thể thấy rằng dự đoán có xu hướng tăng nhưng với sự không chắc chắn càng tăng thì dự đoán càng dài.

Cũng có thể kiểm tra các thành phần dự báo với chức năng sau.

model.plot_components(predictions)

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Theo mặc định, chúng tôi sẽ thu được xu hướng dữ liệu theo mùa hàng năm và hàng tuần. Đó là một cách hay để giải thích điều gì xảy ra với dữ liệu của chúng tôi.

Có thể đánh giá cả mô hình Tiên tri không? Tuyệt đối. Tiên tri bao gồm một phép đo chẩn đoán mà chúng ta có thể sử dụng: xác nhận chéo chuỗi thời gian. Phương pháp này sử dụng một phần dữ liệu lịch sử và phù hợp với mô hình mỗi lần sử dụng dữ liệu cho đến điểm giới hạn. Sau đó, Nhà tiên tri sẽ so sánh những lời tiên đoán với những điều thực tế. Hãy thử sử dụng mã.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Ở kết quả trên, chúng tôi có được kết quả đánh giá từ kết quả thực tế so với dự báo trong từng ngày dự báo. Cũng có thể hình dung kết quả bằng đoạn mã sau.

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

 

Dự báo chuỗi thời gian với mô hình thống kê và nhà tiên tri
 

Nếu chúng ta thấy biểu đồ ở trên, chúng ta có thể thấy lỗi dự đoán thay đổi theo ngày và nó có thể đạt đến 50% lỗi tại một số điểm. Bằng cách này, chúng tôi có thể muốn điều chỉnh mô hình hơn nữa để sửa lỗi. Bạn có thể kiểm tra tài liệu hướng dẫn Để thăm dò thêm.

Dự báo là một trong những trường hợp phổ biến xảy ra trong doanh nghiệp. Một cách dễ dàng để phát triển mô hình dự báo là sử dụng gói statsforecast và Prophet Python. Trong bài viết này, chúng ta tìm hiểu cách tạo mô hình dự báo và đánh giá chúng bằng statsforecast và Prophet.
 
 
Cornellius Yudha Wijaya là trợ lý quản lý khoa học dữ liệu và người viết dữ liệu. Trong khi làm việc toàn thời gian tại Allianz Indonesia, anh ấy thích chia sẻ các mẹo về Python và Dữ liệu qua mạng xã hội và phương tiện viết lách.
 

Dấu thời gian:

Thêm từ Xe đẩy