预测准确性计算


9

我们正在使用STL(R实现)来预测时间序列数据。

每天我们都会进行每日预测。我们想将预测值与实际值进行比较,并确定平均偏差。例如,我们对明天进行了预测并获得了预测点,我们希望将这些预测点与明天将要获得的真实数据进行比较。我知道,预测值和实际数据在大多数情况下可能不匹配,这就是我们希望保持每天的准确性的原因之一。

现在,我们正在尝试确定解决此问题的最佳方法是什么?任何帮助指针将不胜感激。

我看过“ 衡量预测准确性问题”,但它似乎与比较模型有关,而不是与实际值一起计算准确性。

我看过R中的精度函数实现,但与两个问题混淆:

1)它可用于真实数据还是预测数据,因为大多数教程都说“测试数据”还是“预测数据”

2)精度函数的输出似乎是值的数组而不是偏差的百分比。


1
为了获得一个很好的答案,您必须提出正确的问题-这可能令人沮丧。每个人都想统治世界,这需要先知。如果我对明天的股票有全面的了解,而今天却掌握了那么多的知识,那么我可以赚很多钱/力量/机会/荣耀/等等。如果我正在查看您的问题,那么我希望查看预测误差的直方图(或eCDF)。我可能希望“抖动”预测的输入,并查看其均值和变化,然后将误差与​​这些误差进行比较。您必须了解错误才能修复。
EngrStudent 2014年

1
对于初学者来说,什么是STL?
shadowtalker 2014年

@EngrStudent:“您必须了解错误才能修复”-在此语句中,我们分为两部分。我正在尝试为第一部分本身找到可能的方法。我选择的方法将帮助我选择第二部分的策略
。– kosa

1
平均值与系统行为不同。标准偏差与系统的行为不同。这两个度量是用于测量系统行为的摘要统计量。错误不是准确性。错误不是不确定性。这两个度量是汇总统计,用于类似于均值和标准偏差的误差。就像系统行为的度量有很多无穷大一样,错误行为的度量也有很多无穷大。你的专栏是什么?您如何衡量思考错误的好方法?
EngrStudent

1
@Nambari-欢迎来到“智者”的世界。知识的开始是要知道自己一无所知-做一名学生。我试图一直学习自我,并试图被任何说实话的人纠正。如果您使用Eureqa工具,并尝试“目标表达式”的每个常规形式和“错误度量”的适当样本数据,那么您将开始了解这一深层次的知识。我没有一个好的答案。L'Hospital(又名L'Hopital)在1696年制定了第一个最小二乘表达式。一个好的开始是用例-头脑来自哪里。
EngrStudent 2014年

Answers:


13

有许多不同的方法来测量预测准确性,accuracy()R的预测包中的函数会输出其中的几种。从您对“偏差百分比”的评论看来,您想要使用平均绝对百分比误差,这是所提供的度量之一accuracy()本文讨论了最常用的预测准确性度量。您可能会想一下,MAPE是最适合您问题的措施,还是其他措施中的一项是否更好。

accuracy()功能确实适用于真实数据。“测试数据”是那些未用于构建预测的数据。有时它们可​​用,但在计算预测时不使用(将数据分为训练集和测试集的经典划分)。在其他情况下,所有可用数据都将用于计算预测,然后您必须等待,直到将来有一些将来的观测值可用作测试数据。

因此,如果f是预测的向量,并且x是对应于相同时间的观察的向量,则

accuracy(f,x)

会做你想要的。


“基于百分比误差的度量的缺点是,如果在感兴趣的周期内任何i的yi = 0,则yi是无限的或不确定的;当yi接近零时,则具有极值。” 我认为这对我来说是个问题,因为很多情况下实际可能为零。我正在考虑计算MAE,并将结果数字更改为“百分比”。是否有意义?
科萨2014年

不知何故,我的感谢信消失了,非常感谢海德曼博士的宝贵时间!
科萨2014年

2

首先,让我们澄清一下存在精度和精确度的概念。准确性通常与偏差(即预测值与实际值的系统偏差)相关。精度通常与预测误差的方差相关。像这样:Accuracy=E(f)yPrecision=Var[fy]。因此,当您在帖子中提及“准确性”时,您是否意识到了这种区别?

其次,有一些综合的预测质量衡量指标,例如 MSFE=1ni=1n(fiyi)2,在哪里 fiyi是预测和实际值。有此方法的统计数据,例如用于参数恒定性的Chow测试。


谢谢你的答案!是的,我现在不担心精度。只想知道准确性,即“预测与实际值的偏差”。我不必担心会运行几个模型来计算预测误差并选择最佳模型。我唯一的目的是找出实际值和预测值之间的偏差。我们的模型在这里是恒定的。不管我们的模型对数据集是好是坏,我们只需要偏差数即可。这个问题与参数微调(或)模型选择无关。我希望现在我很清楚。请让我知道是否有任何遗漏。
科萨2014年

@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,依此类推。因此,您可以将概率分布在不同的值上。具有此分布,您可以计算不同的属性并将其作为“预测”。您可以计算平均值并将其作为明天的预测。另外,您可以使用中位数作为预测。您还可以找到最可能的值,并将其作为对明天的预测。

如果您使用平均值作为预测,则必须将“如何测量我的预测的准确性”问题替换为“什么是对平均值的准确性的度量”,答案是“实际价值和预测”。如果使用中位数作为预测,则必须使用平均绝对偏差。

可能是您不知道是否使用中位数,均值或其他方式。要找出您实际用作预测的内容,您必须知道要在训练中尽量减少的度量。如果您尝试查找模型参数,以使训练数据中的预测值和目标值之间的均方根偏差最小,则您的预测值必须视为均值。如果您使绝对偏差最小化,则可以训练模型以提供中位数,依此类推。

添加

我想强调一件事。正如我上面提到的,在“拟合”和“预测”中保持相同的准确性度量很重要。除此之外,我还要说,您绝对可以自由选择自己的措施。没有“更好”或“更差”的措施。衡量标准应根据您(或客户)使用预测的方式来确定。例如,对于您或您的客户而言,完全匹配可能非常重要;如果您没有,则如果实际值与预测值之间的差异较大或较小,它将不起作用。在其他情况下,这种差异也起作用。差异1优于差异2。在某些情况下,差异2是差异1的2倍。在其他情况下,等于2的差比等于1的差差100倍。您也可以想象到特殊情况下,您需要生成与观察值不同的值。因此,根据需要,可以随心所欲地测量所生成数字的质量。重要的是在训练(拟合)和评估预测时使用相同的度量。


(与您对其他答案的评论有关)在大多数情况下,预测与实际价值有所不同,我认为在任何情况下我们都无法完美拟合。因此,您建议的方法可能并不理想,因为我们将获得100%的收益。但是我在想的是获得实际百分比与预测百分比之间的差异,这不过是MAPE。由于某些情况,我们正在处理的案例非常有可能非常频繁地实现零实际值,在这种情况下,MAPE可能不是最佳选择,因为百分比将是INFINITY。这就是我被困住的地方。
科萨2014年

我知道MAPE原则上是我想要的,但我的数据集遇到了这种不幸的情况,即串联的REAL值经常会归零。
科萨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.