18/09/2018, 16:27

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

Giới thiệu Trong các hướng dẫn trước, chúng tôi đã cho thấy cách trực quan hóa và xử lý dữ liệu chuỗi thời gianvà 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. Chúng tôi đã lưu ý cách tham số chính xác của các mô hình ARIMA có thể là một quá trình thủ công phức tạp đòi ...

Giới thiệu

Trong các hướng dẫn trước, chúng tôi đã cho thấy cách trực quan hóa và xử lý dữ liệu chuỗi thời gianvà 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. Chúng tôi đã lưu ý cách tham số chính xác của các mô hình ARIMA có thể là một quá trình thủ công phức tạp đòi hỏi một lượ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ách tự động để giải quyết vấn đề này, nhưng vẫn chưa được chính thức chuyển sang Python. May mắn thay, nhóm 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 Prophet, cho phép các nhà phân tích và nhà phát triển dữ liệu giống nhau để thực hiện dự báo ở quy mô bằng Python 3.

Điều kiện tiên quyết

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

Đối với hướng dẫn này, chúng tôi sẽ sử dụng Máy tính xách tay Jupyter để làm việc với dữ liệu. Nếu bạn chưa có, bạn nên theo dõi hướng dẫn cài đặt và thiết lập sổ ghi chép Jupyter cho Python 3.

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

Để thiết lập môi trường của chúng tôi cho dự báo chuỗi thời gian với Prophet, hãy đầu tiên chuyển sang môi trường lập trình cục bộ hoặc môi trường lập trình dựa trên máy chủ của chúng tôi:

cd environments

. my_env/bin/activate

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

mkdir timeseries

cd timeseries

Chúng tôi sẽ làm việc với Box và Jenkins (1976) Airline Passenger dataset, có chứa dữ liệu chuỗi thời gian về số lượng hành khách hàng không 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 curl lệnh với -O gắn cờ để ghi đầu ra vào một tệp và tải xuống CSV:

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

Hướng dẫn này sẽ yêu cầu pandas, matplotlib, numpy, cython và fbprophet thư viện. Giống như hầu hết các gói Python khác, chúng tôi có thể cài đặt pandas, numpy, cython và matplotlib thư viện với pip:

pip install pandas matplotlib numpy cython

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

pip install pystan

Một khi điều này được thực hiện, chúng ta có thể cài đặt Prophet bằng cách sử dụng pip:

pip install fbprophet

Bây giờ chúng ta đã thiết lập xong, chúng 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 chúng tôi, chúng tôi sẽ khởi động Máy tính xách tay Jupyter:

jupyter notebook

Để tạo tệp sổ ghi chép mới, hãy chọn Mới > Python 3 từ menu kéo xuống trên cùng bên phải:

Create a new Python 3 notebook

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

Như là thực hành tốt nhất, hãy bắt đầu bằng cách nhập các thư viện mà bạn sẽ cần ở đầu sổ ghi chép của bạn (chú ý các ký hiệu chuẩn được sử dụng để tham khảo pandas, matplotlib và statsmodels):

%matplotlib inline
import pandas as pd
from fbprophet import Prophet

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Chú ý cách chúng ta cũng đã định nghĩa fivethirtyeight matplotlib Phong cách cho các ô của chúng tôi.

Sau mỗi khối mã trong hướng dẫn này, bạn nên nhập ALT + ENTER để chạy mã và di chuyển vào một 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 chúng tôi. Chúng tôi có thể tải tệp CSV và in 5 dòng đầu tiên bằng các lệnh sau:

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

df.head(5)

DataFrame

Của chúng tôi Khung dữ liệu rõ ràng chứa Month và AirPassengers cột. Thư viện Prophet dự kiến ​​sẽ 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 số liệu mà chúng tôi muốn dự báo. Quan trọng hơn, cột thời gian được mong đợi là datetime loại, vì vậy hãy kiểm tra loại cột của chúng tôi:

