Thứ ba, 04/04/2017 | 00:00 GMT+7

Hướng dẫn dự báo chuỗi thời gian với prophet bằng Python 3

Trong các hướng dẫn trước, ta đã chỉ ra cách trực quan hóa và thao tác dữ liệu chuỗi thời gian cũng như cách tận dụng phương pháp ARIMA để tạo dự báo từ dữ liệu chuỗi thời gian . Ta lưu ý việc tham số hóa chính xác các mô hình ARIMA có thể là một quy trình thủ công phức tạp đòi hỏi một khoảng thời gian nhất định.

Các ngôn ngữ lập trình thống kê khác như R cung cấp các cách tự động để giải quyết vấn đề này, nhưng chúng vẫn chưa được chính thức chuyển sang Python. May mắn là group Khoa học Dữ liệu cốt lõi tại Facebook gần đây đã xuất bản một phương pháp mới có tên là Prophet , cho phép các nhà phân tích và phát triển dữ liệu giống nhau thực hiện dự báo trên quy mô lớn bằng Python 3.

Yêu cầu

Hướng dẫn này sẽ trình bày cách thực hiện phân tích chuỗi thời gian trên máy tính local hoặc server từ xa. Làm việc với các tập dữ liệu lớn có thể tốn nhiều bộ nhớ, vì vậy trong cả hai trường hợp, máy tính cần ít nhất 2GB bộ nhớ để thực hiện một số phép tính trong hướng dẫn này.

Đối với hướng dẫn này, ta sẽ sử dụng Jupyter Notebook để làm việc với dữ liệu. Nếu bạn chưa có, bạn nên làm theo hướng dẫn của ta để cài đặt và cài đặt Jupyter Notebook cho Python 3 .

Bước 1 - Kéo Tập dữ liệu và Cài đặt Gói

Để cài đặt môi trường dự báo chuỗi thời gian của ta với Prophet, trước tiên ta hãy chuyển sang môi trường lập trình local hoặc môi trường lập trình dựa trên server của ta :

  • cd environments
  • . my_env/bin/activate

Từ đây, hãy tạo một folder mới cho dự án của ta . Ta sẽ gọi nó là thời timeseries và sau đó chuyển vào folder . Nếu bạn gọi dự án bằng một tên khác, hãy đảm bảo thay thế tên của bạn cho các timeseries thời gian trong suốt hướng dẫn:

  • mkdir timeseries
  • cd timeseries

Ta sẽ làm việc với tập dữ liệu Hành khách của Hãng hàng không Box và Jenkins (1976), chứa dữ liệu chuỗi thời gian về số lượng hành khách hàng tháng từ năm 1949 đến năm 1960. Bạn có thể lưu dữ liệu bằng cách sử dụng lệnh curl với cờ -O để ghi kết quả vào file và download CSV:

curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv 

Hướng dẫn này sẽ yêu cầu thư viện pandas , matplotlib , numpy , cythonfbprophet . Giống như hầu hết các gói Python khác, ta có thể cài đặt các thư viện pandas , numpy , cythonmatplotlib bằng pip:

pip install pandas matplotlib numpy cython 

Để tính toán các dự báo của nó, thư viện fbprophet dựa trên ngôn ngữ lập trình STAN , được đặt tên để vinh danh nhà toán học Stanislaw Ulam . Trước khi cài đặt fbprophet , do đó ta cần đảm bảo shell bọc pystan Python thành STAN được cài đặt:

pip install pystan 

Sau khi hoàn tất, ta có thể cài đặt Prophet bằng cách sử dụng pip:

pip install fbprophet 

Bây giờ ta đã cài đặt xong, ta có thể bắt đầu làm việc với các gói đã cài đặt.

Bước 2 - Nhập gói và tải dữ liệu

Để bắt đầu làm việc với dữ liệu của ta , ta sẽ khởi động Jupyter Notebook:

  • jupyter notebook

Để tạo file sổ tay mới, hãy chọn Mới > Python 3 từ trình đơn kéo xuống trên cùng bên phải:

Tạo sổ ghi chép Python 3 mới

Thao tác này sẽ mở một sổ ghi chép cho phép ta tải các thư viện cần thiết.

Như là phương pháp hay nhất, hãy bắt đầu bằng lệnh các thư viện bạn cần ở đầu sổ ghi chép của bạn (lưu ý các phím tắt tiêu chuẩn được sử dụng để tham chiếu pandas , matplotlibstatsmodels ):

%matplotlib inline import pandas as pd from fbprophet import Prophet  import matplotlib.pyplot as plt plt.style.use('fivethirtyeight') 

