Sử dụng Holt-Winters để dự báo trong Python


8

[Lần đầu tiên tôi đăng câu hỏi này lên Stack Overflow tại đây nhưng không nhận được bất kỳ câu trả lời nào, vì vậy tôi nghĩ tôi đã thử ở đây. Xin lỗi nếu đăng lại không được phép.]

Tôi đã cố gắng sử dụng triển khai thuật toán Holt-Winters này để dự báo chuỗi thời gian trong Python nhưng đã chạy vào một rào cản ... về cơ bản, đối với một số chuỗi đầu vào (dương), đôi khi nó dự báo các số âm, rõ ràng không phải là trường hợp Ngay cả khi các dự báo không phải là tiêu cực, đôi khi chúng cực kỳ không chính xác - các đơn đặt hàng có cường độ cao hơn / thấp hơn mức cần thiết. Cung cấp cho thuật toán nhiều thời gian dữ liệu hơn để làm việc dường như không có ích, và trên thực tế thường làm cho dự báo tồi tệ hơn.

Dữ liệu tôi đang sử dụng có các đặc điểm sau, có thể là sự cố:

  • Rất thường xuyên được lấy mẫu (một điểm dữ liệu cứ sau 15 phút, trái ngược với dữ liệu hàng tháng như ví dụ sử dụng) - nhưng từ những gì tôi đã đọc, thuật toán Holt-Winters không nên có vấn đề với điều đó. Có lẽ điều đó chỉ ra một vấn đề với việc thực hiện?

  • Có nhiều chu kỳ - có các đỉnh hàng ngày (tức là cứ 96 điểm dữ liệu) cũng như chu kỳ hàng tuần của dữ liệu cuối tuần thấp hơn đáng kể so với dữ liệu ngày trong tuần - ví dụ: các ngày trong tuần có thể đạt đỉnh khoảng 4000 nhưng cuối tuần đạt cực đại 1000 - nhưng ngay cả khi tôi chỉ đưa ra đó là dữ liệu ngày thường, tôi gặp vấn đề về số âm.

Có điều gì tôi đang thiếu với việc triển khai hoặc sử dụng thuật toán Holt-Winters nói chung không? Tôi không phải là người thống kê nên tôi đang sử dụng các giá trị 'mặc định' của alpha, beta và gamma được chỉ định trong liên kết ở trên - đó có phải là vấn đề không? Một cách tốt hơn để tính toán các giá trị này là gì?

Hoặc ... có thuật toán nào tốt hơn để sử dụng ở đây hơn Holt-Winters không? Cuối cùng, tôi chỉ muốn tạo dự báo hợp lý từ dữ liệu lịch sử ở đây. Tôi đã thử làm mịn theo cấp số nhân và theo cấp số nhân nhưng (theo như tôi hiểu) không hỗ trợ tính định kỳ trong dữ liệu.

Tôi cũng đã xem xét việc sử dụng gói dự báo R thay vì thông qua rpy2 - điều đó có cho tôi kết quả tốt hơn không? Tôi tưởng tượng rằng tôi vẫn sẽ phải tính toán các tham số, v.v., vì vậy sẽ chỉ là một ý tưởng tốt nếu vấn đề hiện tại của tôi nằm ở việc thực hiện thuật toán ...?

Bất kỳ trợ giúp / đầu vào sẽ được đánh giá rất cao!

Câu trả lời:


4

Tôi nghĩ rằng gói dự báo R mà bạn đề cập là phù hợp hơn cho vấn đề này hơn là chỉ sử dụng Holt-Winters. Hai hàm bạn quan tâm là ets ()auto.arima () . ets () sẽ phù hợp với mô hình làm mịn theo cấp số nhân, bao gồm Holt-Winters và một số phương pháp khác. Nó sẽ chọn các tham số (alpha, beta và gama) cho nhiều mô hình khác nhau và sau đó trả về mô hình có AIC thấp nhất (hoặc BIC nếu bạn thích). auto.arima () hoạt động tương tự.

Tuy nhiên, như IrishStat đã chỉ ra, những loại mô hình này có thể không phù hợp với phân tích của bạn. Trong trường hợp đó, hãy thử tính toán một số đồng biến, chẳng hạn như các biến giả cho cuối tuần, ngày lễ và tương tác của chúng. Khi bạn đã chỉ định các biến số có ý nghĩa, hãy sử dụng auto.arima () để tìm mô hình ARMAX và sau đó dự báo () để đưa ra dự đoán. Bạn có thể sẽ kết thúc với một cái gì đó tốt hơn nhiều so với một mô hình Holt-Winters đơn giản trong python với các tham số mặc định.

Bạn cũng nên lưu ý rằng cả ets () và auto.arima đều có thể phù hợp với các mô hình theo mùa, nhưng bạn cần định dạng dữ liệu của mình dưới dạng chuỗi thời gian theo mùa. Hãy cho tôi biết nếu bạn cần bất kỳ sự giúp đỡ với điều đó.

