
3 thủ thuật Statsmodels trong phân tích và dự báo chuỗi thời gian
Một mô hình statsmodels đã được hiệu chỉnh sẽ tính toán nhiều hơn là chỉ một mảng các con số mà hầu hết các đoạn mã trích xuất từ đó.
3 thủ thuật Statsmodels để phân tích và dự báo chuỗi thời gian - KDnuggets
Một mô hình Statsmodels đã được hiệu chỉnh (fitted model) tính toán nhiều hơn chỉ là một mảng các con số mà hầu hết các đoạn mã trích xuất từ đó. Dự báo điểm là nhiệm vụ nhỏ nhất mà mô hình có thể thực hiện. Mỗi thủ thuật đều xuất phát từ việc yêu cầu đối tượng kết quả cung cấp những gì nó đã tính toán, thay vì phải tự xây dựng lại thủ công. Một tập dữ liệu, một mô hình, ba phương pháp mà mọi người thường xuyên triển khai lại. Cả ba đều được chạy trên cùng một chuỗi dữ liệu hàng tháng và cùng một mô hình đã hiệu chỉnh, vì vậy điều duy nhất thay đổi giữa chúng là phương pháp nào được gọi trên đối tượng `fit` được trả về.
Tất cả các nội dung dưới đây đã được kiểm tra với Statsmodels 0.15.0.
Bắt đầu bằng cách cài đặt Statsmodels:
`pip install statsmodels`
**Thủ thuật 1: Yêu cầu khoảng tin cậy, không chỉ con số**
`res.forecast(12)` cung cấp cho bạn mười hai con số. `res.get_forecast(12)` thay vào đó cung cấp cho bạn một đối tượng `PredictionResults`, đối tượng này cũng chứa thông tin về độ bất định mà mô hình đã ước tính. Có `predicted_mean` cho các điểm dự báo, `conf_int` cho các giới hạn và `summary_frame()` cho cả hai cùng một lúc. Các khoảng tin cậy thậm chí không phải là công việc bổ sung; chúng là kết quả của cùng một phép tính, và phương pháp ngắn gọn hơn chỉ đơn giản là loại bỏ chúng:
```python
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA
co2 = sm.datasets.co2.load_pandas().data["co2"]
co2 = co2.resample("MS").mean().ffill()
train, recent = co2[:-12], co2[-12:]
res = ARIMA(train, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12)).fit()
print(res.get_forecast(12).summary_frame().head())
```
Kết quả:
```
co2 mean mean_se mean_ci_lower mean_ci_upper
2001-01-01 370.523929 0.322722 369.891406 371.156452
2001-02-01 371.253673 0.388214 370.492787 372.014559
2001-03-01 372.200726 0.429518 371.358887 373.042566
2001-04-01 373.468351 0.463501 372.559905 374.376797
2001-05-01 373.856957 0.494157 372.888427 374.825487
```
Việc công bố một dự báo mà không có khoảng tin cậy là một lựa chọn. Và nếu điều bạn muốn là các giá trị đã hiệu chỉnh (fitted values) trong suốt lịch sử thay vì đường dự báo phía trước, `get_prediction` là ý tưởng tương tự được áp dụng cho một phạm vi có thể bao gồm các giai đoạn trong mẫu.
**Thủ thuật 2: Thêm dữ liệu mới mà không cần hiệu chỉnh lại**
Mười hai tháng quan sát mới xuất hiện. Phản xạ thông thường là nối chúng vào dữ liệu huấn luyện và gọi lại `.fit()`, điều này sẽ ước tính lại mọi tham số từ đầu. Phương thức `append` thực hiện một cách ít tốn kém hơn: nó tạo lại đối tượng kết quả trên dữ liệu kết hợp và, với `refit=False`, nó giữ nguyên các tham số bạn đã ước tính:
```python
updated = res.append(recent, refit=False)
print(updated.get_forecast(6).summary_frame().head())
```
Kết quả:
co2 mean mean_se mean_ci_lower mean_ci_upper
2002-01-01 371.969954 0.322722 371.337432 372.602477
2002-02-01 372.750021 0.388214 371.989135 373.510907
2002-03-01 373.654908 0.429518 372.813068 374.496748
2002-04-01 374.834276 0.463501 373.925830 375.742722
2002-05-01 375.328719 0.494157 374.360189 376.297248
Mặc định là refit=False, tức là sử dụng lại các ước tính đã có. Hãy đặt refit=True khi có đủ dữ liệu mới tích lũy và cần tính toán lại.
Có ba phương pháp này:
append chạy lại bộ lọc trên dữ liệu gốc cũng như dữ liệu mới
extend chỉ lọc các quan sát mới, nhanh hơn khi lịch sử dài
apply dành cho một tập dữ liệu khác thay vì tiếp nối tập dữ liệu hiện tại
Mẹo 3: Để STL xử lý tính thời vụ
Phiên bản thủ công của quy trình này gồm ba bước:
phân tách chuỗi
dự báo phần đã điều chỉnh theo mùa
sau đó thêm thành phần thời vụ trở lại vào dự báo
Bước thứ ba là nơi xảy ra lỗi dấu và sai lệch chỉ số. STLForecast là toàn bộ vòng lặp đó dưới dạng một đối tượng. Tài liệu mô tả nó là dự báo "bằng cách trước tiên trừ đi tính thời vụ được ước tính bằng STL, sau đó dự báo dữ liệu đã khử tính thời vụ bằng mô hình chuỗi thời gian, ví dụ: ARIMA":
from statsmodels.tsa.forecasting.stl import STLForecast
stlf = STLForecast(train, ARIMA, model_kwargs={"order": (1, 1, 1), "trend": "t"})
print(stlf.fit().forecast(12).head())
Đầu ra:
2001-01-01 370.529117
2001-02-01 370.963627
2001-03-01 371.921080
2001-04-01 373.137720
2001-05-01 373.144192
Freq: MS, dtype: float64
Lưu ý những gì được truyền vào: chính lớp ARIMA, không phải một thể hiện đã được huấn luyện, với các đối số của nó được truyền riêng trong model_kwargs. Đó là điều thực sự đáng ngạc nhiên duy nhất trong API này, và việc truyền ARIMA(...) thay vì thế là lỗi đầu tiên mà hầu hết mọi người mắc phải.
Tổng kết
Mỗi mẹo ở đây là một phương thức đã tồn tại trên một đối tượng đã được xây dựng. Các giải pháp tự viết tay sẽ dài hơn, chậm hơn và thường xuyên sai sót hơn, do đó, việc đi chệch khỏi các tính năng tích hợp sẵn trong trường hợp này thực sự không đáng. Chúng thường được viết ra vì không ai xem xét kết quả trả về từ .fit(). Hãy đọc đối tượng kết quả; sau đó ngừng viết lại nó.
Matthew Mayo (@mattmayo13) có bằng thạc sĩ khoa học máy tính và bằng tốt nghiệp sau đại học về khai thác dữ liệu. Với vai trò biên tập viên quản lý của KDnuggets & Statology, và biên tập viên đóng góp tại Machine Learning Mastery, Matthew mong muốn làm cho các khái niệm khoa học dữ liệu phức tạp trở nên dễ tiếp cận. Các lĩnh vực quan tâm chuyên môn của ông bao gồm xử lý ngôn ngữ tự nhiên, mô hình ngôn ngữ, thuật toán học máy và khám phá AI mới nổi. Ông được thúc đẩy bởi sứ mệnh
Nguồn tin: KDnuggets — Tác giả: Matthew Mayo. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.