Lưu ý ta cũng đã xác định kiểu matplotlib ba mươi sáng cho các lô của ta .

Sau mỗi khối mã trong hướng dẫn này, bạn nên gõ ALT + ENTER để chạy mã và chuyển sang khối mã mới trong sổ ghi chép của bạn .

Hãy bắt đầu bằng cách đọc dữ liệu chuỗi thời gian của ta . Ta có thể tải file CSV và in ra 5 dòng đầu tiên bằng các lệnh sau:

df = pd.read_csv('AirPassengers.csv')  df.head(5) 

Khung dữ liệu

DataFrame của ta rõ ràng chứa cột MonthAirPassengers . Thư viện Tiên tri mong đợi khi nhập DataFrame với một cột chứa thông tin thời gian và một cột khác chứa chỉ số mà ta muốn dự báo. Quan trọng hơn, các cột thời gian dự kiến sẽ được của datetime loại, vì vậy hãy kiểm tra các loại cột của ta :

df.dtypes 
Output
Month object AirPassengers int64 dtype: object

Bởi vì Month cột không phải là của datetime loại, ta cần phải chuyển đổi nó:

df['Month'] = pd.DatetimeIndex(df['Month']) df.dtypes 
Output
Month datetime64[ns] AirPassengers int64 dtype: object

Bây giờ ta thấy rằng ta Month cột là đúng datetime loại.

Prophet cũng áp đặt điều kiện nghiêm ngặt rằng các cột đầu vào phải được đặt tên là ds (cột thời gian) và y (cột số liệu), vì vậy hãy đổi tên các cột trong DataFrame của ta :

df = df.rename(columns={'Month': 'ds',                         'AirPassengers': 'y'})  df.head(5) 

Khung dữ liệu

Cách thực hành tốt là hình dung dữ liệu mà ta sẽ làm việc, vì vậy hãy vẽ biểu đồ chuỗi thời gian của ta :

ax = df.set_index('ds').plot(figsize=(12, 8)) ax.set_ylabel('Monthly Number of Airline Passengers') ax.set_xlabel('Date')  plt.show() 

Lô thời gian

Với dữ liệu của ta hiện đã được chuẩn bị, ta đã sẵn sàng sử dụng thư viện Tiên tri để đưa ra dự báo về chuỗi thời gian của ta .

Bước 3 - Dự báo chuỗi thời gian với prophet

Trong phần này, ta sẽ mô tả cách sử dụng thư viện Tiên tri để dự đoán các giá trị trong tương lai của chuỗi thời gian của ta . Các tác giả của Prophet đã loại bỏ nhiều phức tạp vốn có của dự báo chuỗi thời gian và giúp các nhà phân tích và nhà phát triển làm việc với dữ liệu chuỗi thời gian trở nên trực quan hơn.

Để bắt đầu, ta phải khởi tạo một đối tượng Tiên tri mới. Tiên tri cho phép ta xác định một số đối số. Ví dụ, ta có thể xác định phạm vi mong muốn của khoảng thời gian không chắc chắn của ta bằng cách cài đặt interval_width tham số.

# set the uncertainty interval to 95% (the Prophet default is 80%) my_model = Prophet(interval_width=0.95) 

Bây giờ mô hình Tiên tri của ta đã được khởi tạo, ta có thể gọi phương thức fit của nó với DataFrame của ta làm đầu vào. Quá trình lắp mô hình sẽ mất không quá vài giây.

my_model.fit(df) 

Bạn sẽ nhận được kết quả tương tự như sau:

Output
<fbprophet.forecaster.Prophet at 0x110204080>

Để có được dự báo về chuỗi thời gian của bạn , ta phải cung cấp cho Prophet một DataFrame mới chứa cột ds chứa các ngày mà ta muốn dự đoán. Thuận tiện, ta không phải lo lắng về việc tạo DataFrame này theo cách thủ công, vì Prophet cung cấp hàm trợ giúp make_future_dataframe :

future_dates = my_model.make_future_dataframe(periods=36, freq='MS') future_dates.tail() 

Khung dữ liệu

Trong đoạn mã ở trên, ta đã hướng dẫn Prophet tạo 36 dấu dữ liệu trong tương lai.

Khi làm việc với Prophet, điều quan trọng là phải xem xét tần suất của chuỗi thời gian của ta . Bởi vì ta đang làm việc với dữ liệu hàng tháng, ta đã chỉ định rõ ràng tần suất mong muốn của dấu thời gian (trong trường hợp này, MS là đầu tháng). Do đó, make_future_dataframe tạo ra 36 dấu thời gian hàng tháng cho ta . Nói cách khác, ta đang tìm cách dự đoán các giá trị tương lai của chuỗi thời gian của ta trong 3 năm tới.

