Tính toán chính xác dự báo


9

Chúng tôi đang sử dụng STL (triển khai R) để dự báo dữ liệu chuỗi thời gian.

Mỗi ngày chúng tôi chạy dự báo hàng ngày. Chúng tôi muốn so sánh các giá trị dự báo với các giá trị thực và xác định độ lệch trung bình. Ví dụ: chúng tôi đã chạy dự báo cho ngày mai và có điểm dự báo, chúng tôi muốn so sánh các điểm dự báo này với dữ liệu thực mà chúng tôi sẽ có được vào ngày mai. Tôi biết rằng dự báo giá trị và dữ liệu thực có thể không khớp với hầu hết thời gian, đó là một trong những lý do chúng tôi muốn theo dõi mức độ chính xác của chúng tôi mỗi ngày.

Bây giờ chúng tôi đang cố gắng xác định phương pháp tốt nhất để giải quyết vấn đề này là gì? bất kỳ con trỏ trợ giúp sẽ được đánh giá cao.

Tôi đã xem xét câu hỏi đo lường độ chính xác dự báo , nhưng có vẻ như nó liên quan đến việc so sánh các mô hình hơn là tính toán độ chính xác với các giá trị thực.

Tôi đã xem xét triển khai chức năng chính xác trong R , nhưng bối rối với hai câu hỏi:

1) Nó có hoạt động trên dữ liệu thực so với dữ liệu dự báo không, vì hầu hết các hướng dẫn đều nói là "dữ liệu thử nghiệm" so với "dữ liệu dự báo"

2) Dường như chức năng chính xác là mảng các giá trị chứ không phải là% độ lệch.


1
Để có được câu trả lời tuyệt vời, bạn phải đặt câu hỏi đúng - và điều đó có thể gây nản lòng. Mọi người đều muốn thống trị thế giới và điều đó cần biết trước. Nếu tôi có kiến ​​thức hoàn hảo về cổ phiếu ngày mai nhưng có nó ngày hôm nay thì tôi có thể kiếm được rất nhiều tiền / sức mạnh / cơ hội / vinh quang / v.v. Nếu tôi đang xem xét vấn đề của bạn thì tôi muốn xem biểu đồ (hoặc eCDF) của lỗi dự đoán. Tôi có thể muốn "xáo trộn" các đầu vào của dự báo và xem xét ý nghĩa và biến thể của nó, và so sánh lỗi với các đầu vào. Bạn phải hiểu lỗi của bạn để sửa nó.
EngrStudent

1
Đối với người không quen biết, STL là gì?
Shadowtalker

@EngrStudent: "Bạn phải hiểu lỗi của mình để sửa lỗi" - Trong chính tuyên bố này, chúng tôi có hai phần. Tôi đang cố gắng tìm ra cách tiếp cận có thể cho chính phần đầu tiên. Phương pháp tôi chọn sẽ giúp tôi chọn chiến lược cho phần 2.
kosa

1
Có nghĩa là không giống như cách một hệ thống hành xử. Độ lệch chuẩn không giống như cách hệ thống hoạt động. Có hai biện pháp là thống kê tóm tắt cho hành vi hệ thống đo được. Lỗi không chính xác. Lỗi không phải là sự không chắc chắn. Hai biện pháp này là thống kê tóm tắt cho lỗi tương tự với độ lệch trung bình và độ lệch chuẩn. Cũng giống như có rất nhiều biện pháp hành vi hệ thống, có rất nhiều biện pháp hành vi lỗi. Phiếu tự đánh giá của bạn là gì? Làm thế nào để bạn đo lường một cách tốt để suy nghĩ về lỗi?
EngrStudent

1
@Nambari - Chào mừng bạn đến với thế giới của "người khôn ngoan". Khởi đầu của kiến ​​thức là biết rằng bạn không biết gì - trở thành một sinh viên. Tôi cố gắng luôn luôn tự học, và cố gắng để được sửa chữa bởi bất cứ ai nói sự thật. Nếu bạn chơi với công cụ Eureqa và thử dữ liệu mẫu thích hợp cả hai dạng "biểu thức đích" chung và mọi "số liệu lỗi" thì bạn sẽ bắt đầu biết điều sâu sắc này. Tôi không có câu trả lời hay. L'Hospital (còn gọi là L'Hopital) đã xây dựng biểu thức bình phương nhỏ nhất đầu tiên vào năm 1696. Một khởi đầu tốt là trường hợp sử dụng - nơi mà tâm trí xuất hiện. Đó là gì?
EngrStudent

Câu trả lời:


13

