Расчет точности прогноза


9

Мы используем STL (R реализация) для прогнозирования данных временных рядов.

Каждый день мы запускаем ежедневные прогнозы. Мы хотели бы сравнить прогнозные значения с реальными значениями и определить среднее отклонение. Например, мы запустили прогноз на завтра и получили прогнозные баллы, мы хотели бы сравнить эти прогнозные баллы с реальными данными, которые мы получим завтра. Мне известно, что прогнозные значения и реальные данные могут не совпадать в большинстве случаев, и это одна из причин, по которой мы хотели бы отслеживать, насколько точны мы каждый день.

Сейчас мы пытаемся определить, каков наилучший подход к решению этой проблемы? любые указатели помощи будут оценены.

Я посмотрел на вопрос измерения точности прогноза , но, похоже, он связан со сравнением моделей, а не с расчетом точности с реальными значениями.

Я посмотрел на реализацию функции точности в R , но перепутал два вопроса:

1) Будет ли это работать на реальных данных по сравнению с прогнозными данными, потому что большая часть учебника говорит как «тестовые данные» против «прогнозных данных»

2) Кажется, что из-за точности функция является массивом значений, а не% отклонения.


1
Чтобы получить отличный ответ, вы должны задать правильный вопрос - и это может быть неприятно. Каждый хочет править миром, и это требует предвидения. Если бы я прекрасно знал акции завтрашнего дня, но имел их сегодня, я мог бы заработать кучу денег / власти / возможностей / славы / и т.д. Если бы я смотрел на вашу проблему, то я хотел бы видеть гистограмму (или eCDF) ошибки прогнозирования. Мне может понравиться «дрожать» входные данные прогноза, посмотреть их среднее значение и вариацию и сравнить ошибку с этими. Вы должны понять свою ошибку, чтобы исправить это.
EngrStudent

1
Для непосвященных, что такое STL?
Shadowtalker

@EngrStudent: «Вы должны понять свою ошибку, чтобы исправить ее» - в этом утверждении мы состоим из двух частей. Я пытаюсь выяснить возможные подходы к самому первому разделу. Методология, которую я выберу, поможет мне в выборе стратегии для части 2.
Коса

1
Скупое - это не то же самое, что поведение системы. Стандартное отклонение - это не то же самое, что поведение системы. Эти два показателя являются сводной статистикой для измеренного поведения системы. Ошибка не в точности. Ошибка не является неопределенностью. Эти два показателя являются суммарной статистикой для ошибки, аналогичной среднему значению и стандартному отклонению. Так же, как существует множество бесконечностей мер поведения системы, существует много бесконечностей мер поведения ошибки. Какая у вас рубрика? Как измерить хороший способ думать об ошибке?
EngrStudent

1
@Nambari - добро пожаловать в мир "мудрых". Начало знания - знать, что ты ничего не знаешь, - быть студентом. Я стараюсь всегда учиться сам и стараюсь быть исправимым кем-то, говорящим правду. Если вы поиграете с инструментом Eureqa и попробуете соответствующие образцы данных как для каждой общей формы «целевого выражения», так и для каждой «метрики ошибки», вы начнете понимать эту глубокую вещь. У меня нет хорошего ответа. L'Hospital (он же L'Hopital) сформулировал первое наименее-квадратное выражение в 1696 году. Хорошим началом является случай использования - когда приходит ум. Что это?
EngrStudent

Ответы:


13

Существует много разных способов измерения точности прогноза, и accuracy()функция из пакета прогноза для R выводит несколько из них. Из вашего комментария о «% отклонения» кажется, что вы хотите использовать Среднее абсолютное процентное отклонение, что является одним из показателей, предоставляемых accuracy(). Наиболее распространенные меры точности прогноза обсуждаются здесь . Вы можете подумать о том, является ли MAPE наиболее подходящей мерой для вашей проблемы, или же одна из других мер лучше.

accuracy()Функция делает работу на реальных данных. «Тестовые данные» - это те данные, которые не использовались для построения прогнозов. Иногда они доступны, но не используются при вычислении прогнозов (классическое разделение данных на обучающие и тестовые наборы). В других ситуациях все доступные данные используются для расчета прогнозов, и тогда вам нужно подождать, пока в будущем появятся некоторые наблюдения, которые можно использовать в качестве тестовых данных.

Так что, если fвектор прогнозов и xвектор наблюдений, соответствующих тем же временам, то

accuracy(f,x)

будет делать то, что вы хотите.


«Меры, основанные на процентных ошибках, имеют тот недостаток, что они бесконечны или неопределенны, если yi = 0 для любого i в интересующем периоде, и имеют экстремальные значения, когда любой yi близок к нулю». Я думаю, что это будет проблемой в моем случае, потому что во многих случаях фактические значения могут быть нулевыми. Я думаю, рассчитать MAE и изменить число результатов на «процент». Имеет ли это смысл?
Коса

Каким-то образом моя благодарственная записка исчезла, большое спасибо за ваше время, доктор Хиндман!
Коса

2

AссUрaсYзнак равноЕ(е)-YпресяsяоNзнак равноВaр[е-Y]

