预测精度计算

机器算法验证 时间序列 预测 准确性
2022-03-15 04:28:59

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

我们每天运行每日预测。我们希望将预测值与实际值进行比较并确定平均偏差。例如,我们对明天进行预测并得到预测点,我们想将这些预测点与我们明天将获得的真实数据进行比较。我知道大多数时候预测值和实际数据可能不匹配,这就是我们希望跟踪我们每天的准确度的原因之一。

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

我查看了测量预测准确性问题,但它似乎与比较模型有关,而不是计算与实际值的准确性。

我查看了 R 中的准确度函数实现,但对两个问题感到困惑:

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

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

4个回答

有许多不同的方法来衡量预测的准确性,accuracy()R 的预测包中的函数会输出其中的几种。从您对“偏差百分比”的评论看来,您想使用平均绝对百分比误差,这是由accuracy(). 此处讨论了最常见的预测准确性度量您可能想考虑 MAPE 是否是最适合您的问题的度量,或者其他度量之一是否更好。

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

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

accuracy(f,x)

会做你想做的。

首先,让我们澄清一下准确性和精确度的概念。准确性通常与偏差有关,即预测与实际的系统偏差。精度通常与预测误差的方差有关。像这样的东西:Accuracy=E(f)y对比Precision=Var[fy]. 那么,当您在帖子中提到“准确性”时,是否知道其中的区别?

其次,有预测质量的综合措施,例如MSFE=1ni=1n(fiyi)2, 在哪里fiyi是预测和实际。该度量有统计数据,例如参数恒定性的 Chow 检验。

我一直在 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")

希望这个对你有帮助。如果你想要我用来运行它的完整代码,请询问,因为这是非常基本的

简短的回答:要评估您的预测质量,请使用与您在模型训练(拟合)中使用的完全相同的度量。

长答案:

为了选择预测准确性的衡量标准,您首先需要知道如何解释您的预测。换句话说,你实际上给出了什么作为“预测”?是平均值吗?中位数?最可能的值?这个问题的答案将唯一标识预测准确性的度量。如果您预测均值,则必须使用均方根偏差作为预测准确度的度量。如果您预测中位数,则必须使用平均绝对偏差作为准确度的衡量标准。

我将详细说明这一点。让我们假设您对明天进行预测/预测。让我们还假设对于您明天可能观察到的任何值,您都有相应的概率被观察到。例如,您知道您可能以 0.03 的概率观察到 1,以 0.07 的概率观察到 2,以 0.11 的概率观察到 3,依此类推。所以,你有不同值的概率分布。有了这个分布,您可以计算不同的属性并将它们作为您的“预测”。您可以计算平均值并将其作为明天的预测。或者,您可以使用中位数作为您的预测。您还可以找到最可能的值并将其作为您对明天的预测。

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

可能是您不知道您使用的是中位数还是均值或其他内容。要找出您实际用作预测的内容,您必须知道您在训练中尝试最小化的度量。如果您尝试从训练数据中找到使预测值与目标值之间的均方根偏差最小化的模型参数,则必须将您的预测视为均值。如果您最小化绝对偏差,那么您可以训练您的模型以提供中位数等。

添加

我想强调一件事。正如我上面提到的,在“拟合”和“预测”中保持相同的准确度是很重要的。除此之外,我想说的是,您可以完全自由地选择您的措施。没有“更好”或“更差”的措施。该度量应由您(或您的客户)使用您的预测的方式来确定。例如,精确匹配(对您或您的客户)可能非常重要,如果您没有精确匹配,那么如果实际值和预测值之间的差异很大或很小,它就不会发挥任何作用。在其他情况下,这种差异会起作用。1 的差异优于 2 的差异。在某些情况下,2 的差异比 1 的差异差 2 倍。在其他情况下,等于 2 的差值比等于 1 的差值差 100 倍。您还可以想象需要生成与观察值不同的值的特殊情况。因此,您生成的数字的质量衡量标准可以是您想要的任何东西,具体取决于您的需要。重要的是在训练(拟合)和预测评估中使用相同的度量。