Perhitungan akurasi ramalan

9

Kami menggunakan STL (implementasi R) untuk memperkirakan data deret waktu.

Setiap hari kami menjalankan ramalan harian. Kami ingin membandingkan nilai perkiraan dengan nilai nyata dan mengidentifikasi penyimpangan rata-rata. Misalnya, kami menjalankan ramalan untuk besok dan mendapatkan poin perkiraan, kami ingin membandingkan poin ramalan ini dengan data nyata yang akan kami peroleh besok. Saya menyadari bahwa nilai perkiraan dan data nyata mungkin tidak cocok dengan sebagian besar waktu, itulah salah satu alasan kami ingin melacak seberapa akurat kami setiap hari.

Sekarang kami mencoba mengidentifikasi apa pendekatan terbaik untuk menyelesaikan masalah ini? petunjuk bantuan akan dihargai.

Saya melihat Mengukur pertanyaan akurasi ramalan , tetapi tampaknya ini terkait dengan membandingkan model daripada menghitung akurasi dengan nilai nyata.

Saya melihat implementasi fungsi akurasi dalam R , tetapi bingung dengan dua pertanyaan:

1) Apakah ini akan bekerja pada data nyata vs data perkiraan, karena sebagian besar tutorial mengatakan "data uji" vs "data perkiraan"

2) Tampaknya fungsi akurasi adalah susunan nilai, bukan% dari penyimpangan.

kosa
sumber
1
Untuk mendapatkan jawaban yang bagus, Anda harus mengajukan pertanyaan yang tepat - dan itu bisa membuat frustrasi. Semua orang ingin menguasai dunia dan itu membutuhkan pengetahuan sebelumnya. Jika saya memiliki pengetahuan sempurna tentang stok besok tetapi memilikinya hari ini maka saya bisa menghasilkan banyak uang / kekuatan / peluang / kejayaan / dll. Jika saya melihat masalah Anda maka saya ingin melihat histogram (atau eCDF) dari kesalahan prediksi. Saya mungkin ingin "jitter" input ramalan dan melihat rerata dan variasinya, dan membandingkan kesalahan dengan itu. Anda harus memahami kesalahan Anda untuk memperbaikinya.
EngrStudent
1
Untuk yang belum tahu, apa itu STL?
shadowtalker
@EngrStudent: "Anda harus memahami kesalahan Anda untuk memperbaikinya" - Dalam pernyataan ini sendiri kami memiliki dua bagian. Saya mencoba mencari tahu kemungkinan pendekatan untuk bagian pertama itu sendiri. Metodologi yang saya pilih akan membantu saya dalam memilih strategi untuk bagian 2.
kosa
1
Berarti tidak sama dengan bagaimana suatu sistem berperilaku. Standar deviasi tidak sama dengan bagaimana suatu sistem berperilaku. Dua ukuran tersebut adalah statistik ringkasan untuk perilaku sistem yang diukur. Kesalahan bukan akurasi. Kesalahan bukanlah ketidakpastian. Kedua ukuran tersebut adalah statistik ringkasan untuk kesalahan yang dianalogikan dengan mean dan standar deviasi. Seperti halnya ada banyak ukuran tak terbatas dari perilaku sistem, ada banyak tak terbatas ukuran perilaku yang salah. Apa rubrik Anda? bagaimana Anda mengukur cara berpikir yang baik tentang kesalahan?
EngrStudent
1
@Nambari - selamat datang di dunia "bijak". Awal pengetahuan adalah untuk mengetahui bahwa Anda tidak tahu apa-apa - untuk menjadi siswa. Saya berusaha untuk selalu belajar sendiri, dan mencoba untuk dikoreksi oleh siapa pun yang berbicara kebenaran. Jika Anda bermain dengan alat Eureqa, dan mencoba data sampel yang sesuai baik setiap bentuk umum "ekspresi target" dan setiap "metrik kesalahan" maka Anda akan mulai mengetahui hal yang mendalam ini. Saya tidak punya jawaban yang bagus. L'Hospital (alias L'Hopital) merumuskan ekspresi kuadrat pertama pada 1696. Awal yang baik adalah kasus penggunaan - di mana pikiran masuk. Apa itu?
EngrStudent

Jawaban:

13

Ada banyak cara untuk mengukur akurasi perkiraan, dan accuracy()fungsi dari paket perkiraan untuk R menghasilkan beberapa di antaranya. Dari komentar Anda tentang "% deviasi" sepertinya Anda ingin menggunakan Mean Persentase Absolut Kesalahan, yang merupakan salah satu langkah yang disediakan oleh accuracy(). Ukuran ketepatan perkiraan yang paling umum dibahas di sini . Anda mungkin ingin memikirkan apakah MAPE adalah ukuran yang paling tepat untuk masalah Anda, atau apakah salah satu dari ukuran lain lebih baik.

