Tahmin doğruluğu hesaplama


9

Zaman serisi verilerini tahmin etmek için STL (R uygulaması) kullanıyoruz.

Her gün günlük tahminler yapıyoruz. Tahmin değerlerini gerçek değerlerle karşılaştırmak ve ortalama sapmayı belirlemek istiyoruz. Örneğin, yarın için tahmin çalıştırdık ve tahmin puanları aldık, bu tahmin puanlarını yarın elde edeceğimiz gerçek verilerle karşılaştırmak istiyoruz. Tahmin değerlerinin ve gerçek verilerin çoğu zaman eşleşmeyebileceğini biliyorum, bu da her gün ne kadar doğru olduğumuzu takip etmek istememizin nedenlerinden biri.

Şimdi bu sorunu çözmek için en iyi yaklaşımın ne olduğunu belirlemeye çalışıyoruz? herhangi bir yardım işaretçisi takdir edilecektir.

Tahmin doğruluğu sorusunu ölçme konusuna baktım , ancak doğruluğu gerçek değerlerle hesaplamak yerine modelleri karşılaştırmakla ilgili gibi görünüyor.

R'de doğruluk işlevi uygulamasına baktım , ancak iki soru ile karıştırdım:

1) Gerçek verilerle tahmin verileri üzerinde çalışacak mı, çünkü öğreticilerin çoğu "test verileri" ile "tahmin verileri"

2) Doğruluk fonksiyonunun ortaya çıktığı, sapma yüzdesi yerine değer dizisidir.


1
Harika bir cevap almak için doğru soruyu sormalısınız - bu sinir bozucu olabilir. Herkes dünyaya hükmetmek ister ve bu öngörü gerektirir. Eğer yarın stokları hakkında mükemmel bir bilgi vardı ama bugün olsaydı o zaman bir ton para / güç / fırsat / zafer / vb yapabilir. Sorununuza bakıyordum, o zaman tahmin hatasının histogramını (ya da eCDF'sini) görmek isterdim. Tahmin girişlerini "sarsmak", ortalamasına ve varyasyonuna bakmak ve hatayı bunlarla karşılaştırmak isteyebilirim. Düzeltmek için hatanızı anlamalısınız.
EngrStudent

1
Deneyimsiz olanlar için STL nedir?
shadowtalker

@EngrStudent: "Düzeltmek için hatayı anlamalısın" - Bu ifadenin kendisinde iki bölüm var. İlk bölümün kendisi için olası yaklaşımları bulmaya çalışıyorum.
Seçtiğim

1
Ortalama, bir sistemin nasıl davrandığıyla aynı şey değildir. Standart sapma, bir sistemin nasıl davrandığıyla aynı şey değildir. Bu iki ölçüm, ölçülen sistem davranışı için özet istatistiklerdir. Hata doğruluk değildir. Hata belirsizlik değildir. Bu iki ölçüm, ortalamaya ve standart sapmaya benzer hata için özet istatistiklerdir. Sistem davranışı ölçülerinin birçok sonsuzluğu gibi, hata davranışı ölçülerinin birçok sonsuzluğu vardır. Dereceniz nedir? hatayı düşünmenin iyi bir yolunu nasıl ölçersiniz?
EngrStudent

1
@ Nambari - "bilge" dünyasına hoş geldiniz. Bilginin başlangıcı, hiçbir şey bilmediğinizi bilmektir - öğrenci olmak. Her zaman kendimi öğrenmeye ve gerçeği konuşan herkes tarafından düzeltilebilir olmaya çalışırım. Eureqa aracıyla oynarsanız ve hem "hedef ifade" nin her genel biçimini ve her "hata metriğini" uygun örnek verileri denerseniz, bu derin derin şeyi öğrenmeye başlayacaksınız. İyi bir cevabım yok. L'Hospital (diğer adıyla L'Hopital) 1696'da ilk en küçük kareli ifadeyi formüle etti. İyi bir başlangıç ​​kullanım örneği - aklın nereye geldiği. Bu nedir?
EngrStudent

Yanıtlar:


13

Tahmin doğruluğunu ölçmenin birçok farklı yolu vardır ve accuracy()R çıktıları için tahmin paketinden gelen işlev bunlardan birkaçını sağlar. "Sapma yüzdesi" hakkındaki yorumunuzdan, sağlanan önlemlerden biri olan Ortalama Mutlak Yüzde Hatası'nı kullanmak istediğiniz anlaşılıyor accuracy(). Tahmin doğruluğunun en yaygın ölçüleri burada tartışılmaktadır . MAPE'nin sorununuz için en uygun önlem olup olmadığını veya diğer önlemlerden birinin daha iyi olup olmadığını düşünmek isteyebilirsiniz.

