Chuyển đến nội dung chính

Facebook Prophet: Cách tiếp cận hiện đại cho dự báo chuỗi thời gian

Tìm hiểu cách Facebook Prophet mô hình hóa xu hướng, tính thời vụ và sự kiện đặc biệt để tạo ra dự báo chính xác, dễ diễn giải.
· 10 phút đọc

Khám phá cùng AI

Các công ty phụ thuộc vào việc dự đoán xu hướng tương lai để đưa ra quyết định chiến lược, như dự báo doanh số sản phẩm hoặc đánh giá biến động nhu cầu. Một cách hiệu quả để dự đoán là dự báo chuỗi thời gian. Nguyên tắc cốt lõi của dự báo chuỗi thời gian là dựa vào các giá trị dữ liệu lịch sử để dự đoán kết quả tương lai. Điều này đòi hỏi chú trọng dữ liệu vì dữ liệu thực tế thường nhiễu hoặc thiếu, do đó khó dự đoán.

Dù có nhiều công cụ dành cho dự báo chuỗi thời gian, Facebook Prophet được thiết kế riêng để xử lý các phức tạp trong thế giới thực, từ xu hướng phi tuyến và tính thời vụ đến tác động của các sự kiện đặc biệt như ngày lễ, chiến dịch marketing hoặc đột biến lưu lượng. Nếu bạn hoàn toàn chưa quen với dự báo chuỗi thời gian, tôi khuyến nghị học khóa Time Series Analysis in Python và/hoặc khóa Forecasting in R của chúng tôi.

Facebook Prophet là gì?

Prophet là thư viện dự báo mã nguồn mở do nhóm Core Data Science của Facebook phát triển. Thư viện có sẵn cho cả Python và R. Một phần lý do khiến nhà phân tích và nhà khoa học dữ liệu ưa chuộng là vì nó tự động hóa nhiều bước tẻ nhạt trong các phương pháp dự báo truyền thống. Nhờ tính linh hoạt đó, nó giúp người dùng nhanh chóng tạo ra các dự báo dễ diễn giải và chất lượng tốt.

Khung mô hình lõi của Facebook Prophet

Cách tiếp cận mô hình của Facebook Prophet được cấu trúc chặt chẽ nhưng linh hoạt. Nó phân rã một chuỗi thời gian thành bốn thành phần chính, gồm xu hướng, tính thời vụ, ngày lễ và sai số. Thành phần thứ ba, tôi gọi là ngày lễ, không quá tiêu chuẩn. Phân rã kinh điển và STL thường chỉ có ba phần: xu hướng, thời vụ và sai số.

Bằng cách làm rõ cách xu hướng, tính thời vụ và ngày lễ cùng đóng góp vào dự báo cuối cùng, việc phân rã giúp kiểm chứng lập luận của mô hình khi chúng ta đưa ra quyết định có cơ sở.

Phân rã chuỗi thời gian

Prophet dùng mô hình cộng, trong đó chuỗi thời gian y(t) được biểu diễn như sau:

Phương trình phân rã chuỗi thời gian của Facebook Prophet

Trong đó, 

  • Xu hướng (g(t)) thể hiện tăng trưởng hoặc suy giảm dài hạn.

  • Tính thời vụ (s(t)) bao gồm các mẫu lặp lại như dao động theo tuần, tháng hoặc năm.

  • Ảnh hưởng ngày lễ (h(t)) phản ánh các sự kiện bất thường nhưng có thể dự đoán, như Black Friday hoặc các ngày lễ quốc gia.

  • Sai số (et) là nhiễu còn lại không được giải thích bởi các thành phần khác.

Ngoài việc tăng khả năng diễn giải bằng cách cho thấy các yếu tố chi phối dự đoán, nó cũng tự động hóa phần lớn quy trình dự báo chuỗi thời gian, như phát hiện tính thời vụ và xử lý giá trị thiếu.

Bằng cách xử lý các bước tiền xử lý phức tạp này, Prophet giảm bớt yêu cầu về chuyên môn thống kê sâu, vốn thường cần trong các phương pháp thống kê truyền thống. Ví dụ, ARIMA đòi hỏi giả định dừng và không chính thức tính đến các yếu tố bên ngoài, trong khi Prophet mô hình hóa rõ ràng tính thời vụ và tác động ngày lễ, nên được xem là dễ dùng hơn cho dự báo kinh doanh.

Đặc tả thành phần xu hướng

