最重要的训练信号是预测误差,它是观测值 yτy_{\tau} 和预测值 y^τ\hat{y}_{\tau} 在时间 yτy_{\tau} 上的差值

eτ=yτy^ττ{t+1,,t+H}e_{\tau} = y_{\tau}-\hat{y}_{\tau} \qquad \qquad \tau \in \{t+1,\dots,t+H \}

训练损失函数总结了不同评估指标下的预测误差。

1. 尺度相关误差

这些指标与数据的尺度相同。

平均绝对误差


来源

mae

 mae (y:numpy.ndarray, y_hat:numpy.ndarray,
      weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*平均绝对误差

计算 yy_hat 之间的平均绝对误差。MAE 通过计算给定时间预测值和真实值之间的偏差,然后将这些偏差在序列长度上平均,来衡量预测方法的相对预测准确性。

MAE(yτ,y^τ)=1Hτ=t+1t+Hyτy^τ\mathrm{MAE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} |y_{\tau} - \hat{y}_{\tau}|

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
mae: numpy 数组,(单个值)。*

均方误差


来源

mse

 mse (y:numpy.ndarray, y_hat:numpy.ndarray,
      weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*均方误差

计算 yy_hat 之间的均方误差。MSE 通过计算给定时间预测值和真实值之间偏差的平方,然后将这些偏差平方在序列长度上平均,来衡量预测方法的相对预测准确性。

MSE(yτ,y^τ)=1Hτ=t+1t+H(yτy^τ)2\mathrm{MSE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} (y_{\tau} - \hat{y}_{\tau})^{2}

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
mse: numpy 数组,(单个值)。*

均方根误差


来源

rmse

 rmse (y:numpy.ndarray, y_hat:numpy.ndarray,
       weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*均方根误差

计算 yy_hat 之间的均方根误差。RMSE 通过计算给定时间预测值和观测值之间偏差的平方,然后将这些偏差平方在序列长度上平均,最后取平方根,来衡量预测方法的相对预测准确性。最终的 RMSE 与原始时间序列的尺度相同,因此只有当其他序列共享同一尺度时,才能进行比较。RMSE 与 L2 范数有直接联系。

RMSE(yτ,y^τ)=1Hτ=t+1t+H(yτy^τ)2\mathrm{RMSE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}) = \sqrt{\frac{1}{H} \sum^{t+H}_{\tau=t+1} (y_{\tau} - \hat{y}_{\tau})^{2}}

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
rmse: numpy 数组,(单个值)。*

2. 百分比误差

这些指标无单位,适合跨系列比较。

平均绝对百分比误差


来源

mape

 mape (y:numpy.ndarray, y_hat:numpy.ndarray,
       weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*平均绝对百分比误差

计算 yy_hat 之间的平均绝对百分比误差。MAPE 通过计算给定时间预测值和观测值之间的百分比偏差,然后将这些偏差在序列长度上平均,来衡量预测方法的相对预测准确性。观测值越接近零,MAPE 损失对相应误差的惩罚越大。

MAPE(yτ,y^τ)=1Hτ=t+1t+Hyτy^τyτ\mathrm{MAPE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} \frac{|y_{\tau}-\hat{y}_{\tau}|}{|y_{\tau}|}

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
mape: numpy 数组,(单个值)。*

SMAPE


来源

smape

 smape (y:numpy.ndarray, y_hat:numpy.ndarray,
        weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*对称平均绝对百分比误差

计算 yy_hat 之间的对称平均绝对百分比误差。SMAPE 通过计算给定时间预测值和观测值之间的相对偏差,该偏差按预测值和观测值的绝对值之和进行缩放,然后将这些偏差在序列长度上平均,来衡量预测方法的相对预测准确性。这使得 SMAPE 的范围在 0% 到 200% 之间,这比当目标值为零时可能无法确定的普通 MAPE 更可取。

sMAPE2(yτ,y^τ)=1Hτ=t+1t+Hyτy^τyτ+y^τ\mathrm{sMAPE}_{2}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} \frac{|y_{\tau}-\hat{y}_{\tau}|}{|y_{\tau}|+|\hat{y}_{\tau}|}

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
smape: numpy 数组,(单个值)。

参考文献
Makridakis S.,“准确性度量:理论与实践问题”。*

3. 尺度无关误差

这些指标衡量相对于基线的相对改进。

平均绝对标准化误差


来源

mase

 mase (y:numpy.ndarray, y_hat:numpy.ndarray, y_train:numpy.ndarray,
       seasonality:int, weights:Optional[numpy.ndarray]=None,
       axis:Optional[int]=None)

*平均绝对标准化误差 计算 yy_hat 之间的平均绝对标准化误差。MASE 通过将预测值与观测值之间的平均绝对误差与季节性朴素模型的平均绝对误差进行比较,来衡量预测方法的相对预测准确性。MASE 部分构成了 M4 竞赛中使用的总体加权平均 (OWA)。

MASE(yτ,y^τ,y^τseason)=1Hτ=t+1t+Hyτy^τMAE(yτ,y^τseason)\mathrm{MASE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}, \mathbf{\hat{y}}^{season}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} \frac{|y_{\tau}-\hat{y}_{\tau}|}{\mathrm{MAE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}^{season}_{\tau})}

参数
y: numpy 数组,(batch_size, output_size),实际值。
y_hat: numpy 数组,(batch_size, output_size)),预测值。
y_insample: numpy 数组,(batch_size, input_size),实际样本内季节性朴素预测值。
seasonality: int。时间序列的主要频率;每小时 24,每日 7,每周 52,每月 12,每季度 4,每年 1。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
mase: numpy 数组,(单个值)。

