การคำนวณความแม่นยำในการพยากรณ์


9

เรากำลังใช้ STL (การนำไปใช้ R) สำหรับการคาดการณ์ข้อมูลอนุกรมเวลา

ทุกวันเราเรียกใช้การคาดการณ์รายวัน เราต้องการเปรียบเทียบค่าพยากรณ์กับค่าจริงและระบุค่าเบี่ยงเบนเฉลี่ย ตัวอย่างเช่นเรารันการคาดการณ์ในวันพรุ่งนี้และได้รับคะแนนการพยากรณ์เราต้องการเปรียบเทียบคะแนนการคาดการณ์เหล่านี้กับข้อมูลจริงที่เราจะได้รับในวันพรุ่งนี้ ฉันทราบว่าการคาดการณ์ค่าและข้อมูลจริงอาจไม่ตรงกับเวลาส่วนใหญ่นั่นคือเหตุผลหนึ่งที่เราต้องการติดตามว่าเรามีความแม่นยำมากแค่ไหนในแต่ละวัน

ตอนนี้เราพยายามระบุว่าวิธีใดที่ดีที่สุดในการแก้ปัญหานี้ ตัวชี้ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

ฉันดูที่การวัดคำถามความแม่นยำในการคาดการณ์แต่ดูเหมือนว่าจะเกี่ยวข้องกับการเปรียบเทียบแบบจำลองมากกว่าการคำนวณความแม่นยำด้วยค่าจริง

ฉันดูการใช้งานฟังก์ชันความแม่นยำใน Rแต่สับสนกับสองคำถาม:

1) มันจะทำงานกับข้อมูลจริงเทียบกับข้อมูลการคาดการณ์หรือไม่เพราะการสอนส่วนใหญ่พูดว่า "ข้อมูลการทดสอบ" กับ "ข้อมูลการคาดการณ์"

2) ดูเหมือนว่าฟังก์ชั่นความแม่นยำที่ออกมานั้นมีอาร์เรย์ของค่ามากกว่า% ของการเบี่ยงเบน


1
เพื่อให้ได้คำตอบที่ดีคุณต้องถามคำถามที่ถูกต้องซึ่งอาจทำให้คุณหงุดหงิด ทุกคนต้องการปกครองโลกและรู้ล่วงหน้า ถ้าฉันมีความรู้ที่สมบูรณ์แบบเกี่ยวกับหุ้นในวันพรุ่งนี้ แต่มีวันนี้ฉันสามารถทำเงิน / พลังงาน / โอกาส / เกียรติ / ฯลฯ ได้มากมาย หากฉันกำลังมองปัญหาของคุณฉันก็อยากเห็นฮิสโตแกรม (หรือ eCDF) ของข้อผิดพลาดที่คาดเดาได้ ฉันอาจต้องการ "กระวนกระวายใจ" ปัจจัยการผลิตของการคาดการณ์และดูที่ความหมายและการเปลี่ยนแปลงและเปรียบเทียบข้อผิดพลาดเหล่านั้น คุณต้องเข้าใจข้อผิดพลาดของคุณเพื่อแก้ไข
EngrStudent

1
สำหรับมือใหม่ STL คืออะไร
shadowtalker

@EngrStudent: "คุณต้องเข้าใจข้อผิดพลาดของคุณเพื่อแก้ไขมัน" - ในคำสั่งนี้เองเรามีสองส่วน ฉันกำลังพยายามค้นหาวิธีที่เป็นไปได้สำหรับส่วนแรกเอง วิธีการที่ผมเลือกจะช่วยให้ผมในการเลือกกลยุทธ์ในการเป็นส่วนหนึ่ง 2.
โฆษะ

1
ค่าเฉลี่ยนั้นไม่เหมือนกับระบบที่ใช้งาน ค่าเบี่ยงเบนมาตรฐานไม่เหมือนกับระบบที่ใช้งานมาตรการสองรายการนี้คือสถิติสรุปสำหรับพฤติกรรมระบบที่วัดได้ ข้อผิดพลาดไม่ถูกต้อง ข้อผิดพลาดไม่แน่นอน มาตรการทั้งสองนั้นเป็นสถิติสรุปสำหรับข้อผิดพลาดที่คล้ายคลึงกับค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐาน เช่นเดียวกับที่มีจำนวนอนันต์ของมาตรการของพฤติกรรมของระบบมีจำนวนอนันต์ของมาตรการของพฤติกรรมที่ผิดพลาด รูบริกของคุณคืออะไร? คุณจะวัดความผิดพลาดได้อย่างไร
EngrStudent