accuracy()Fonksiyonu gerçek veriler üzerinde çalışır. "Test verileri", tahminleri oluşturmak için kullanılmayan verilerdir. Bazen kullanılabilirler, ancak tahminler hesaplandığında kullanılmazlar (verilerin klasik eğitim ve test setlerine bölünmesi). Diğer durumlarda, mevcut tüm veriler tahminleri hesaplamak için kullanılır ve daha sonra test verisi olarak kullanılabilecek gelecekteki gözlemler olana kadar beklemeniz gerekir.

Öyleyse f, tahminlerin xbir vektörüyse ve aynı zamanlara karşılık gelen gözlemlerin bir vektörüyse,

accuracy(f,x)

istediğini yapacak.


"Yüzde hatalarına dayalı ölçümler, ilgili dönemde herhangi bir i için yi = 0 ise sonsuz veya tanımsız olmanın ve herhangi bir yi sıfıra yakın olduğunda aşırı değerlere sahip olma dezavantajına sahiptir." Benim durumumda bu sorun olacağını düşünüyorum, çünkü birçok gerçekler SIFIR olabilir. MAE hesaplamak ve sonuç sayısını "yüzde" değiştirmek düşünüyorum. Mantıklı geliyor?
kosa

Bir şekilde teşekkür notum gitti, zaman ayırdığınız için gerçekten teşekkür ederim Dr Hyndman!
kosa

2

İlk olarak, doğruluk ve kesinlik kavramları olduğunu açıklığa kavuşturalım. Doğruluk genellikle bir sapma ile ilişkilidir, yani tahminin gerçeklerden sistematik sapması. Kesinlik genellikle tahmin hatalarının varyansı ile ilişkilidir. Bunun gibi bir şey:Accuracy=E(f)y vs. Precision=Var[fy]. Peki, yazınızda "doğruluk" dan bahsettiğinizde, bu ayrımın farkında mıydınız?

İkincisi, tahmin kalitesi gibi entegre önlemler vardır. MSFE=1ni=1n(fiyi)2, nerede fi ve yitahminler ve gerçeklerdir. Bu ölçü için, parametre sabitliği için Chow testi gibi istatistikler vardır.


Cevabın için teşekkür ederim! Evet, şu anda hassasiyet konusunda endişelenmiyorum. Sadece doğruluk, "tahmin gerçeklerden sapma" bilmek istiyorum. Birkaç model çalıştırmak tahmin hataları hesaplamak ve en iyi modeli seçmek hakkında endişelenmiyorum. Tek amacım, gerçek ve öngörülen değerler arasındaki sapmayı bulmak. Modelimiz burada sabit. Veri setimiz için modelimizin iyi ya da kötü olmasına bakılmaksızın, sadece sapma sayısına ihtiyacımız var. Bu soru, parametre ince ayarı (veya) modeli seçimiyle ilgili değildir. Umarım şimdi açıkımdır. Eksik bir şey varsa lütfen bana bildirin.
kosa

@ Nambari, "sapma sayısına" ihtiyacınız varsa, neden sapma sayısını kullanmıyorsunuz? Tahminler üzerinde bir döngü yapın, bunları gerçek değerlerle karşılaştırın ve tahminlerin gerçek değerlerden farklı olduğu vaka sayısını sayın.
Roman

2

Ben burada R yapıyorum burada benim örnek hem de örnek dışı veriler için verilerim için benim kod:

#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")

Umarım bu biraz yardımcı olur. tam kodumu istiyorsanız bu çalıştırmak için kullanılan lütfen bu çok temel olarak isteyin


1

Kısa cevap: tahminlerinizin kalitesini değerlendirmek için, modelinizin eğitiminde (uydurma) kullandığınız önlemin aynısını kullanın.

Uzun cevap:

Tahminlerinizin doğruluğu için bir ölçü seçmek için, ilk olarak size tahminleri nasıl yorumladığınızı bilmeniz gerekir. Başka bir deyişle, aslında bir "tahmin" olarak ne veriyorsunuz? Ortalama değer mi? Medyan? En olası değer? Bu sorunun cevabı, tahmin doğruluğunun ölçüsünü benzersiz bir şekilde tanımlayacaktır. Ortalamayı tahmin ederseniz, tahmin doğruluğunun ölçüsü olarak kök ortalama kare sapmasını kullanmanız gerekir. Ortanca tahmin ederseniz, doğruluk ölçüsü olarak ortalama mutlak sapma kullanmanız gerekir.