Có nhiều cách khác nhau để đo độ chính xác dự báo và accuracy()chức năng từ gói dự báo cho R xuất ra một vài trong số chúng. Từ nhận xét của bạn về "% độ lệch" có vẻ như bạn muốn sử dụng Lỗi phần trăm tuyệt đối trung bình, đây là một trong những biện pháp được cung cấp bởi accuracy(). Các biện pháp phổ biến nhất về độ chính xác dự báo được thảo luận ở đây . Bạn có thể muốn nghĩ về việc MAPE là biện pháp phù hợp nhất cho vấn đề của bạn hay liệu một trong những biện pháp khác có tốt hơn không.

Các accuracy()chức năng không hoạt động trên dữ liệu thực. "Dữ liệu thử nghiệm" là những dữ liệu không được sử dụng để xây dựng dự báo. Đôi khi chúng có sẵn nhưng không được sử dụng khi các dự báo được tính toán (phân chia dữ liệu cổ điển thành các tập huấn luyện và kiểm tra). Trong các tình huống khác, tất cả các dữ liệu có sẵn được sử dụng để tính toán các dự báo, và sau đó bạn phải đợi cho đến khi có một số quan sát trong tương lai có sẵn để sử dụng làm dữ liệu thử nghiệm.

Vì vậy, nếu flà một vectơ dự báo và xlà một vectơ quan sát tương ứng với cùng thời điểm, thì

accuracy(f,x)

sẽ làm những gì bạn muốn.


"Các biện pháp dựa trên sai số phần trăm có nhược điểm là vô hạn hoặc không xác định nếu yi = 0 cho bất kỳ i nào trong khoảng thời gian quan tâm và có giá trị cực trị khi bất kỳ yi nào gần bằng không." Tôi nghĩ rằng đây sẽ là vấn đề trong trường hợp của tôi, bởi vì rất nhiều trường hợp thực tế có thể là KHÔNG. Tôi đang suy nghĩ tính toán MAE và thay đổi số kết quả thành "phần trăm". Liệu nó có ý nghĩa?
kosa

Bằng cách nào đó, lời cảm ơn của bạn đã biến mất, thực sự cảm ơn bạn đã dành thời gian cho Tiến sĩ Hyndman!
kosa

2

Mộtccbạnrmộtcy= =E(f)-yPrecTôiSTôion= =Vmộtr[f-y]

MSFE= =1nΣTôi= =1n(fTôi-yTôi)2fTôiyTôi


Cảm ơn bạn đã trả lời! Vâng, tôi không lo lắng về độ chính xác tại thời điểm này. Chỉ muốn biết độ chính xác, "độ lệch của dự báo so với thực tế". Tôi không lo lắng về việc chạy một vài mô hình tính toán lỗi dự báo và chọn mô hình tốt nhất. Mục đích duy nhất của tôi là tìm ra sự sai lệch giữa các giá trị thực tế và dự báo. Mô hình của chúng tôi là không đổi ở đây. Bất kể mô hình của chúng tôi là tốt hay xấu cho tập dữ liệu, chúng tôi chỉ cần số lượng sai lệch. Câu hỏi này không liên quan đến lựa chọn mô hình tinh chỉnh tham số (hoặc). Tôi hy vọng bây giờ tôi rõ ràng. Xin vui lòng cho tôi biết nếu thiếu bất cứ điều gì.
kosa

@Nambari, nếu bạn cần "số độ lệch", tại sao bạn không sử dụng số độ lệch? Tạo một vòng lặp trên các dự đoán, so sánh chúng với các giá trị thực và đếm số trường hợp trong đó các dự đoán khác với các giá trị thực.
La Mã

2

Tôi đã làm điều này trong R đây là mã của tôi cho dữ liệu của tôi cho cả dữ liệu trong mẫu và ngoài mẫu:

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

Mong cái này giúp được chút ít. Nếu bạn muốn mã đầy đủ của tôi, tôi đã sử dụng để chạy này, xin hỏi vì điều này rất cơ bản


1

Câu trả lời ngắn: để đánh giá chất lượng dự đoán của bạn, hãy sử dụng chính xác cùng một biện pháp mà bạn đã sử dụng trong đào tạo (lắp) mô hình của mình.

Câu trả lời dài:

Để chọn một thước đo cho tính chính xác của dự báo của bạn, trước tiên bạn cần biết cách bạn diễn giải dự đoán của mình. Nói cách khác, những gì bạn thực sự đưa ra như là một "dự báo"? Nó có nghĩa là giá trị? Trung bình? Giá trị có thể xảy ra nhất? Câu trả lời cho câu hỏi này sẽ xác định duy nhất thước đo độ chính xác dự báo. Nếu bạn dự đoán trung bình, bạn phải sử dụng độ lệch bình phương trung bình gốc làm thước đo độ chính xác dự báo. Nếu bạn dự đoán trung vị, bạn phải sử dụng độ lệch tuyệt đối trung bình làm thước đo độ chính xác.