1
@Nambari - ยินดีต้อนรับสู่โลกแห่ง "ปัญญา" จุดเริ่มต้นของความรู้คือการรู้ว่าคุณไม่รู้อะไร - เป็นนักเรียน ฉันพยายามที่จะเรียนรู้อยู่เสมอและพยายามที่จะแก้ไขโดยใครก็ตามที่พูดความจริง หากคุณเล่นด้วยเครื่องมือ Eureqa และลองใช้ข้อมูลตัวอย่างที่เหมาะสมทั้ง "นิพจน์เป้าหมาย" และ "ข้อผิดพลาดการวัด" ทุกรูปแบบจากนั้นคุณจะเริ่มรู้สิ่งที่ลึกนี้ ฉันไม่มีคำตอบที่ดี L'Hospital (aka L'Hopital) ได้สร้างสูตรการแสดงออกกำลังสองน้อยที่สุดครั้งแรกในปี 1696 การเริ่มต้นที่ดีคือกรณีการใช้งาน - เมื่อจิตใจเข้ามาสิ่งนั้นคืออะไร?
EngrStudent

คำตอบ:


13

มีวิธีการวัดความแม่นยำในการพยากรณ์ที่แตกต่างกันมากมายและaccuracy()ฟังก์ชั่นจากแพ็คเกจพยากรณ์สำหรับเอาต์พุต R หลายวิธี จากความคิดเห็นของคุณเกี่ยวกับ "% ของการเบี่ยงเบน" ดูเหมือนคุณต้องการที่จะใช้ค่าเฉลี่ยของ Absolute accuracy()เปอร์เซ็นต์ความผิดพลาดซึ่งเป็นหนึ่งในมาตรการที่มีให้โดย มาตรการที่พบมากที่สุดของความถูกต้องคาดการณ์จะกล่าวถึงที่นี่ คุณอาจต้องการคิดว่า MAPE เป็นมาตรการที่เหมาะสมที่สุดสำหรับปัญหาของคุณหรือไม่หรือว่ามาตรการอื่น ๆ ดีกว่า

accuracy()ฟังก์ชั่นการทำงานกับข้อมูลจริง "ข้อมูลการทดสอบ" คือข้อมูลที่ไม่ได้ใช้ในการสร้างการคาดการณ์ บางครั้งมีให้ใช้ แต่ไม่ได้ใช้เมื่อคำนวณการคาดการณ์ (การแยกข้อมูลแบบดั้งเดิมในชุดการฝึกอบรมและการทดสอบ) ในสถานการณ์อื่น ๆ ข้อมูลที่มีอยู่ทั้งหมดจะใช้ในการคำนวณการคาดการณ์แล้วคุณจะต้องรอจนกว่าจะมีการสังเกตในอนาคตที่จะใช้เป็นข้อมูลการทดสอบ

ดังนั้นหากfเป็นเวกเตอร์ของการคาดการณ์และxเป็นเวกเตอร์ของการสังเกตที่สอดคล้องกับเวลาเดียวกัน

accuracy(f,x)

จะทำในสิ่งที่คุณต้องการ


"มาตรการตามเปอร์เซ็นต์ความผิดพลาดมีข้อเสียของการไม่มีที่สิ้นสุดหรือไม่ได้กำหนดถ้า yi = 0 สำหรับ i ใด ๆ ในช่วงเวลาที่น่าสนใจและมีค่ามากเมื่อ yi ใด ๆ ใกล้เคียงกับศูนย์" ฉันคิดว่านี่จะเป็นปัญหาในกรณีของฉันเพราะมีหลายกรณีที่เกิดขึ้นจริงอาจเป็นศูนย์ ฉันกำลังคิดคำนวณแม่และเปลี่ยนหมายเลขผลลัพธ์เป็น "เปอร์เซ็นต์" มันสมเหตุสมผลหรือไม่
kosa

ยังไงก็ตามขอบคุณทราบของฉันหายไปขอบคุณจริงๆสำหรับเวลาของคุณดร. Hyndman!
kosa

2

ก่อนอื่นขออธิบายว่ามีแนวคิดเรื่องความถูกต้องและความแม่นยำ ความแม่นยำมักเกี่ยวข้องกับอคติคือการเบี่ยงเบนอย่างเป็นระบบของการคาดการณ์จากของจริง ความแม่นยำมักเกี่ยวข้องกับความแปรปรวนของข้อผิดพลาดการคาดการณ์ บางสิ่งเช่นนี้AยูRaY=E()-Y เมื่อเทียบกับ PRอีผมsผมโอn=VaR[-Y]. ดังนั้นเมื่อคุณพูดถึง "ความถูกต้อง" ในโพสต์ของคุณคุณตระหนักถึงความแตกต่างหรือไม่

ประการที่สองมีมาตรการการรวมคุณภาพการคาดการณ์เช่น MSFE=1nΣผม=1n(ผม-Yผม)2ที่ไหน ผม และ Yผมคือการพยากรณ์และตามจริง มีสถิติสำหรับการวัดนี้เช่นการทดสอบ Chow สำหรับความมั่นคงของพารามิเตอร์