Bu noktada biraz ayrıntıya gireceğim. Yarın için bir tahmin / tahmin yaptığınızı varsayalım. Diyelim ki, yarın gözlemleyebileceğiniz herhangi bir değer için karşılık gelen bir olasılık gözlemlenecektir. Örneğin, 0.03 olasılıkla 1, 0.07 olasılıkla 2, 0.11 olasılıkla 3 ve benzerlerini gözlemleyebileceğinizi bilirsiniz. Yani, olasılıkların farklı değerler üzerinde bir dağılımına sahipsiniz. Bu dağılımı alarak farklı özellikleri hesaplayabilir ve bunları "tahminleriniz" olarak verebilirsiniz. Ortalamayı hesaplayabilir ve yarın için tahmin olarak verebilirsiniz. Alternatif olarak, tahmini olarak medyan kullanabilirsiniz. Ayrıca en olası değeri bulabilir ve yarın için tahmininiz olarak verebilirsiniz.

Tahmin olarak ortalama değeri kullanırsanız, "tahminimin doğruluğunun nasıl ölçüleceği" sorusunun yerine "ortalamanın doğruluğunun ölçüsü nedir?" Sorusunun yerine cevap verilmelidir. gerçek değerler ve tahminler ". Tahmin olarak medyan kullanırsanız, ortalama mutlak sapma kullanmanız gerekir.

Medyan mı yoksa ortalama mı yoksa başka bir şey mi kullandığınızı bilmiyor olabilirsiniz. Tahmin olarak gerçekte ne kullandığınızı öğrenmek için, eğitimde hangi önlemi en aza indirmeye çalıştığınızı bilmelisiniz. Modelin, egzersiz verilerinden tahminler ve hedef değerler arasındaki kök ortalama kare sapmasını en aza indiren parametreleri bulmaya çalışırsanız, tahminlerinizin ortalama olarak ele alınması gerekir. Mutlak sapmaları en aza indirirseniz, modelinizi medyanlar ve benzeri sağlamak için eğitirsiniz.

KATMA

Bir şeyi vurgulamak istiyorum. Yukarıda bahsettiğim gibi, aynı doğruluk ölçüsünü "uyum" ve "tahmin" içinde tutmak önemlidir. Buna ek olarak, önlemlerinizi seçme konusunda tamamen özgür olduğunuzu söylemek istiyorum. "Daha iyi" veya "daha kötü" önlemler yoktur. Hesaplama sizin (veya müşterinizin) tahminlerinizi kullanma şeklinize göre belirlenmelidir. Örneğin (sizin veya müşteriniz için) tam bir eşleşmenin olması çok önemli olabilir ve eğer buna sahip değilseniz, gerçek ve öngörülen değerler arasındaki fark büyük veya küçükse herhangi bir rol oynamaz. Diğer durumlarda bu fark rol oynar. 1 farkı 2 farkından daha iyidir. Bazı durumlarda 2 farkı 1 farkından 2 kat daha kötüdür. Diğer durumlarda 2'ye eşit olan fark, 1'e eşit olandan 100 kat daha kötüdür. Ayrıca gözlemlerden farklı bir değer üretmeniz gereken egzotik vakaları da hayal edebilirsiniz. Yani, ürettiğiniz sayıların kalite ölçüsü, ihtiyacınız olan şeye bağlı olarak, istediğiniz her şey olabilir. Önemli olan, aynı önlemin tahminlerde (uyum) eğitimde ve değerlendirmede kullanılmasıdır.


(Diğer cevap hakkındaki yorumunuzla ilgili) Çoğu durumda tahminler gerçek değerlerden farklıdır, her durumda mükemmel uyum sağlayabileceğimizi düşünmüyorum. Bu nedenle, önerdiğiniz yaklaşım ideal olmayabilir, çünkü% 100 alacağız. Ama düşündüğüm, gerçek vs tahmin yüzdesi arasındaki farkı elde etmek, bu da MAPE'den başka bir şey değil. Ele aldığımız durum, koşullar nedeniyle ZERO'yu çok sık gerçekleştirme şansı yüksek, bu durumda MAPE en iyi seçenek olmayabilir, çünkü yüzde INFINITY olacaktır. Burada sıkışıp kaldım.
kosa

MAPE'nin prensipte istediğim olduğunu biliyorum, ancak veri setimdeki talihsiz bir durum var, burada serideki GERÇEK değerler SIFIR olabilir.
kosa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.