Menggunakan k-fold cross-validation untuk pemilihan model deret waktu

70

Pertanyaan: Saya ingin memastikan sesuatu, apakah penggunaan k-fold cross-validation dengan deret waktu sangat mudah, atau apakah orang perlu memberi perhatian khusus sebelum menggunakannya?

Latar Belakang: Saya memodelkan serangkaian waktu 6 tahun (dengan rantai semi-markov), dengan sampel data setiap 5 menit. Untuk membandingkan beberapa model, saya menggunakan validasi silang 6 kali lipat dengan memisahkan data dalam 6 tahun, jadi set pelatihan saya (untuk menghitung parameter) memiliki panjang 5 tahun, dan set tes memiliki panjang 1 tahun. Saya tidak memperhitungkan urutan waktu, jadi set saya yang berbeda adalah:

  • lipat 1: pelatihan [1 2 3 4 5], ujian [6]
  • lipat 2: pelatihan [1 2 3 4 6], ujian [5]
  • lipat 3: pelatihan [1 2 3 5 6], ujian [4]
  • lipat 4: pelatihan [1 2 4 5 6], ujian [3]
  • lipat 5: pelatihan [1 3 4 5 6], ujian [2]
  • lipat 6: pelatihan [2 3 4 5 6], ujian [1].

Saya membuat hipotesis bahwa setiap tahun tidak tergantung satu sama lain. Bagaimana saya bisa memverifikasi itu? Apakah ada referensi yang menunjukkan penerapan validasi silang k-fold dengan deret waktu.

Mickaël S
sumber
Lihatlah artikel ini, yang saya temukan helful francescopochetti.com/...
Henok S Mengistu

Jawaban:

69

Rangkaian waktu (atau data yang dipesan secara intrinsik lainnya) dapat bermasalah untuk validasi silang. Jika beberapa pola muncul di tahun 3 dan tetap selama bertahun-tahun 4-6, maka model Anda dapat mengambilnya, meskipun itu bukan bagian dari tahun 1 & 2.

Pendekatan yang terkadang lebih berprinsip pada time series adalah forward chaining, di mana prosedur Anda akan seperti ini:

  • fold 1: training [1], test [2]
  • lipat 2: pelatihan [1 2], tes [3]
  • lipat 3: pelatihan [1 2 3], ujian [4]
  • lipat 4: pelatihan [1 2 3 4], ujian [5]
  • lipat 5: pelatihan [1 2 3 4 5], ujian [6]

Yang lebih akurat memodelkan situasi yang akan Anda lihat pada waktu prediksi, di mana Anda akan memodelkan pada data masa lalu dan memprediksi pada data berwawasan ke depan. Ini juga akan memberi Anda rasa ketergantungan pemodelan Anda pada ukuran data.

Ken Williams
sumber
1
Terima kasih. Saya mengerti, seperti kata Zach, ini adalah cara kanonik untuk melakukannya. Dan saya mengerti mengapa. Masalah yang saya miliki dengan itu, sebenarnya fakta bahwa itu akan mempertimbangkan variasi ukuran data, jadi saya tidak akan mendapatkan kesalahan generalisasi "benar" dari model saya. Tapi kesalahan campuran: generalisasi dan ukuran data. Apakah Anda tahu beberapa referensi lainnya (selain M.Hyndman) yang berurusan dengan validasi silang dalam seri waktu? Jangan salah paham, itu bukan saya tidak percaya apa yang Anda katakan dan apa yang dikatakan M. Hyndman, itu masuk akal. Saya sederhana ingin memiliki beberapa sudut pandang tentang masalah
Mickaël S
Saya khawatir saya tidak tahu referensi semacam itu, tetapi saya akan tertarik untuk melihatnya jika ada orang lain yang tahu.
Ken Williams
1
@Wayne, saya maksudkan bahwa solusi ini menggunakan semakin banyak tahun data pelatihan di setiap lipatan. Dalam data saya pasti ada perbedaan antara tahun, tetapi tidak ada tren yang jelas atau musiman.
Mickaël S
3
@Mickael: Anda bisa menggunakan tes flip 1: train [1 2] [3]; lipatan 2: tes kereta [2 3] [4]; lipatan 3: latih [3 4] tes [5], dll, jika Anda khawatir menggunakan semakin banyak data di setiap lipatan. Dugaan saya adalah bahwa dengan teknik semi-MC Anda tidak dapat benar-benar berebut tahun-tahun sekitar, bahkan jika tidak ada tren.
Wayne
3
@ MickaëlS: Saya menemukan makalah ini sciencedirect.com/science/article/pii/S0020025511006773 dan berpikir makalah ini mungkin menarik. Mereka membandingkan pendekatan 'kanonik' ini dengan dua metode lain - pendekatan 'penghambat blokir' dan pendekatan 'tinggalkan ketergantungan'.
thebigdog
26

Metode yang saya gunakan untuk memvalidasi silang model deret waktu saya adalah validasi silang secara bergulir. Mulailah dengan subkumpulan data kecil untuk tujuan pelatihan, ramalan poin data kemudian, dan periksa keakuratan poin data ramalan. Poin data yang diramalkan yang sama kemudian dimasukkan sebagai bagian dari dataset pelatihan berikutnya dan poin data berikutnya diperkirakan.