Bạn có thể đọc thêm về gói dự báo ở đây .


Làm thế nào tôi có thể đi về tính toán đồng biến?
Wern

@Wern: Có vẻ như bạn cần AT LEAST 2 bộ đồng biến: một tập hợp các biến giả cho giờ trong ngày và một biến đại diện cho cuối tuần so với ngày trong tuần. Nói cách khác, bạn cần một ma trận gồm các biến 0/1 sau: H1, H2, H3, H4 ... H23, Weekday, trong đó H1 = 1 nếu giờ == 1 và khác 0. H2 = 2 nếu giờ == 2 và bằng 0 nếu không, v.v ... Ngày trong tuần = 1 vào các ngày trong tuần và 0 vào cuối tuần. Ngoài ra, bạn có thể bao gồm: sự tương tác giữa ngày trong tuần và giờ, ngày trong tuần, tháng trong năm, ngày lễ và các tương tác khác. Hãy cho tôi biết nếu bạn cần trợ giúp để làm điều này trong R. Bắt đầu với các hình nộm giờ và ngày trong tuần.
Zach

@Wern: Sau khi đọc lại câu hỏi của bạn, có vẻ như bạn có dữ liệu 15 phút, vì vậy thay vì tính toán H1-H23, bạn nên tính I1-I95, trong đó "khoảng" đếm các khoảng thời gian 15 phút kể từ khi bắt đầu ngày. Ngoài ra, hãy chắc chắn bỏ qua 1 biến trong bộ hình nộm này, ví dụ H24 hoặc I96. Bạn đang xem loại dữ liệu nào? Lưu lượng truy cập web? Tải điện?
Zach

Hmm, tôi nghĩ tôi biết ý của bạn. Tôi sẽ dùng thử và cho bạn biết - cảm ơn! Dữ liệu là lưu lượng truy cập web.
Wern

@ Nếu bạn thích câu trả lời của tôi (hoặc IrishStat's), vui lòng chấp nhận câu trả lời bằng cách nhấp vào dấu kiểm màu xanh lục.
Zach

7

Vấn đề có thể là Holt-Winters là một mẫu mô hình cụ thể và có thể không áp dụng được cho dữ liệu của bạn. Mô hình CTNH giả định trong số những điều khác sau đây. a) một và chỉ một xu hướng b) không thay đổi cấp độ trong dữ liệu tức là không thay đổi chặn 3) rằng các tham số theo mùa không thay đổi theo thời gian 4) không có ngoại lệ 5) không có cấu trúc mô hình tự phát hoặc cấu trúc mô hình thích nghi 6) lỗi mô hình có phương sai không đổi Và tất nhiên 7) rằng lịch sử gây ra tương lai, tức là không có sự kết hợp của giá / chương trình khuyến mãi, v.v.

Từ mô tả của bạn, có vẻ như tôi cần một cách tiếp cận tần số hỗn hợp. Tôi đã thấy các vấn đề về chuỗi thời gian trong đó các hiệu ứng hàng giờ và các hiệu ứng trong ngày có các điều khoản tương tác đáng kể. Bạn đang cố gắng buộc dữ liệu của mình vào một cấu trúc không đầy đủ tức là không đủ khái quát. Ước tính các tham số và lựa chọn từ một nhóm nhỏ các mô hình không thay thế Nhận dạng mô hình. Bạn có thể muốn đọc một phần về các cách tiếp cận khác nhau đối với Mô hình tự động tại www.autobox.com/pdfs/catchword.pdf. Xét về cách tiếp cận tổng quát hơn, tôi khuyên bạn nên xem xét một mô hình ARMAX hay còn gọi là Chức năng chuyển giao giúp thư giãn các giả định đã đề cập ở trên.


Hmm, bạn có một số điểm rất tốt ... dữ liệu của tôi cũng chứa rất nhiều ngoại lệ và có thể thay đổi đáng kể về các sự kiện như Giáng sinh hoặc Năm mới. Nhưng ý của bạn là 'cấu trúc mô hình tự phát hoặc thích nghi' là gì? Tôi sẽ cung cấp cho ARMAX một shot, cảm ơn!
Wern

@Wern Một thành phần thích ứng / tự động tồn tại khi "các yếu tố dự đoán" bao gồm cả bộ nhớ (giá trị trước đó) của chuỗi nội sinh (Y) hoặc chuỗi ngoại sinh HOẶC giá trị trễ của thuật ngữ lỗi. Điều quan trọng là xác định và mô hình hóa, với các hiệu ứng chì, đương thời và độ trễ có thể xảy ra xung quanh MACHI ngày lễ. Hơn nữa, có thể có nguyên nhân có thể gán cho các ngày cụ thể trong tháng, tùy thuộc vào ngày trong tuần. Ví dụ, ngày 5 của tháng có thể quan trọng GIVEN rằng đó không phải là một ngày cuối tuần. Chúng tôi đã có thể mô hình thành công / tự động xác định cấu trúc này.
IrishStat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.