MSFЕзнак равно1NΣязнак равно1N(ея-Yя)2еяYя


Спасибо за ответ! Да, я не беспокоюсь о точности в данный момент. Сразу хочу узнать достоверность «отклонения прогноза от фактического». Я не беспокоюсь о том, что несколько моделей рассчитывают ошибки прогноза и выбирают лучшую модель. Моя единственная цель - узнать разницу между фактическими и прогнозными значениями. Наша модель постоянна здесь. Независимо от нашей модели, хорошо это или плохо для набора данных, нам просто нужно количество отклонений. Этот вопрос не относится к точной настройке параметров (или) выбора модели. Надеюсь теперь мне ясно. Пожалуйста, дайте мне знать, если что-то пропало.
Коса

@ 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

Краткий ответ: чтобы оценить качество ваших прогнозов, используйте точно такой же показатель, который вы использовали при обучении (подборе) вашей модели.

Длинный ответ:

Чтобы выбрать показатель точности ваших прогнозов, вам прежде всего необходимо знать, как вы интерпретируете свои прогнозы. Другими словами, что вы на самом деле даете в качестве «прогноза»? Это среднее значение? Медиана? Наиболее вероятное значение? Ответ на этот вопрос будет однозначно определять меру точности прогноза. Если вы прогнозируете среднее значение, вы должны использовать среднеквадратичное отклонение в качестве меры точности прогноза. Если вы прогнозируете медиану, вы должны использовать среднее абсолютное отклонение в качестве меры точности.

Я немного уточню этот момент. Давайте предположим, что вы делаете прогноз / прогноз на завтра. Предположим также, что для любого значения, которое вы можете наблюдать завтра, у вас есть соответствующая вероятность для наблюдения. Например, вы знаете, что вы можете наблюдать 1 с вероятностью 0,03, 2 с вероятностью 0,07, 3 с вероятностью 0,11 и так далее. Итак, у вас есть распределение вероятностей по разным значениям. Имея это распределение, вы можете рассчитать различные свойства и предоставить их в качестве «прогнозов». Вы можете рассчитать среднее значение и дать его в качестве прогноза на завтра. В качестве альтернативы вы можете использовать медиану в качестве прогноза. Вы также можете найти наиболее вероятное значение и дать его в качестве прогноза на завтра.

Если вы используете среднее значение в качестве прогноза, тогда вопрос «как измерить точность моего прогноза» должен быть заменен на «какова мера точности среднего», а ответ - «среднеквадратичное отклонение между реальные ценности и прогноз ». Если вы используете медиану в качестве прогноза, вы должны использовать среднее абсолютное отклонение.

Возможно, вы не знаете, используете ли вы медиану или среднее значение или что-то еще. Чтобы узнать, что вы на самом деле используете в качестве прогнозов, вы должны знать, какую меру вы пытаетесь минимизировать на тренинге. Если вы попытаетесь найти параметры модели, которые минимизируют среднеквадратичное отклонение между прогнозами и целевыми значениями из обучающих данных, тогда ваши прогнозы должны рассматриваться как среднее. Если вы минимизируете абсолютные отклонения, то вы тренируете свою модель для обеспечения медианы и так далее.

ADDED

Я хотел бы подчеркнуть одну вещь. Как я уже упоминал выше, важно сохранять одинаковую меру точности при «подгонке» и при «прогнозировании». В дополнение к этому я хотел бы сказать, что вы абсолютно свободны в выборе ваших мер. Нет никаких «лучших» или «худших» мер. Мера должна определяться тем, как вы (или ваш клиент) используете свои прогнозы. Например, может быть очень важно (для вас или вашего клиента) иметь точное совпадение, и, если у вас его нет, оно не играет никакой роли, если разница между действительными и прогнозируемыми значениями велика или мала. В других случаях эта разница играет роль. Разница 1 лучше, чем разница 2. В некоторых случаях разница 2 в 2 раза хуже, чем разница 1. В других случаях разница, равная 2, в 100 раз хуже, чем разница, равная 1. Вы также можете представить себе экзотические случаи, когда вам нужно сгенерировать значение, отличное от наблюдений. Таким образом, показатель качества генерируемых вами чисел может быть любым, в зависимости от того, что вам нужно. Что важно, так это использовать одну и ту же меру при обучении (подгонке) и оценке прогнозов.


(Связано с вашим комментарием к другому ответу). В большинстве случаев прогнозы отличаются от реальных значений, я не думаю, что в любом случае мы можем получить идеальную подгонку. Таким образом, предложенный вами подход может быть не идеальным, потому что мы получим 100%. Но я думаю, что получить разницу между фактическим и прогнозным в процентах, который является ничем иным, как MAPE. Случай, который мы рассматриваем, имеет очень высокие шансы на частое получение фактического НУЛЯ из-за обстоятельств, и в этом случае MAPE может быть не лучшим вариантом, потому что процент будет бесконечность. Вот где я застрял.
Коса

Я знаю, что MAPE - это то, чего я в принципе хочу, но в моем наборе данных есть тот прискорбный случай, когда значения REAL в рядах могут очень часто быть ZERO.
Коса
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.