The accuracy()fungsi tidak bekerja pada data real. "Data uji" adalah data yang tidak digunakan untuk menyusun prakiraan. Kadang-kadang mereka tersedia tetapi tidak digunakan ketika ramalan dihitung (data klasik dibagi menjadi pelatihan dan set tes). Dalam situasi lain, semua data yang tersedia digunakan untuk menghitung ramalan, dan kemudian Anda harus menunggu sampai ada beberapa pengamatan di masa depan yang tersedia untuk digunakan sebagai data uji.

Jadi jika fmerupakan vektor prakiraan dan xmerupakan vektor pengamatan yang sesuai dengan waktu yang sama, maka

accuracy(f,x)

akan melakukan apa yang Anda inginkan.

Rob Hyndman
sumber
"Ukuran berdasarkan kesalahan persentase memiliki kelemahan yaitu tidak terbatas atau tidak terdefinisi jika yi = 0 untuk setiap i dalam periode bunga, dan memiliki nilai ekstrim ketika setiap yi mendekati nol." Saya pikir ini akan menjadi masalah dalam kasus saya, karena banyak kasus sebenarnya bisa NOL. Saya berpikir menghitung MAE dan mengubah jumlah hasil menjadi "persentase". Apakah masuk akal?
kosa
Entah bagaimana catatan terima kasih saya hilang, sungguh terima kasih atas waktu Anda Dr. Hyndman!
kosa
2

Pertama, mari kita perjelas bahwa ada konsep akurasi dan presisi. Akurasi biasanya dikaitkan dengan bias, yaitu penyimpangan sistematis dari ramalan dari aktual. Presisi biasanya dikaitkan dengan varian kesalahan ramalan. Sesuatu seperti ini: vs . Jadi, ketika Anda menyebutkan "akurasi" di posting Anda, apakah Anda tahu perbedaannya?P r e c i s i o n = V a r [ f - y ]Accuracy=E(f)yPrecision=Var[fy]

Kedua, ada langkah-langkah terpadu kualitas perkiraan, seperti , di mana dan adalah prakiraan dan aktual. Ada statistik untuk ukuran ini, seperti tes Chow untuk parameter keteguhan.fiyiMSFE=1ni=1n(fiyi)2fiyi

Aksakal
sumber
Terimakasih untuk jawaban! Ya, saya tidak mengkhawatirkan presisi saat ini. Hanya ingin tahu keakuratan, "deviasi ramalan dari aktual". Saya tidak khawatir menjalankan beberapa model menghitung kesalahan perkiraan dan memilih model terbaik. Satu-satunya tujuan saya adalah mencari tahu penyimpangan antara nilai aktual dan perkiraan. Model kami konstan di sini. Terlepas dari model kami baik atau buruk untuk kumpulan data, kami hanya perlu jumlah penyimpangan. Pertanyaan ini tidak terkait dengan pemilihan model fine tuning parameter (atau). Saya harap sekarang saya jelas. Tolong beri tahu saya jika ada yang hilang.
kosa
@Nambari, jika Anda membutuhkan "jumlah penyimpangan", mengapa Anda tidak menggunakan jumlah penyimpangan? Buat lingkaran di atas prediksi, bandingkan dengan nilai-nilai nyata dan hitung jumlah kasus di mana prediksi berbeda dari nilai-nilai nyata.
Roman
2

Saya telah melakukan ini dalam R di sini adalah kode saya untuk data saya untuk data in-sample dan out-of-sample:

#accuracy testing for out-of-sample sample#

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
N<-head(M,-horiz)
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)

#Run your forecasting method#
##My forecasting method is arima##

N<-#data#
N<-ts(N,deltat=deltaT,start=startY)
N<-tail(N,horiz)
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY) #where Arimab is the ARIMA model and fArimab<-forecast(Arimab, h=horiz*2, simulate= TRUE, fan=TRUE)
N<-log(N)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA out sample")

#Accuracy testing for the in sample

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)
#run your forecasting method#
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY)
N<-exp(Nu)
fitted<-exp(fitted)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA in sample")

semoga ini sedikit membantu. jika Anda ingin kode lengkap saya digunakan untuk menjalankan ini, silakan tanyakan karena ini sangat mendasar

Summer-Jade Gleek'away
sumber
1

Jawaban singkatnya: untuk mengevaluasi kualitas prediksi Anda, gunakan ukuran yang persis sama dengan yang Anda gunakan dalam pelatihan (fitting) model Anda.

Jawaban panjangnya:

Untuk memilih ukuran untuk keakuratan perkiraan Anda, kebutuhan pertama Anda untuk mengetahui bagaimana Anda mengartikan prediksi Anda. Dengan kata lain, apa yang sebenarnya Anda berikan sebagai "ramalan"? Apakah ini berarti nilai? Median? Nilai yang paling mungkin? Jawaban atas pertanyaan ini akan secara unik mengidentifikasi ukuran akurasi perkiraan. Jika Anda memperkirakan mean, Anda harus menggunakan deviasi mean root kuadrat sebagai ukuran akurasi perkiraan. Jika Anda memperkirakan median, Anda harus menggunakan deviasi absolut rata-rata sebagai ukuran akurasi.