Prophet có hai mô hình xu hướng:

  1. Mô hình tăng trưởng logistic hữu ích khi chuỗi thời gian bão hòa ở một mức dung lượng tối đa, tương tự việc người dùng chấp nhận một ứng dụng mới.
  2. Mô hình tuyến tính từng đoạn chia xu hướng thành các đoạn có điểm thay đổi, giúp dễ mô hình hóa những biến động đột ngột trong tăng trưởng.

Mô hình hóa tính thời vụ

Tính thời vụ được mô hình hóa bằng chuỗi Fourier, cho phép các hàm tuần hoàn trơn tru trong dữ liệu chuỗi thời gian. Có hai dạng hành vi thời vụ chính:

  • Thời vụ cộng phù hợp khi biên độ biến thiên thời vụ ổn định theo thời gian.
  • Thời vụ nhân phù hợp khi dao động thời vụ tăng cùng xu hướng, ví dụ khối lượng bán hàng tăng cùng tăng trưởng thị trường chung.

Ngoài ra, người dùng có thể định nghĩa thời vụ tùy chỉnh để biểu diễn các mẫu đặc thù miền, ví dụ khuyến mãi theo quý.

Tích hợp ngày lễ và sự kiện

Prophet còn cho phép đưa vào cả các ngày lễ định nghĩa sẵn và danh sách sự kiện tùy ý. Điều này đặc biệt hữu ích khi mô hình hóa chu kỳ kinh doanh, ngày lễ văn hóa, hoặc các sự kiện một lần như ra mắt sản phẩm. Ta cũng có thể thêm các sự kiện bất ngờ như COVID-19 dưới dạng biến hồi quy bổ sung để cập nhật dự báo một cách linh hoạt. Việc mô hình hóa tường minh các sự kiện như vậy giúp cải thiện độ chính xác và cung cấp hiểu biết về tác động của các mốc đặc biệt lên xu hướng nền.

Xử lý nhiễu và ngoại lệ

Dữ liệu thực tế thường chứa nhiễu và ngoại lệ, có thể làm sai lệch dự đoán của mô hình. Prophet có các hàm mất mát vững và thành phần xu hướng phi tham số giúp dự đoán ít nhạy với ngoại lệ hơn.

Để tăng độ ổn định của dự báo, hữu ích khi phân tích đồ thị phần dư và tiền xử lý dữ liệu bằng cách winsorize hoặc loại bỏ bất thường. Những bước này đảm bảo mô hình học được xu hướng thực, thay vì nhiễu ngẫu nhiên.

Khi nào nên dùng Facebook Prophet (và khi nào không)

Giống hầu hết mô hình và kỹ thuật học máy, Prophet không phải là giải pháp vạn năng. Hiểu rõ điểm mạnh và điểm yếu là chìa khóa để dùng hiệu quả.

Thế mạnh và kịch bản lý tưởng

Prophet đặc biệt hiệu quả khi:

  • Khi dữ liệu có tính thời vụ rõ theo ngày, tuần hoặc năm.
  • Tập dữ liệu không đầy đủ và cần xử lý tự động giá trị thiếu và ngoại lệ.
  • Người dùng cần phân tích thăm dò nhanh và phát triển mô hình ban đầu.

Sự đơn giản khiến nó dễ tiếp cận với người dùng ít kiến thức thống kê, trong khi tính dễ diễn giải giúp nhà phân tích và nhà khoa học dữ liệu truyền đạt kết quả hiệu quả tới các bên liên quan không chuyên môn.

Hạn chế và rủi ro tiềm ẩn

Prophet có thể kém phù hợp trong các tình huống sau:

  • Dữ liệu biến động mạnh hoặc không có thời vụ, nơi không có mẫu chu kỳ đều đặn.
  • Dự báo dài hạn khi xu hướng khó đoán.
  • Các xu hướng phi tuyến không được nắm bắt bởi mô hình tuyến tính từng đoạn hoặc logistic.

Quy tắc vàng khi dùng Prophet hay bất kỳ mô hình dự báo nào là tránh áp dụng một cách mù quáng. Nếu không thẩm định đúng mực, các mô hình rất dễ tạo ra dự báo quá tự tin hoặc gây hiểu lầm, điều đã thấy trong nhiều thảo luận cộng đồng và các thất bại dự báo nổi tiếng.

Làm việc với Prophet trong Python

Bước 1: Import thư viện

