Bỏ qua tới nội dung chính
Quay lại tin tức

3 thủ thuật Statsmodels trong phân tích và dự báo chuỗi thời gian

KDnuggets· Matthew Mayo· 5/10/2026general

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.