Menggunakan Holt-Winters untuk perkiraan dalam Python

8

[Saya pertama kali memposting pertanyaan ini ke Stack Overflow di sini tetapi tidak mendapat balasan, jadi saya pikir saya akan mencoba di sini. Permintaan maaf jika pemasangan ulang tidak diizinkan.]

Saya sudah mencoba menggunakan implementasi algoritma Holt-Winters untuk peramalan deret waktu dengan Python tetapi telah mengalami hambatan ... pada dasarnya, untuk beberapa rangkaian input (positif), kadang-kadang ramalan angka negatif, yang seharusnya jelas tidak demikian. Bahkan jika ramalannya tidak negatif, mereka kadang-kadang sangat tidak akurat - urutan besarnya lebih tinggi / lebih rendah dari yang seharusnya. Memberikan algoritma lebih banyak periode data untuk bekerja dengan tampaknya tidak membantu, dan bahkan sering membuat perkiraan lebih buruk.

Data yang saya gunakan memiliki karakteristik berikut, yang mungkin menjadi masalah:

  • Sangat sering disampel (satu titik data setiap 15 menit, berbeda dengan data bulanan seperti contoh yang digunakan) - tetapi dari apa yang saya baca, algoritma Holt-Winters seharusnya tidak memiliki masalah dengan itu. Mungkin itu menunjukkan masalah dengan implementasi?

  • Memiliki beberapa periode - ada puncak harian (yaitu setiap 96 titik data) serta siklus mingguan data akhir pekan secara signifikan lebih rendah dari data hari kerja - misalnya hari kerja dapat memuncak di sekitar 4000 tetapi akhir pekan mencapai 1000 - tetapi bahkan ketika saya hanya memberikan itu data hari kerja, saya mengalami masalah angka negatif.

Apakah ada sesuatu yang saya lewatkan dengan implementasi atau penggunaan algoritma Holt-Winters secara umum? Saya bukan ahli statistik jadi saya menggunakan nilai 'default' dari alpha, beta, dan gamma yang ditunjukkan dalam tautan di atas - apakah itu yang menjadi masalah? Apa cara yang lebih baik untuk menghitung nilai-nilai ini?

Atau ... adakah algoritma yang lebih baik untuk digunakan di sini daripada Holt-Winters? Pada akhirnya saya hanya ingin membuat prakiraan yang masuk akal dari data historis di sini. Saya sudah mencoba perataan tunggal dan ganda eksponensial tetapi (sejauh yang saya mengerti) tidak mendukung periodisitas dalam data.

Saya juga telah melihat ke dalam menggunakan paket perkiraan R sebagai gantinya melalui rpy2 - apakah itu memberi saya hasil yang lebih baik? Saya membayangkan saya masih harus menghitung parameter dan sebagainya, jadi itu hanya ide yang bagus jika masalah saya saat ini terletak pada implementasi algoritma ...?

Setiap bantuan / masukan akan sangat dihargai!

Wern
sumber

Jawaban:

4

Saya pikir paket perkiraan R yang Anda sebutkan lebih cocok untuk masalah ini daripada hanya menggunakan Holt-Winters. Dua fungsi yang Anda minati adalah ets () dan auto.arima () . ets () akan cocok dengan model pemulusan eksponensial, termasuk Holt-Winters dan beberapa metode lainnya. Ini akan memilih parameter (alfa, beta, dan gama) untuk berbagai model dan kemudian mengembalikan yang dengan AIC terendah (atau BIC jika Anda suka). auto.arima () bekerja dengan cara yang sama.

Namun, seperti yang ditunjukkan IrishStat, model semacam ini mungkin tidak sesuai untuk analisis Anda. Dalam hal itu, coba hitung beberapa kovariat, seperti variabel dummy untuk akhir pekan, hari libur, dan interaksinya. Setelah Anda menentukan kovariat yang masuk akal, gunakan auto.arima () untuk menemukan model ARMAX, lalu prakiraan () untuk membuat prediksi. Anda mungkin akan berakhir dengan sesuatu yang jauh lebih baik daripada model Holt-Winters sederhana dengan python dengan parameter default.

Anda juga harus mencatat bahwa ets () dan auto.arima dapat disesuaikan dengan model musiman, tetapi Anda perlu memformat data Anda sebagai seri waktu musiman. Beri tahu saya jika Anda membutuhkan bantuan.

Anda dapat membaca lebih lanjut tentang paket perkiraan di sini .