Đầu tiên, nạp tất cả gói Python cần thiết:

  • pandas để thao tác dữ liệu

  • prophet để xây dựng mô hình dự báo

  • matplotlib để trực quan hóa

  • sklearn.metrics – để tính MAPE, chỉ số lỗi

import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_percentage_error

Bước 2:  Nạp dữ liệu

Tiếp theo, chúng ta đọc tệp CSV chứa dữ liệu giá hợp đồng tương lai vàng lịch sử. Tại đây là đường dẫn đến bộ dữ liệu Kaggle tôi đang sử dụng.

file_path = "future-gc00-daily-prices.csv"
gold_ts = pd.read_csv(file_path)

Bước 3: Làm sạch dữ liệu

Giờ chúng ta cần làm sạch dữ liệu. Điều này nghĩa là:

  • Loại bỏ dấu phẩy khỏi các cột số và chuyển sang số thực.

  • Chuyển cột Date từ chuỗi sang kiểu datetime.

Điều này đảm bảo Prophet có thể hiểu và sắp xếp ngày tháng chính xác.

for col in ["Open", "High", "Low", "Close"]:
    gold_ts[col] = gold_ts[col].str.replace(",", "").astype(float)
gold_ts["Date"] = pd.to_datetime(gold_ts["Date"], format="%m/%d/%Y")

Bước 4: Sắp xếp dữ liệu theo ngày

Sắp xếp dữ liệu theo thứ tự thời gian. Đây là bước quan trọng dễ bị bỏ sót.

gold_ts = gold_ts.sort_values("Date")

Bước 5: Chuẩn bị dữ liệu cho Prophet

Chúng ta cũng cần chuẩn bị dữ liệu theo định dạng Prophet mong đợi, với tên cột như sau:

  • ds → dấu thời gian (datestamp)

  • y → giá trị cần dự báo (ở đây là giá Close)

gold_ts = gold_ts[["Date", "Close"]].rename(columns={"Date": "ds", "Close": "y"})

Bước 6: Chia tập huấn luyện và kiểm tra

Giờ chúng ta chia dữ liệu thành phiên bản huấn luyện và kiểm tra. 

  • Giữ phần lớn dữ liệu để huấn luyện.
  • Dành 180 hàng cuối (hoặc 10% nếu ít hơn) để kiểm tra độ chính xác của mô hình.
test_size = min(180, len(gold_ts) // 10)
train = gold_ts.iloc[:-test_size]
test = gold_ts.iloc[-test_size:]

Bước 7: Huấn luyện mô hình Prophet

Huấn luyện Prophet trên dữ liệu lịch sử với cả thành phần thời vụ theo ngày và theo năm được bật.

model = Prophet(daily_seasonality=True, yearly_seasonality=True)
model.fit(train)

Bước 8: Dự báo giá trị tương lai

Chúng ta dự báo cho số ngày bằng với tập kiểm tra.

Bản dự báo có các cột như yhat (giá trị dự đoán), yhat_lower và yhat_upper.

future = model.make_future_dataframe(periods=test_size)
forecast = model.predict(future)

Bước 9: Căn chỉnh dự đoán với giá trị thực tế

Nối giá đóng cửa thực tế với dự đoán của mô hình theo ngày trùng khớp để so sánh trực tiếp.

merged = pd.merge(test, forecast[["ds", "yhat"]], on="ds", how="inner")

Bước 10: Tính MAPE

Giờ chúng ta đo lường độ chính xác của dự báo. Nếu không có ngày trùng nhau, mã sẽ cảnh báo thay vì dừng đột ngột.

if merged.empty:
    print("No overlapping dates between forecast and test set.")
else:
    mape = mean_absolute_percentage_error(merged["y"], merged["yhat"]) * 100
    print(f"Mean Absolute Percentage Error (MAPE): {mape:.2f}%")

Ở đây, sai số phần trăm tuyệt đối trung bình (MAPE): 5,83%

Phương trình MAPE

Bước 11: Vẽ biểu đồ dự báo

Trực quan hóa dự báo, khoảng tin cậy và lịch sử thực tế.

fig1 = model.plot(forecast)
plt.title("Gold Futures (GC00) - Close Price Forecast")
plt.xlabel("Date")
plt.ylabel("Close Price")
plt.show()

Kết quả dự báo Facebook Prophet

Bước 12: Vẽ các thành phần thời vụ

Hữu ích khi cho thấy xu hướng, thời vụ theo ngày và theo năm đóng góp thế nào vào dự báo.

fig2 = model.plot_components(forecast)
plt.show()

Phân rã thời vụ của Facebook Prophet

Bước 13: Xem mẫu dự báo

Hiển thị một vài giá trị dự đoán cuối cùng và khoảng bất định của chúng.

print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail(10))