Saya akan menguraikan sedikit tentang hal ini. Biarkan kami berasumsi bahwa Anda membuat prediksi / ramalan untuk besok. Mari kita juga berasumsi bahwa untuk nilai apa pun yang mungkin Anda amati besok, Anda memiliki probabilitas yang sesuai untuk diamati. Misalnya Anda tahu bahwa Anda mungkin mengamati 1 dengan probabilitas 0,03, 2 dengan probabilitas 0,07, 3 dengan probabilitas 0,11, dan seterusnya. Jadi, Anda memiliki distribusi probabilitas atas nilai yang berbeda. Dengan distribusi ini Anda dapat menghitung berbagai properti dan memberikannya sebagai "prediksi" Anda. Anda dapat menghitung mean dan memberikannya sebagai prediksi untuk besok. Atau Anda dapat menggunakan median sebagai prediksi Anda. Anda juga dapat menemukan nilai yang paling memungkinkan dan memberikannya sebagai prediksi Anda untuk besok.

Jika Anda menggunakan nilai rata-rata sebagai prediksi, maka pertanyaan "bagaimana mengukur keakuratan prediksi saya" harus diganti dengan "apa ukuran akurasi untuk rata-rata" dan jawabannya adalah "root mean square deviasi antara nilai dan prediksi nyata ". Jika Anda menggunakan median sebagai prediksi, Anda harus menggunakan deviasi absolut berarti.

Mungkin Anda tidak tahu apakah Anda menggunakan median atau maksud atau sesuatu yang lain. Untuk mengetahui apa yang sebenarnya Anda gunakan sebagai prediksi, Anda harus tahu ukuran apa yang Anda coba kurangi dalam pelatihan. Jika Anda mencoba menemukan parameter dari model yang meminimalkan deviasi mean root kuadrat antara prediksi dan nilai target dari data pelatihan, maka prediksi Anda harus diperlakukan sebagai mean. Jika Anda meminimalkan penyimpangan absolut, maka Anda melatih model Anda untuk memberikan median dan sebagainya.

TAMBAH

Saya ingin menekankan satu hal. Seperti yang telah saya sebutkan di atas, penting untuk menjaga ukuran akurasi yang sama dalam "cocok" dan "prediksi". Selain itu saya ingin mengatakan bahwa Anda benar-benar bebas dalam memilih tindakan Anda. Tidak ada ukuran "lebih baik" atau "lebih buruk". Ukurannya harus ditentukan dengan cara Anda (atau klien Anda) menggunakan prediksi Anda. Misalnya mungkin sangat penting (untuk Anda atau klien Anda) untuk memiliki kecocokan yang tepat dan jika Anda tidak memilikinya, itu tidak memainkan peran apa pun jika perbedaan antara nilai riil dan prediksi adalah besar atau kecil. Dalam kasus lain, perbedaan ini berperan. Perbedaan 1 lebih baik daripada perbedaan 2. Dalam beberapa kasus perbedaan 2 adalah 2 kali lebih buruk daripada perbedaan 1. Dalam kasus lain, perbedaan sama dengan 2 adalah 100 kali lebih buruk daripada perbedaan sama dengan 1. Anda juga bisa membayangkan kasus-kasus eksotis di mana Anda perlu menghasilkan nilai yang berbeda dari pengamatan. Jadi, ukuran kualitas angka yang Anda hasilkan dapat menjadi apa pun yang Anda inginkan, tergantung pada apa yang Anda butuhkan. Yang penting, adalah menggunakan ukuran yang sama dalam pelatihan (fit) dan evaluasi prediksi.

Roma
sumber
(Terkait dengan komentar Anda pada jawaban lain) Dalam sebagian besar kasus, prediksi berbeda dari nilai sebenarnya, saya pikir dalam hal apa pun kita tidak bisa menjadi sangat cocok. Jadi, pendekatan yang Anda sarankan mungkin tidak ideal, karena kami akan mendapatkan 100%. Tapi yang saya pikirkan adalah mendapatkan perbedaan antara prediksi vs persentase aktual, yang tidak lain adalah MAPE. Kasus yang kami tangani memiliki peluang sangat tinggi untuk mendapatkan NOL yang sebenarnya sangat sering, karena keadaan, dalam hal ini MAPE mungkin bukan pilihan terbaik karena persentase akan menjadi INFINITY. Di sinilah saya terjebak.
kosa
Saya tahu MAPE adalah prinsip yang saya inginkan, tetapi kumpulan data saya memiliki kasus yang tidak menguntungkan ini di mana nilai-nilai NYATA dalam seri dapat NOL sangat sering.
kosa