Untuk membuat berbagai hal menjadi intuitif, berikut ini gambar yang sama:

masukkan deskripsi gambar di sini

Kode R yang setara adalah:

i <- 36    #### Starting with 3 years of monthly training data 
pred_ets <- c()
pred_arima <- c()
while(i <= nrow(dt)){
  ts <- ts(dt[1:i, "Amount"], start=c(2001, 12), frequency=12)

  pred_ets <- rbind(pred_ets, data.frame(forecast(ets(ts), 3)$mean[1:3]))
	  pred_arima <- rbind(pred_arima, data.frame(forecast(auto.arima(ts), 3)$mean[1:3]))

  i = i + 3
}
names(pred_arima) <- "arima"
names(pred_ets) <- "ets"

pred_ets <- ts(pred_ets$ets, start=c(2005, 01), frequency = 12)
	pred_arima <- ts(pred_arima$arima, start=c(2005, 01), frequency =12)

accuracy(pred_ets, ts_dt)
accuracy(pred_arima, ts_dt)
Jatin Garg
sumber
Apakah ada cara untuk melakukan ini untuk metode seperti regresi logistik menggunakan R?
hlyates
1
@lyates, Dalam pemahaman saya adalah mungkin, Anda hanya perlu memodifikasi kode di atas sedikit. Sertakan pred_lr (prediksi dengan regresi logistik) dan ubah nama kolom sesuai dengan itu.
Jatin Garg
22

Cara "kanonik" untuk melakukan validasi silang seri-waktu (setidaknya seperti yang dijelaskan oleh @Rob Hyndman) adalah dengan "menggulung" melalui dataset.

yaitu:

  • fold 1: training [1], test [2]
  • lipat 2: pelatihan [1 2], tes [3]
  • lipat 3: pelatihan [1 2 3], ujian [4]
  • lipat 4: pelatihan [1 2 3 4], ujian [5]
  • lipat 5: pelatihan [1 2 3 4 5], ujian [6]

Pada dasarnya, set latihan Anda tidak boleh berisi informasi yang terjadi setelah set tes.

Zach
sumber
13

ARIMA(p,d,q)d>0d

Agar validasi silang berfungsi sebagai alat pemilihan model, Anda memerlukan perkiraan independensi antara pelatihan dan data pengujian. Masalah dengan data deret waktu adalah bahwa titik data yang berdekatan sering sangat tergantung, sehingga validasi silang standar akan gagal. Obat untuk ini adalah meninggalkan celah antara sampel uji dan sampel pelatihan, di kedua sisi sampel uji . Alasan mengapa Anda juga perlu meninggalkan celah sebelum sampel tes adalah bahwa ketergantungan simetris ketika Anda bergerak maju atau mundur dalam waktu (pikirkan korelasi).

hvvh

  • fold 1: training [1 2 3 4 5h], tes [6]
  • fold 2: training [1 2 3 4h h6], tes [5]
  • lipat 3: pelatihan [1 2 3 jam h5 6], tes [4]
  • lipat 4: pelatihan [1 2 jam h4 5 6], tes [3]
  • fold 5: training [1h h3 4 5 6], tes [2]
  • lipat 6: pelatihan [h2 3 4 5 6], ujian [1]

Di mana h menunjukkan bahwa h pengamatan sampel pelatihan dihapus pada sisi itu.

Matthias Schmidtblaicher
sumber
3

Seperti dikomentari oleh @thebigdog, "Tentang penggunaan validasi silang untuk evaluasi prediktor seri waktu" oleh Bergmeir et al. membahas validasi silang dalam konteks seri waktu stasioner dan tentukan Forward Chaining (diusulkan oleh penjawab lain) untuk tidak membantu. Catatan, Forward Chaining disebut Evaluasi Blok Terakhir dalam makalah ini:

Dengan menggunakan validasi silang 5 kali lipat standar, tidak ada efek praktis dari dependensi dalam data yang dapat ditemukan, mengenai apakah kesalahan akhir diremehkan atau terlalu tinggi. Sebaliknya, evaluasi blok terakhir cenderung menghasilkan ukuran kesalahan yang kurang kuat daripada validasi silang dan validasi silang diblokir.

" Mengevaluasi model peramalan time series: Sebuah studi empiris tentang metode estimasi kinerja " oleh Cerqueira et al. setuju dengan penilaian ini. Namun, untuk deret waktu non-stasioner, mereka merekomendasikan untuk menggunakan variasi pada Hold-Out, yang disebut Rep-Holdout. Dalam Rep-Holdout, sebuah titik adipilih dalam seri waktu Yuntuk menandai awal data pengujian. Titik aditentukan dalam jendela. Ini diilustrasikan pada gambar di bawah ini:

ilustrasi rep-holdout

Makalah yang disebutkan di atas adalah tes yang panjang dan lengkap hampir semua metode lain yang disebutkan dalam jawaban untuk pertanyaan ini dengan kode yang tersedia untuk umum . Ini termasuk klaim @Matthias Schmidtblaicher termasuk kesenjangan sebelum dan sesudah data pengujian. Juga, saya hanya meringkas makalahnya. Kesimpulan aktual dari makalah ini melibatkan pohon keputusan untuk mengevaluasi model deret waktu!

Seanny123
sumber