最小化对称平均绝对百分比误差 (SMAPE)

机器算法验证 预测 错误 β-二项分布 马佩
2022-03-28 21:52:27

我正在开发一个预测应用程序,其中使用对称平均绝对百分比误差来测量预测误差

SMAPE=1nt=1n|FtAt|Ft+At

在创建我的 ML 模型并对我拥有的数据应用一些贝叶斯推理之后,我最终得到了可能的实际值的概率分布,即与每个“猜测”相关的概率。如果重要的话,该分布是具有固定试验次数的 beta 二项分布,这意味着可能的结果范围从到某个0N

就像平均值最小化均方误差和中值最小化平均绝对误差一样,什么点估计最小化 SMAPE?是否有任何有效的算法来计算它(或足够好的近似值)?

预先感谢您的任何帮助!

1个回答

我认为这个问题没有封闭形式的解决方案。(我有兴趣被证明是错误的。)我假设你需要模拟。并希望您的预测后验不会被错误指定得太糟糕。


万一有趣,我们写了一篇小论文(另见此演示文稿),解释了如何通过滚动标准六面骰子来最小化百分比误差会导致预测偏差。我们还研究了 MAPE 和 wMAPE 的各种风格,但在这里让我们专注于 sMAPE。

六面骰子次来模拟“销售”,并绘制平均 sMAPE 以及逐点分位数:n=8N=1,000

fcst <- seq(1,6,by=.01)
n.sims <- 1000
n.sales <- 10
confidence <- .8
result.smape <- matrix(nrow=n.sims,ncol=length(fcst))
set.seed(2011)
for ( jj in 1:n.sims ) {
  sales <- sample(seq(1,6),size=n.sales,replace=TRUE)
  for ( ii in 1:length(fcst) ) {
    result.smape[jj,ii] <-
      2*mean(abs(sales-rep(fcst[ii],n.sales))/(sales+rep(fcst[ii],n.sales)))
  }
}

(请注意,我正在使用将分母除以 2 的替代 sMAPE 公式。)

plot(sales,type="o",ylab="",xlab="",pch=21,bg="black",ylim=c(1,6),
  main=paste("Sales:",n.sales,"throws of a six-sided die"))
plot(fcst,fcst,type="n",ylab="sMAPE",xlab="Forecast",ylim=c(0.3,1.1))
polygon(c(fcst,rev(fcst)),c(
    apply(result.smape,2,quantile,probs=(1-confidence)/2),
    rev(apply(result.smape,2,quantile,probs=1-(1-confidence)/2))),
  density=10,angle=45)
lines(fcst,apply(result.smape,2,mean))
legend(x="topright",inset=.02,col="black",lwd=1,legend="sMAPE")

模拟 sMAPE

这些方面的内容可能对您的情况有所帮助。(再次,您需要假设您的后验预测分布“足够正确”以进行这种模拟 - 但您也需要假设对于任何其他方法,所以这只是增加了一般性警告,而不是具体问题。)

在这个滚动标准六面骰子的简单示例中,我们实际上可以计算并绘制作为预测函数的预期 s(M)APE:

expected.sape <- function ( fcst ) sum(abs(fcst-seq(1,6))/(seq(1,6)+fcst))/3
plot(fcst,mapply(expected.sape,fcst),type="l",xlab="Forecast",ylab="Expected sAPE")

预期的 SAPE

这与上面的模拟平均值相当吻合。它很好地表明,滚动标准六面模具的 EsAPE 最小预测是有偏的 4,而不是 3.5 的无偏期望。


另一个有趣的事实:如果您的预测分布是具有预测参数的泊松,那么最小化预期 sAPE 的预测是的具体值无关λ^<1y^=1λ^

至少这是在Seaman & Bowman 的脚注 1 中声称的(印刷中,IJF,对 M5 预测竞赛的评论),没有证据。很容易看出 EsAPE 最小预测满足(您只需证明任何替代预测都会导致更大的 EsAPE)。证明将导致比更大的 EsAPE似乎有点乏味。然而,模拟看起来让人放心。y^1y^<1y^>1y^=1