Zach
sumber
Bagaimana saya bisa menghitung kovariat?
Wern
@Wern: Kedengarannya Anda perlu SETIDAKNYA 2 set kovariat: satu set variabel dummy untuk jam-hari, dan variabel yang mewakili akhir pekan vs hari kerja. Dengan kata lain, Anda memerlukan matriks dari variabel 0/1 berikut: H1, H2, H3, H4 ... H23, Hari Kerja, di mana H1 = 1 jika jam == 1, dan 0 sebaliknya. H2 = 2 jika jam == 2, dan 0 jika tidak, dll. Hari kerja = 1 pada hari kerja dan 0 pada akhir pekan. Selain itu, Anda dapat memasukkan: interaksi antara hari kerja dan jam, hari dalam seminggu, bulan dalam setahun, hari libur, dan interaksi lainnya. Beri tahu saya jika Anda perlu bantuan dalam hal ini di R. Mulailah dengan boneka jam dan hari kerja.
Zach
@ Barat: Setelah membaca kembali pertanyaan Anda, sepertinya Anda memiliki data 15 menit, jadi daripada menghitung H1-H23, Anda harus menghitung I1-I95, di mana "interval" menghitung interval 15 menit sejak awal hari. Juga, pastikan untuk menghilangkan 1 variabel dari set boneka ini, misalnya H24 atau I96. Jenis data apa yang Anda lihat? Lalu lintas web? Beban listrik?
Zach
Hmm, saya pikir saya tahu apa yang Anda maksud. Saya akan mencobanya dan memberi tahu Anda - terima kasih! Data tersebut adalah lalu lintas web.
Wern
@ Kami jika Anda menyukai jawaban saya (atau IrishStat) jangan ragu untuk menerimanya dengan mengklik tanda centang hijau.
Zach
7

Masalahnya mungkin Holt-Winters adalah bentuk model spesifik dan mungkin tidak berlaku untuk data Anda. Model HW mengasumsikan antara lain sebagai berikut. a) satu dan hanya satu tren b) tidak ada perubahan level dalam data yaitu tidak ada perubahan intersep 3) bahwa parameter musiman tidak bervariasi dari waktu ke waktu 4) tidak ada pencilan 5) tidak ada struktur autoregresif atau struktur model adaptif 6) kesalahan model yang memiliki varians konstan Dan tentu saja 7) bahwa sejarah menyebabkan masa depan yaitu tidak ada penggabungan harga / promosi. Dll sebagai variabel membantu

Dari uraian Anda, tampak bagi saya bahwa pendekatan frekuensi campuran mungkin diperlukan. Saya telah melihat masalah deret waktu di mana efek jam-of-the-hari dan efek hari-of-the-minggu memiliki istilah interaksi yang signifikan. Anda mencoba memaksa data Anda menjadi struktur yang tidak memadai yaitu tidak cukup umum. Memperkirakan parameter dan memilih dari set kecil model tidak menggantikan Identifikasi Model. Anda mungkin ingin membaca bagian tentang berbagai pendekatan untuk Pemodelan Otomatis di www.autobox.com/pdfs/catchword.pdf. Dalam hal pendekatan yang lebih umum saya menyarankan agar Anda mempertimbangkan model ARMAX atau dikenal sebagai Fungsi Transfer yang merelaksasi asumsi yang disebutkan sebelumnya.

IrishStat
sumber
Hmm Anda memiliki beberapa poin yang sangat bagus ... data saya juga mengandung banyak outlier dan dapat mengalami variasi yang signifikan pada acara-acara seperti Natal atau Tahun Baru. Tetapi apa yang Anda maksud dengan 'struktur model autoregresif atau adaptif'? Saya akan memberikan ARMAX kesempatan, terima kasih!
Wern
@ Barat Komponen adaptif / autoregresif ada ketika "prediktor" termasuk memori (nilai sebelumnya) dari seri endogen (Y) atau seri eksogen ATAU nilai-nilai lagged dari istilah kesalahan. Penting untuk mengidentifikasi dan membuat model, dengan kemungkinan efek timbal, kontemporer dan tertinggal di sekitar SETIAP Hari Libur. Selain itu mungkin ada penyebab yang dapat ditentukan untuk hari-hari tertentu dalam sebulan, tergantung pada hari-of-the-minggu. Misalnya tanggal 5 bulan mungkin penting DIBERIKAN bahwa itu bukan akhir pekan. Kami telah berhasil memodelkan / secara otomatis mengidentifikasi struktur ini.
IrishStat