DataFrame của các ngày trong tương lai sau đó được sử dụng làm đầu vào cho phương pháp predict của mô hình phù hợp của ta .

forecast = my_model.predict(future_dates) forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail() 

Dự đoán mô hình

Prophet trả về một DataFrame lớn với nhiều cột thú vị, nhưng ta đặt kết quả của bạn cho các cột phù hợp nhất với dự báo, đó là:

  • ds : dấu dữ liệu của giá trị dự báo
  • yhat : giá trị dự báo của chỉ số của ta (trong Thống kê, yhat là ký hiệu thường được sử dụng để biểu thị các giá trị dự đoán của một giá trị y )
  • yhat_lower : giới hạn dưới của dự báo của ta
  • yhat_upper : giới hạn trên của dự báo của ta

Dự kiến sẽ có một sự thay đổi trong các giá trị từ kết quả được trình bày ở trên vì Prophet dựa vào phương pháp Markov chain Monte Carlo (MCMC) để đưa ra các dự báo của nó. MCMC là một quá trình ngẫu nhiên, vì vậy các giá trị sẽ hơi khác nhau mỗi lần.

Prophet cũng cung cấp một chức năng thuận tiện để nhanh chóng vẽ các kết quả dự báo của ta :

my_model.plot(forecast,               uncertainty=True) 

Lô dự báo

Prophet vẽ biểu đồ các giá trị quan sát được của chuỗi thời gian của ta (các chấm đen), các giá trị dự báo (đường màu xanh lam) và khoảng thời gian không chắc chắn của các dự báo của ta (các vùng tô bóng màu xanh lam).

Một tính năng đặc biệt mạnh mẽ khác của Prophet là khả năng trả về các thành phần của dự báo của ta . Điều này có thể giúp tiết lộ cách hàng ngày, hàng tuần và hàng năm của chuỗi thời gian đóng góp vào các giá trị dự báo tổng thể:

my_model.plot_components(forecast) 

Các thành phần của lô dự báo

Cốt truyện trên cung cấp những hiểu biết thú vị. Biểu đồ đầu tiên cho thấy lượng hành khách đi máy bay hàng tháng đã tăng một cách tuyến tính theo thời gian. Biểu đồ thứ hai nhấn mạnh thực tế là số lượng hành khách hàng tuần đạt đỉnh vào cuối tuần và vào thứ Bảy, trong khi biểu đồ thứ ba cho thấy lưu lượng truy cập nhiều nhất xảy ra trong các tháng nghỉ lễ tháng 7 và tháng 8.

Kết luận

Trong hướng dẫn này, ta đã mô tả cách sử dụng thư viện Tiên tri để thực hiện dự báo chuỗi thời gian bằng Python. Ta đã sử dụng các tham số không có trong hộp, nhưng Prophet cho phép ta chỉ định nhiều đối số hơn. Đặc biệt, Prophet cung cấp chức năng mang kiến thức của bạn về chuỗi thời gian cho bảng.

Dưới đây là một số điều bổ sung mà bạn có thể thử:

  • Đánh giá ảnh hưởng của các ngày lễ bằng cách bao gồm kiến thức trước đây của bạn về các tháng nghỉ lễ (ví dụ: ta biết rằng tháng 12 là tháng nghỉ lễ). Tài liệu chính thức về ngày lễ mô hình hóa sẽ hữu ích.
  • Thay đổi phạm vi khoảng thời gian không chắc chắn của bạn hoặc dự báo xa hơn trong tương lai.

Để thực hành nhiều hơn, bạn cũng có thể thử tải một tập dữ liệu chuỗi thời gian khác để đưa ra dự báo của bạn . Nhìn chung, Prophet cung cấp một số tính năng hấp dẫn, bao gồm cơ hội điều chỉnh mô hình dự báo cho phù hợp với yêu cầu của user .


Tags:

Các tin liên quan

Hiểu các biến lớp và phiên bản trong Python 3
2017-03-27
Hướng dẫn Dự báo chuỗi thời gian với ARIMA bằng Python 3
2017-03-23
Cách tạo lớp và xác định đối tượng trong Python 3
2017-03-17
Hướng dẫn về image hóa chuỗi thời gian với Python 3
2017-03-14
Cách viết comment bằng Python 3
2017-03-03
Cách xác định hàm trong Python 3
2017-02-28
Phân tích và trực quan hóa dữ liệu với pandas và notebook Jupyter bằng Python 3
2017-02-23
Cách vẽ biểu đồ tần suất từ bằng matplotlib với Python 3
2017-02-17
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10