df.dtypes

OutputMonth            object
AirPassengers     int64
dtype: object

Bởi vì Month cột không phải của datetime nhập, chúng tôi sẽ cần phải chuyển đổi nó:

df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes

OutputMonth            datetime64[ns]
AirPassengers             int64
dtype: object

Bây giờ chúng ta thấy rằng Month cột đúng datetime kiểu.

Vị tiên tri cũng áp đặt điều kiện nghiêm ngặt rằng các cột đầu vào được đặt tên 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 chúng tôi:

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

df.head(5)

DataFrame

Thực hành tốt là trực quan hóa dữ liệu chúng ta sẽ làm việc với, vì vậy hãy phác thảo chuỗi thời gian của chúng ta:

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

plt.show()

Time Series Plot

Với dữ liệu của chúng tôi chuẩn bị sẵn sàng, chúng tôi sẵn sàng sử dụng thư viện Prophet để đưa ra dự báo về chuỗi thời gian của chúng tôi.

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

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

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

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

Bây giờ mô hình Prophet của chúng ta đã được khởi tạo, chúng ta có thể gọi nó là fit với DataFrame của chúng tôi làm đầu vào. Việc lắp đặt mô hình sẽ không lâu hơn một 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 chúng tôi, chúng tôi phải cung cấp cho Prophet một DataFrame mới chứa ds cột chứa các ngày mà chúng tôi muốn dự đoán. Thuận tiện, chúng tôi không phải quan tâm đến việc tạo thủ công DataFrame này theo cách thủ công, vì Prophet cung cấp make_future_dataframe chức năng trợ giúp:

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

DataFrame

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

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

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

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

Predict Model

Vị tiên tri trả về một DataFrame lớn với nhiều cột thú vị, nhưng chúng tôi sẽ đặt đầu ra của chúng tôi thành các cột có liên quan nhất đến dự báo, đó là:

  • ds: dấu thời gian của giá trị được dự báo
  • yhat: giá trị dự báo của chỉ số của chúng tôi (trong Thống kê, yhat là một ký hiệu được sử dụng theo cách truyền thống để đại diện cho các giá trị được 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 chúng tôi
  • yhat_upper: giới hạn trên của dự báo của chúng tôi

Một sự thay đổi về giá trị từ đầu ra được trình bày ở trên được dự kiến ​​là Prophet dựa vào chuỗi Markov Monte Carlo (MCMC) để tạo 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.

Vị tiên tri cũng cung cấp một chức năng thuận tiện để nhanh chóng phác họa kết quả dự báo của chúng tôi:

my_model.plot(forecast,
              uncertainty=True)

Forecast Plot

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

Một tính năng đặc biệt mạnh khác của Prophet là khả năng trả lại các thành phần của dự báo của chúng tôi. Điều này có thể giúp tiết lộ cách thức 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)

Components of Forecasts Plots

Cốt truyện trên cung cấp thông tin chi tiết thú vị. Cốt truyện đầu tiên cho thấy khối lượng hàng tháng của hành khách hàng không đã tăng tuyến tính theo thời gian. Cốt truyện thứ hai nhấn mạnh thực tế rằng số lượng hành khách hàng tuần cao nhất vào cuối tuần và vào thứ Bảy, trong khi âm mư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 lễ tháng 7 và tháng 8.

Phần kết luận

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

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

  • Đánh giá hiệu quả của các ngày lễ bằng cách bao gồm kiến ​​thức trước của bạn về các tháng nghỉ lễ (ví dụ: chúng tôi biết rằng tháng 12 là tháng nghỉ lễ). Tài liệu chính thức về mô hình ngày lễ sẽ rất 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 thêm trong tương lai.

Để thực hành thêm, bạn cũng có thể thử tải một tập dữ liệu chuỗi thời gian khác để tạo dự đoán của riêng mình. 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 theo yêu cầu của người dùng.

0