参考文献
Rob J. Hyndman, & Koehler, A. B. “预测准确性度量的再考察”。
Spyros Makridakis, Evangelos Spiliotis, Vassilios Assimakopoulos,“M4 竞赛:100,000 条时间序列和 61 种预测方法”。*

相对平均绝对误差


来源

rmae

 rmae (y:numpy.ndarray, y_hat1:numpy.ndarray, y_hat2:numpy.ndarray,
       weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*RMAE

计算两个预测集合(来自两种不同的预测方法)之间的相对平均绝对误差 (RMAE)。小于一的值意味着分子中的预测比分母中的预测更好。

rMAE(yτ,y^τ,y^τbase)=1Hτ=t+1t+Hyτy^τMAE(yτ,y^τbase)\mathrm{rMAE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}_{\tau}, \mathbf{\hat{y}}^{base}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} \frac{|y_{\tau}-\hat{y}_{\tau}|}{\mathrm{MAE}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}^{base}_{\tau})}

参数
y: numpy 数组,观测值。
y_hat1: numpy 数组。第一个模型的预测值。
y_hat2: numpy 数组。基线模型的预测值。
weights: numpy 数组,可选。用于加权平均的权重。
axis: None 或 int,可选。用于计算平均值的轴。
默认情况下,axis=None 将对输入数组的所有元素计算平均值。

返回值
rmae: numpy 数组或 double。

参考文献
Rob J. Hyndman, & Koehler, A. B. “预测准确性度量的再考察”。*

4. 概率误差

这些度量非对称地衡量绝对偏差,可能导致低估或高估。

分位数损失


来源

quantile_loss

 quantile_loss (y:numpy.ndarray, y_hat:numpy.ndarray, q:float=0.5,
                weights:Optional[numpy.ndarray]=None,
                axis:Optional[int]=None)

*分位数损失

计算 yy_hat 之间的分位数损失。QL 衡量分位数预测的偏差。通过非对称地加权绝对偏差,该损失函数更关注低估或高估的情况。对于分位数 q,常用的值为 0.5,对应于中位数的偏差(即 Pinball 损失)。

QL(yτ,y^τ(q))=1Hτ=t+1t+H((1q)(y^τ(q)yτ)++q(yτy^τ(q))+)\mathrm{QL}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}^{(q)}_{\tau}) = \frac{1}{H} \sum^{t+H}_{\tau=t+1} \Big( (1-q)\,( \hat{y}^{(q)}_{\tau} - y_{\tau} )_{+} + q\,( y_{\tau} - \hat{y}^{(q)}_{\tau} )_{+} \Big)

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
q:浮点数,介于0和1之间。它是分位数损失的斜率,在分位数回归的背景下,q决定了条件分位数水平。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
quantile_loss:numpy 数组,(单个值)。

参考文献
Roger Koenker 和 Gilbert Bassett, Jr.,“回归分位数”。*

多分位数损失


来源

mqloss

 mqloss (y:numpy.ndarray, y_hat:numpy.ndarray, quantiles:numpy.ndarray,
         weights:Optional[numpy.ndarray]=None, axis:Optional[int]=None)

*多分位数损失

计算 yy_hat 之间的多分位数损失 (MQL)。MQL 根据预测分位数与观测值之间的绝对差,计算给定分位数集合的平均多分位数损失。

MQL(yτ,[y^τ(q1),...,y^τ(qn)])=1nqiQL(yτ,y^τ(qi))\mathrm{MQL}(\mathbf{y}_{\tau},[\mathbf{\hat{y}}^{(q_{1})}_{\tau}, ... ,\hat{y}^{(q_{n})}_{\tau}]) = \frac{1}{n} \sum_{q_{i}} \mathrm{QL}(\mathbf{y}_{\tau}, \mathbf{\hat{y}}^{(q_{i})}_{\tau})

MQL 的极限行为可以衡量完整预测分布 F^τ\mathbf{\hat{F}}_{\tau} 使用连续分级概率评分 (CRPS) 的准确性。这可以通过数值积分技术实现,该技术将分位数离散化,并使用左黎曼近似处理 CRPS 积分,对均匀间隔的分位数进行平均。

CRPS(yτ,F^τ)=01QL(yτ,y^τ(q))dq\mathrm{CRPS}(y_{\tau}, \mathbf{\hat{F}}_{\tau}) = \int^{1}_{0} \mathrm{QL}(y_{\tau}, \hat{y}^{(q)}_{\tau}) dq

参数
y: numpy 数组,实际值。
y_hat: numpy 数组,预测值。
quantiles:numpy 数组,(n_quantiles)。从 y 的分布中估计的分位数。
mask: numpy 数组,指定每条序列中在损失计算中考虑的时间戳。

返回值
mqloss:numpy 数组,(单个值)。

参考文献
Roger Koenker 和 Gilbert Bassett, Jr.,“回归分位数”。
James E. Matheson 和 Robert L. Winkler,“连续概率分布的评分规则”。*

示例与验证

import unittest
import torch as t 
import numpy as np

from neuralforecast.losses.pytorch import (
    MAE, MSE, RMSE,      # unscaled errors
    MAPE, SMAPE,         # percentage errors
    MASE,                # scaled error
    QuantileLoss, MQLoss # probabilistic errors
)

from neuralforecast.losses.numpy import (
    mae, mse, rmse,              # unscaled errors
    mape, smape,                 # percentage errors
    mase,                        # scaled error
    quantile_loss, mqloss        # probabilistic errors
)