Mẫu giá trị dự báo:

             ds         yhat   yhat_lower   yhat_upper
3714 2023-11-09  1834.568081  1743.127873  1922.791205
3715 2023-11-10  1833.323500  1749.265678  1937.246093
3716 2023-11-11  1832.818196  1740.941278  1921.772611
3717 2023-11-12  1832.370884  1745.285047  1925.012684
3718 2023-11-13  1832.644350  1736.792708  1919.057042
3719 2023-11-14  1832.017761  1736.229502  1929.786669
3720 2023-11-15  1831.650906  1743.190077  1924.851936
3721 2023-11-16  1831.566521  1738.181184  1933.026740
3722 2023-11-17  1830.427713  1736.038529  1919.505155
3723 2023-11-18  1830.029816  1737.022754  1922.118728

Xác thực và kiểm thử Facebook Prophet

Phương pháp xác thực

Cross-validation theo chuỗi thời gian là cần thiết để mô phỏng các kịch bản dự báo thực tế. Quan trọng là đánh giá hiệu năng mô hình trên nhiều tập xác thực liên tiếp. Điều này không chỉ giúp tránh thiên lệch nhìn trước mà còn tăng khả năng khái quát hóa cho dữ liệu chưa thấy trong tương lai.

Một số chỉ số đánh giá tiêu chuẩn gồm:

  • Sai số tuyệt đối trung bình (MAE) đo lường độ lớn trung bình của sai số, bỏ qua hướng.
  • Sai số phần trăm tuyệt đối trung bình (MAPE) đo mức chênh lệch tuyệt đối trung bình theo phần trăm. Dễ diễn giải trên các thang đo khác nhau. Đây là chỉ số chúng ta đã xem trong ví dụ Python.

Phân tích so sánh

So với ARIMA hoặc LSTM, Prophet giỏi trong việc:

  • Xử lý tính thời vụ bất quy tắc và tác động ngày lễ
  • Thể hiện tính vững trước dữ liệu thiếu, ngoại lệ và bất thường trong kinh doanh

Tuy nhiên, Prophet có thể kém hiệu quả trong các tình huống có mẫu phi tuyến mạnh hoặc tập dữ liệu với tính thời vụ yếu. 

Ứng dụng thực tiễn và hạn chế

Các nghiên cứu tình huống thực tế

Prophet đã được áp dụng rộng rãi trong nhiều ngành cho các trường hợp sử dụng như:

  • Dự báo doanh số bán lẻ, đo lường nhu cầu và quản lý tồn kho
  • Dự đoán lưu lượng web để hiểu mức độ tương tác người dùng
  • Dự báo nhu cầu năng lượng để cân bằng hiệu quả cung và cầu.

Bất chấp lợi ích, đã có những trường hợp mẫu hình lịch sử thất bại do gián đoạn bất ngờ, như đã xảy ra trong đại dịch. 

Hạn chế về khả năng mở rộng

Prophet xử lý tốt các tập dữ liệu cỡ vừa, phù hợp với hầu hết nhiệm vụ dự báo kinh doanh và vận hành. Tuy nhiên, khi dùng với tập dữ liệu cực lớn hoặc chuỗi thời gian tần suất cao, chi phí tính toán sẽ lớn do khung mô hình Bayesian nền tảng. Để giảm nhẹ, nên dự báo nhiều chuỗi thời gian song song. Một cách thực tế khác là gộp hoặc giảm tần suất dữ liệu. Cách này giảm chi phí bộ nhớ và thời gian chạy mà không mất các mẫu thời gian giá trị.

Hạn chế chính

Prophet giả định một biến mục tiêu duy nhất và mô hình hóa xu hướng của nó bằng các đường cong tăng trưởng tuyến tính từng đoạn hoặc logistic. Những giả định như vậy có thể hạn chế tính linh hoạt cho các bài toán đa biến hoặc không bị xu hướng chi phối. Do đó, người dùng cần bổ sung kiến thức miền vào các dự báo của Prophet cùng với xác thực bên ngoài để đảm bảo độ tin cậy.

Thất bại và phê bình trong thực tế