ขอบคุณสำหรับคำตอบ! ใช่ฉันไม่กังวลเกี่ยวกับความแม่นยำในขณะนี้ เพียงแค่ต้องการทราบความถูกต้อง "การเบี่ยงเบนของการคาดการณ์จากของจริง" ฉันไม่ต้องกังวลเกี่ยวกับการเรียกใช้แบบจำลองสองสามตัวคำนวณข้อผิดพลาดในการคาดการณ์ เป้าหมายเดียวของฉันคือค้นหาการเบี่ยงเบนระหว่างค่าจริงและที่คาดการณ์ไว้ แบบจำลองของเราคงที่ที่นี่ ไม่ว่าโมเดลของเราจะดีหรือไม่ดีสำหรับชุดข้อมูลเราแค่ต้องการค่าเบี่ยงเบน คำถามนี้ไม่เกี่ยวข้องกับการเลือกปรับแต่งพารามิเตอร์แบบละเอียด (หรือ) ฉันหวังว่าตอนนี้ฉันชัดเจน โปรดแจ้งให้เราทราบหากมีสิ่งใดขาดหายไป
kosa

@Nambari ถ้าคุณต้องการ "จำนวนการเบี่ยงเบน" ทำไมคุณไม่ใช้จำนวนการเบี่ยงเบนล่ะ? ทำการวนซ้ำการคาดการณ์เปรียบเทียบกับค่าจริงและนับจำนวนกรณีที่การทำนายแตกต่างจากค่าจริง
โรมัน

2

ฉันได้ทำสิ่งนี้ใน R ที่นี่คือรหัสของฉันสำหรับข้อมูลของฉันสำหรับข้อมูลทั้งในตัวอย่างและนอกตัวอย่าง:

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

หวังว่านี่จะช่วยได้นิดหน่อย หากคุณต้องการรหัสเต็มของฉันฉันใช้ในการทำงานนี้โปรดถามเพราะนี่เป็นพื้นฐานมาก


1

คำตอบสั้น ๆ : ในการประเมินคุณภาพของการทำนายของคุณให้ใช้การวัดเดียวกันกับที่คุณใช้ในการฝึกอบรม (เหมาะสม) ของแบบจำลอง

คำตอบที่ยาว:

ในการเลือกการวัดความถูกต้องของการคาดการณ์ของคุณคุณต้องรู้วิธีตีความการคาดการณ์ของคุณก่อน กล่าวอีกนัยหนึ่งคุณให้อะไรในฐานะ "การคาดการณ์" มันหมายถึงคุณค่าหรือไม่ Median? ค่าที่เป็นไปได้มากที่สุด? คำตอบสำหรับคำถามนี้จะระบุการวัดความแม่นยำในการคาดการณ์ หากคุณทำนายค่าเฉลี่ยคุณต้องใช้ค่าเบี่ยงเบนสแควร์รูทแบบเฉลี่ยเพื่อวัดความแม่นยำในการคาดการณ์ หากคุณทำนายค่ามัธยฐานคุณจะต้องใช้ค่าเบี่ยงเบนสัมบูรณ์เป็นค่าความแม่นยำ

ฉันจะอธิบายรายละเอียดเล็กน้อยในจุดนี้ ให้เราสมมติว่าคุณทำการคาดการณ์ / พยากรณ์สำหรับวันพรุ่งนี้ ให้เราสมมติว่าสำหรับค่าใด ๆ ที่คุณอาจสังเกตได้ในวันพรุ่งนี้คุณมีความน่าจะเป็นที่จะต้องปฏิบัติตาม ตัวอย่างเช่นคุณรู้ว่าคุณอาจสังเกต 1 ด้วยความน่าจะเป็น 0.03, 2 กับความน่าจะเป็น 0.07, 3 กับความน่าจะเป็น 0.11 และอื่น ๆ ดังนั้นคุณมีการกระจายของความน่าจะเป็นที่แตกต่างกัน มีการกระจายนี้คุณสามารถคำนวณคุณสมบัติที่แตกต่างและให้พวกเขาเป็น "การคาดการณ์" ของคุณ คุณสามารถคำนวณค่าเฉลี่ยและให้มันเป็นคำทำนายสำหรับวันพรุ่งนี้ หรือคุณสามารถใช้ค่ามัธยฐานเป็นคำทำนายของคุณ นอกจากนี้คุณยังสามารถค้นหามูลค่าที่น่าจะเป็นไปได้มากที่สุดและใช้เป็นค่าทำนายสำหรับวันพรุ่งนี้