Tôi sẽ giải thích một chút về điểm này. Hãy để chúng tôi giả định rằng bạn thực hiện một dự đoán / dự báo cho ngày mai. Chúng ta cũng giả sử rằng đối với bất kỳ giá trị nào bạn có thể quan sát vào ngày mai, bạn có xác suất tương ứng được quan sát. Ví dụ: bạn biết rằng bạn có thể quan sát 1 với xác suất 0,03, 2 với xác suất 0,07, 3 với xác suất 0,11, v.v. Vì vậy, bạn có một phân phối xác suất trên các giá trị khác nhau. Có phân phối này, bạn có thể tính toán các thuộc tính khác nhau và đưa chúng làm "dự đoán" của mình. Bạn có thể tính toán trung bình và đưa ra như dự đoán cho ngày mai. Ngoài ra, bạn có thể sử dụng trung bình như dự đoán của bạn. Bạn cũng có thể tìm thấy giá trị có thể xảy ra nhất và đưa ra như dự đoán của bạn cho ngày mai.

Nếu bạn sử dụng giá trị trung bình làm dự đoán, thì câu hỏi "làm thế nào để đo lường độ chính xác của dự đoán của tôi" phải được thay thế bằng "mức độ chính xác của giá trị trung bình" và câu trả lời là "độ lệch bình phương trung bình giữa giá trị thực và dự đoán ". Nếu bạn sử dụng trung bình làm dự đoán, bạn phải sử dụng độ lệch tuyệt đối trung bình.

Nó có thể là bạn không biết nếu bạn sử dụng trung bình hoặc trung bình hoặc một cái gì đó khác. Để tìm hiểu những gì bạn thực sự sử dụng như dự đoán, bạn phải biết biện pháp nào bạn cố gắng giảm thiểu trong đào tạo. Nếu bạn cố gắng tìm các tham số của mô hình giảm thiểu độ lệch bình phương trung bình gốc giữa các dự đoán và giá trị đích từ dữ liệu huấn luyện, thì dự đoán của bạn phải được coi là trung bình. Nếu bạn giảm thiểu độ lệch tuyệt đối, thì bạn sẽ đào tạo mô hình của mình để cung cấp trung vị, v.v.

THÊM

Tôi muốn nhấn mạnh một điều. Như tôi đã đề cập ở trên, điều quan trọng là phải giữ cùng một thước đo độ chính xác trong "phù hợp" và "dự đoán". Thêm vào đó tôi muốn nói rằng bạn hoàn toàn tự do trong việc lựa chọn các biện pháp của mình. Không có biện pháp "tốt hơn" hay "tệ hơn". Biện pháp này phải được xác định theo cách bạn (hoặc khách hàng của bạn) sử dụng dự đoán của bạn. Ví dụ, điều rất quan trọng (đối với bạn hoặc khách hàng của bạn) là có một kết quả khớp chính xác và nếu bạn không có nó, thì nó không có vai trò gì nếu sự khác biệt giữa giá trị thực và dự đoán là lớn hay nhỏ. Trong các trường hợp khác, sự khác biệt này đóng một vai trò. Chênh lệch 1 là tốt hơn chênh lệch 2. Trong một số trường hợp, chênh lệch 2 là kém hơn 2 lần so với chênh lệch 1. Trong các trường hợp khác, chênh lệch bằng 2 tệ hơn 100 lần so với chênh lệch bằng 1. Bạn cũng có thể tưởng tượng các trường hợp kỳ lạ mà bạn cần tạo ra một giá trị khác với các quan sát. Vì vậy, thước đo chất lượng của các số mà bạn tạo ra có thể là bất cứ điều gì bạn muốn, tùy thuộc vào những gì bạn cần. Điều quan trọng, là sử dụng cùng một biện pháp trong đào tạo (phù hợp) và đánh giá dự đoán.


(Liên quan đến nhận xét của bạn về câu trả lời khác) Trong hầu hết các trường hợp dự đoán khác với giá trị thực, tôi không nghĩ trong mọi trường hợp chúng ta có thể có được sự phù hợp hoàn hảo. Vì vậy, cách tiếp cận bạn đề xuất có thể không lý tưởng, bởi vì chúng tôi sẽ nhận được 100%. Nhưng những gì tôi nghĩ là có được sự khác biệt giữa tỷ lệ phần trăm thực tế so với dự đoán theo tỷ lệ phần trăm, không gì khác ngoài MAPE. Trường hợp chúng tôi đang xử lý có cơ hội rất cao để có được số KHÔNG thực tế rất thường xuyên, do hoàn cảnh, trong trường hợp đó MAPE có thể không phải là lựa chọn tốt nhất vì phần trăm sẽ là INFINITY. Đây là nơi tôi đã bị mắc kẹt.
kosa

Tôi biết MAPE là nguyên tắc tôi muốn, nhưng bộ dữ liệu của tôi có trường hợp đáng tiếc này khi các giá trị REAL trong chuỗi có thể là KHÔNG thường xuyên.
kosa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.