Những thất bại dự báo nổi bật, như cú sụp đổ thị trường nhà ở của Zillow, nhấn mạnh rủi ro khi quá phụ thuộc vào phần mềm dự báo tự động. Đặt quá nhiều niềm tin vào đầu ra mô hình mà không có rà soát của con người có thể dẫn tới sai lầm tốn kém. Vì vậy, được khuyến nghị thực hiện xác thực kỹ lưỡng và lập kế hoạch kịch bản khi diễn giải kết quả dự báo.

Đừng ngần ngại chất vấn mọi mô hình và xu hướng. Nuôi dưỡng văn hóa tư duy phản biện và cho phép các nhóm thách thức hiện trạng. Tôi đã thấy những nhóm như vậy liên tục xây dựng các giải pháp dự báo vững chắc. 

Cuối cùng, tôi rất khuyến nghị áp dụng tư duy "tin nhưng phải kiểm chứng" và thêm một lớp kiến thức miền của bạn để thực hiện kiểm tra hợp lý cho kết quả. 

Lộ trình phát triển trong tương lai

Prophet vẫn đang phát triển thông qua nghiên cứu và đóng góp cộng đồng. Những cải tiến đang diễn ra gồm:

  • Hỗ trợ đa biến
  • Tăng khả năng mở rộng cho tập dữ liệu lớn
  • Các tiện ích mở rộng do cộng đồng phát triển

Nghiên cứu hiện hành tập trung tích hợp các phương pháp thống kê mới và cải thiện hiệu năng trên các tập dữ liệu phức tạp, tần suất cao.

Kết luận

Facebook Prophet là công cụ mạnh cho dự báo chuỗi thời gian, mang lại tính tự động, khả năng diễn giải và linh hoạt. Nó hoạt động tốt cho dự báo thăm dò trong kinh doanh và các lĩnh vực khác có tính thời vụ mạnh hoặc sự kiện đặc biệt.

Nhưng điều đó không biến nó thành giải pháp cắm là chạy. Để có dự đoán đáng tin cậy, người dùng cần đảm bảo xác thực cẩn trọng, tinh chỉnh tham số và áp dụng kiến thức miền. Bằng cách cân bằng tự động hóa của Prophet với sự phán đoán thận trọng của con người, nhà phân tích có thể phát triển những hiểu biết có thể hành động và tránh các cạm bẫy thường gặp.

Để học thực hành, hãy xem các khóa học và lộ trình kỹ năng của chúng tôi:

Vidhi Chugh

Tác giả

Vidhi Chugh

Tôi là một Chiến lược gia và Nhà đạo đức học về AI, làm việc tại giao điểm giữa khoa học dữ liệu, sản phẩm và kỹ thuật để xây dựng các hệ thống máy học có khả năng mở rộng. Được xếp hạng trong danh sách “Top 200 Nhà đổi mới trong Kinh doanh và Công nghệ” trên thế giới, tôi theo đuổi sứ mệnh dân chủ hóa máy học và giản lược thuật ngữ chuyên môn để mọi người đều có thể tham gia vào quá trình chuyển đổi này.

Câu hỏi thường gặp

Facebook Prophet được dùng để làm gì?

Facebook Prophet được dùng cho dự báo chuỗi thời gian, giúp dự đoán xu hướng, tính thời vụ và tác động sự kiện trong dữ liệu như doanh số, nhu cầu hoặc lưu lượng web.

Prophet xử lý ngày lễ và sự kiện đặc biệt như thế nào?

Prophet cho phép thêm các sự kiện định nghĩa sẵn hoặc tùy chỉnh vào mô hình, nhờ đó phản ánh các đột biến tăng/giảm bất thường trong chuỗi thời gian.

Vì sao Prophet phổ biến trong dự báo kinh doanh?

Prophet tự động hóa, dễ diễn giải và vững trước dữ liệu thiếu cùng ngoại lệ, khiến nó lý tưởng cho các dự báo nhanh và đáng tin cậy.

Khi nào nên tránh dùng Facebook Prophet?

Nên tránh dùng Prophet cho dữ liệu biến động mạnh hoặc không có thời vụ, hoặc khi xu hướng quá khó đoán.

Những ưu điểm chính của Prophet so với ARIMA là gì?

Không giống ARIMA, Prophet không yêu cầu tính dừng nghiêm ngặt, xử lý dữ liệu thiếu và tự động phát hiện điểm thay đổi.

Chủ đề

Liên quan