หากคุณใช้ค่าเฉลี่ยเป็นการทำนายกว่าคำถามของ "วิธีการวัดความแม่นยำของการทำนายของฉัน" จะต้องถูกแทนที่ด้วย "การวัดความแม่นยำสำหรับค่าเฉลี่ย" คืออะไรและคำตอบคือ "รูตเฉลี่ยเบี่ยงเบนระหว่าง คุณค่าและการทำนายที่แท้จริง ". หากคุณใช้ค่ามัธยฐานเป็นคำทำนายคุณต้องใช้ค่าเบี่ยงเบนสัมบูรณ์แบบเฉลี่ย

อาจเป็นได้ว่าคุณไม่ทราบว่าคุณใช้ค่ามัธยฐานหรือค่าเฉลี่ยหรืออย่างอื่น ในการค้นหาสิ่งที่คุณใช้จริง ๆ เป็นการคาดการณ์คุณต้องทราบว่าคุณพยายามลดขนาดการฝึกอบรมให้น้อยที่สุด หากคุณพยายามหาพารามิเตอร์ของแบบจำลองที่ลดค่าเบี่ยงเบนของค่าเฉลี่ยรากที่สองระหว่างการทำนายและค่าเป้าหมายจากข้อมูลการฝึกอบรมการคาดการณ์ของคุณจะต้องถือว่าเป็นค่าเฉลี่ย หากคุณลดการเบี่ยงเบนสัมบูรณ์ให้น้อยที่สุดคุณจะฝึกฝนโมเดลของคุณเพื่อให้สื่อกลางและอื่น ๆ

ADDED

ฉันต้องการเน้นสิ่งหนึ่ง ดังที่ฉันได้กล่าวไว้ข้างต้นเป็นสิ่งสำคัญที่จะต้องรักษาความแม่นยำในระดับ "พอดี" และ "ทำนาย" นอกจากนั้นฉันอยากจะบอกว่าคุณมีอิสระในการเลือกมาตรการของคุณ ไม่มีมาตรการ "ดีกว่า" หรือ "แย่ลง" การวัดควรพิจารณาจากวิธีที่คุณ (หรือลูกค้าของคุณ) ใช้การคาดการณ์ของคุณ ตัวอย่างเช่นมันอาจมีความสำคัญมาก (สำหรับคุณหรือลูกค้าของคุณ) ที่จะมีการจับคู่ที่ตรงกันและหากคุณไม่มีมันจะไม่เล่นบทบาทใด ๆ หากความแตกต่างระหว่างค่าจริงและค่าคาดการณ์มีขนาดใหญ่หรือเล็ก ในกรณีอื่นความแตกต่างนี้มีบทบาท ความแตกต่างของ 1 จะดีกว่าความแตกต่างของ 2 ในบางกรณีความแตกต่างของ 2 คือ 2 เวลาแย่กว่า 1 ในกรณีอื่น ๆ ความแตกต่างที่มีค่าเท่ากับ 2 นั้นเลวร้ายยิ่งกว่าความแตกต่างที่เท่ากับ 1 100 เท่าคุณสามารถจินตนาการกรณีที่แปลกใหม่ซึ่งคุณต้องสร้างค่าที่แตกต่างจากการสังเกตการณ์ ดังนั้นการวัดคุณภาพของตัวเลขที่คุณสร้างขึ้นอาจเป็นสิ่งที่คุณต้องการขึ้นอยู่กับสิ่งที่คุณต้องการ สิ่งสำคัญคือการใช้มาตรการเดียวกันในการฝึกอบรม (แบบเต็ม) และการประเมินผลการทำนาย


(ที่เกี่ยวข้องกับความคิดเห็นของคุณเกี่ยวกับคำตอบอื่น ๆ ) ในกรณีส่วนใหญ่การคาดการณ์ที่แตกต่างจากค่าจริงฉันไม่คิดว่าในกรณีใด ๆ เราสามารถได้รับที่สมบูรณ์แบบ ดังนั้นวิธีที่คุณแนะนำอาจไม่เหมาะเพราะเราจะได้ 100% แต่สิ่งที่ฉันคิดคือได้รับความแตกต่างระหว่างการคาดการณ์ที่เกิดขึ้นจริงกับการทำนายเป็นเปอร์เซ็นต์ซึ่งไม่ใช่อะไรนอกจาก MAPE กรณีที่เราจัดการอยู่นั้นมีโอกาสสูงมากที่จะได้รับค่าศูนย์จริงบ่อยมากเนื่องจากสถานการณ์ซึ่งในกรณีนี้ MAPE อาจไม่ใช่ตัวเลือกที่ดีที่สุดเพราะเปอร์เซ็นต์จะเป็น INFINITY นี่คือที่ฉันติดอยู่
kosa

ฉันรู้ว่า MAPE เป็นหนึ่งในหลักการที่ฉันต้องการ แต่ชุดข้อมูลของฉันมีกรณีที่โชคร้ายที่ค่าจริงในซีรีส์สามารถเป็นศูนย์ได้บ่อยครั้งมาก
kosa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.