时间序列预测性能度量提供了一个预测模型在进行预测时的技能和能力摘要。
有许多不同的性能度量可供选择。选择哪种度量以及如何解释结果可能会令人困惑。
在本教程中,您将发现用于使用 Python 评估时间序列预测的性能度量。
时间序列通常侧重于实值预测,称为回归问题。因此,本教程中的性能度量将侧重于评估实值预测的方法。
完成本教程后,您将了解:
- 基本的预测性能度量,包括残差预测误差和预测偏差。
- 时间序列预测误差计算,其单位与预期结果相同,例如平均绝对误差。
- 广泛使用的误差计算,会惩罚较大的误差,例如均方误差和均方根误差。
开始您的项目,阅读我的新书 《Python 时间序列预测入门》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。
- 2019 年 6 月:修复了预测偏差中的拼写错误(感谢 Francisco)。

使用 Python 的时间序列预测性能度量
照片由 Tom Hall 拍摄,部分权利保留。
预测误差(或残差预测误差)
预测误差计算为预期值减去预测值。
这称为预测的残差误差。
1 |
forecast_error = expected_value - predicted_value |
预测误差可以为每个预测计算,从而提供预测误差的时间序列。
下面的示例演示了如何为一系列 5 个预测与 5 个预期值进行比较来计算预测误差。该示例是为了演示目的而设计的。
1 2 3 4 |
expected = [0.0, 0.5, 0.0, 0.5, 0.0] predictions = [0.2, 0.4, 0.1, 0.6, 0.2] forecast_errors = [expected[i]-predictions[i] for i in range(len(expected))] print('Forecast Errors: %s' % forecast_errors) |
运行该示例将计算 5 个预测的每个预测误差。然后打印预测误差列表。
1 |
Forecast Errors: [-0.2, 0.09999999999999998, -0.1, -0.09999999999999998, -0.2] |
预测误差的单位与预测值的单位相同。预测误差为零表示没有误差,或者该预测具有完美的技能。
停止以**慢速**学习时间序列预测!
参加我的免费7天电子邮件课程,了解如何入门(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
平均预测误差(或预测偏差)
平均预测误差计算为预测误差值的平均值。
1 |
mean_forecast_error = mean(forecast_error) |
预测误差可以是正数和负数。这意味着当计算这些值的平均值时,理想的平均预测误差为零。
非零的平均预测误差值表明模型倾向于过度预测(负误差)或低估预测(正误差)。因此,平均预测误差也称为预测偏差。
预测误差可以直接计算为预测值的平均值。下面的示例演示了如何手动计算预测误差的平均值。
1 2 3 4 5 |
expected = [0.0, 0.5, 0.0, 0.5, 0.0] predictions = [0.2, 0.4, 0.1, 0.6, 0.2] forecast_errors = [expected[i]-predictions[i] for i in range(len(expected))] bias = sum(forecast_errors) * 1.0/len(expected) print('Bias: %f' % bias) |
运行该示例将打印平均预测误差,也称为预测偏差。
在这种情况下,结果是负数,这意味着我们高估了预测。
1 |
Bias: -0.100000 |
预测偏差的单位与预测值的单位相同。预测偏差为零或接近零的非常小的数字表明模型没有偏差。
平均绝对误差
平均绝对误差,或 MAE,计算为预测误差值的平均值,其中所有预测误差值都被强制为正数。
将值强制为正数称为使其绝对化。这由绝对值函数abs()表示,或在数学上表示为值周围的两个竖线:|value|。
1 |
mean_absolute_error = mean( abs(forecast_error) ) |
其中abs()将值变为正数,forecast_error是一个或一系列预测误差,mean()计算平均值。
我们可以使用 scikit-learn 库中的 mean_absolute_error() 函数来计算一系列预测的平均绝对误差。下面的示例演示了此函数。
1 2 3 4 5 |
from sklearn.metrics import mean_absolute_error expected = [0.0, 0.5, 0.0, 0.5, 0.0] predictions = [0.2, 0.4, 0.1, 0.6, 0.2] mae = mean_absolute_error(expected, predictions) print('MAE: %f' % mae) |
运行该示例将计算并打印一系列 5 个预期值和预测值的平均绝对误差。
1 |
MAE: 0.140000 |
这些误差值以预测值的原始单位表示。平均绝对误差为零表示没有误差。
均方误差
均方误差,或 MSE,计算为平方预测误差值的平均值。将预测误差值平方会使其变为正数;它还会将更大的权重放在较大的误差上。
非常大或异常值预测误差会被平方,这反过来会使平方预测误差的平均值变得更大,从而导致更高的均方误差分数。实际上,该分数对那些做出大错误预测的模型给予了更差的性能。
1 |
mean_squared_error = mean(forecast_error^2) |
我们可以使用 scikit-learn 的 mean_squared_error() 函数来计算一系列预测的均方误差。下面的示例演示了此函数。
1 2 3 4 5 |
from sklearn.metrics import mean_squared_error expected = [0.0, 0.5, 0.0, 0.5, 0.0] predictions = [0.2, 0.4, 0.1, 0.6, 0.2] mse = mean_squared_error(expected, predictions) print('MSE: %f' % mse) |
运行该示例将计算并打印一系列预期值和预测值的均方误差。
1 |
MSE: 0.022000 |
误差值以预测值的平方单位表示。均方误差为零表示完美的技能,或没有误差。
均方根误差
上面描述的均方误差是以预测值的平方单位表示的。
可以通过取均方误差分数的平方根将其转换回预测值的原始单位。这称为均方根误差,或 RMSE。
1 |
rmse = sqrt(mean_squared_error) |
这可以通过对使用 mean_squared_error() scikit-learn 函数计算的均方误差使用 sqrt() 数学函数来计算。
1 2 3 4 5 6 7 |
from sklearn.metrics import mean_squared_error from math import sqrt expected = [0.0, 0.5, 0.0, 0.5, 0.0] predictions = [0.2, 0.4, 0.1, 0.6, 0.2] mse = mean_squared_error(expected, predictions) rmse = sqrt(mse) print('RMSE: %f' % rmse) |
运行该示例将计算均方根误差。
1 |
RMSE: 0.148324 |
RMSE 误差值与预测值的单位相同。与均方误差一样,RMSE 为零表示没有误差。
进一步阅读
以下是一些关于时间序列预测误差度量的进一步阅读参考。
- 第 3.3 节 预测准确性度量,《R 语言时间序列预测实用指南》。
- 第 2.5 节 评估预测准确性,《预测:原理与实践》
- scikit-learn 指标 API
- 第 3.3.4 节 回归指标,scikit-learn API 指南
总结
在本教程中,您了解了 Python 中一套标准的 5 种时间序列性能度量。
具体来说,你学到了:
- 如何计算预测残差误差以及如何估计预测列表中的偏差。
- 如何计算平均绝对预测误差,以描述与预测值相同的单位中的误差。
- 如何计算广泛使用的均方误差和均方根误差用于预测。
您对时间序列预测性能度量或本教程有任何疑问吗?
在下面的评论中提出你的问题,我会尽力回答。
我曾几次看到使用 MAPE 来评估我们的预测模型。您经常看到它被使用吗?以及何时会使用一个而不是另一个?
Peter,MAPE 是一个很好的指标,我也看到它被使用。
我个人更喜欢 RMSE。
我的 ARIMA 模型得到了 9.69 的 RMSE 值,我该如何降低它?
尝试其他模型配置?
尝试其他模型?
尝试其他数据准备?
预测误差的第一行代码应该是 forecast_error = expected_value “-” predicted_value。
我认为这是一个错字。
是的,那是笔误。已修复。谢谢 Ian。
Jason博士,
您能否为我们提供一种简单的方法,使用 10 折交叉验证来分割大型 CSV 文件用于训练和测试集?然后应用不同的算法来训练模型,之后测试模型以检查模型的准确性。我们还希望看到 ROC 曲线来组合不同的算法
我的第二个问题是 ROC 曲线是否能显示模型的精度?您能否向我展示 ROC 曲线的数学公式?
抱歉,我没有能力为您准备这个示例。
您可以在这里了解更多关于 ROC 曲线的信息
https://machinelearning.org.cn/assessing-comparing-classifier-performance-roc-curves-2/
对于一个可接受的模型,所有不同的性能度量值的范围应该是多少?
问得好,这 realmente 取决于您的问题和变量的单位。
假设变量值范围是 0-100,那么范围将是多少?
如果您有 0 到 100 之间的准确率得分,也许 60% 很好,因为问题很难;也许 98% 很好,因为问题很简单。
我无法普遍回答这个问题,抱歉。
一个判断模型是否具有技能的好方法是将其与许多其他模型进行比较,或者与可靠的基线模型进行比较(例如,良好的相对度量)。
嗨,Jason,
那么多元时间序列预测呢?
假设我们用同一个模型预测 3 个时间序列,您将如何提供结果?每个时间序列?误差的平均值?
谢谢您的时间:)
您可以决定如何评估模型的技能,也许是所有预测数据点的 RMSE。
有关多元输入的帖子请参阅
https://machinelearning.org.cn/multivariate-time-series-forecasting-lstms-keras/
有关多步预测的帖子请参阅
https://machinelearning.org.cn/multi-step-time-series-forecasting-long-short-term-memory-networks-python/
晚上好,有一个问题,如果我想获得最大误差,应该怎么做?
您说的最大误差是指什么?
您好,感谢您的帖子。如果我理解正确,这里提到的方法对于纠正预测很有用,前提是测试样本的真实值很容易获得并包含在纠正过程中。我想知道是否有类似的方法可以处理您的训练/测试数据中存在明显残差趋势的情况,并且我想创建一个利用这些趋势的模型,而在新的样本中无法获得真实值?
ARIMA 和 ETS 模型可以处理您数据中的趋势。
先生,您好,
我正在为每个零售店的每种产品预测销量。我希望 85% 的店-产品组合的准确率超过 70%。因此,我正在计算每个预测的绝对百分比误差。但是我的数据中有很多零,我无法完全评估模型。
根据我的网络搜索,我发现平均绝对缩放误差 (MASE) 是销售预测的完美度量。但我没有找到如何使用和计算它的确切解释。由于我处理的是多个商店和多个产品,因此我的数据集中有多个时间序列。我拥有所有预测,但不知道如何评估?
请提供一些关于如何做到这一点以及如何计算多个时间序列的 MASE 的详细信息。
提前非常感谢。
抱歉,我没有 MASE 的资料。
也许可以在 scholar.google.com 上搜索示例?
感谢您的建议。
你好,
在 Spyros, Makridakis 的《统计和机器学习预测方法:关注点和前进方向》一书中,他们使用了这个 sMAPE 的代码。将其添加为 def,并像使用 mse 一样使用它。我认为它应该有效。
你好,
您知道有哪些误差指标会比大值误差更惩罚持续时间更长的误差吗?
谢谢,
bobby
您说的持续时间更长的误差是指什么?
嘿,我想知道您是否知道一个对异常值不那么敏感的误差度量?我的时间序列中有一些难以预测的高峰,我想在评估我的预测时,不让这些误差占据太大的权重。
也许是中位数绝对误差?
嘿,您能告诉我如何从 RMSE 值知道我的模型的准确性吗?
您无法计算回归问题的准确性,我在这里对此有更详细的解释
https://machinelearning.org.cn/classification-versus-regression-in-machine-learning/
如何知道在我们的时间序列预测中使用哪种误差(RMSE、MSE、MAE)?
您可以与项目利益相关者沟通,了解他们想知道关于模型在此问题上的性能的哪些信息 - 然后相应地选择指标。
如果不确定,请使用 RMSE,因为单位将与目标变量的比例相同,并且易于理解。
嗨
再次感谢您的精彩文章,抱歉,我刚才在另一个话题上也问了您一个问题。
跟踪误差 = 实际值与预测值之间差值的标准差
我想使用跟踪误差来衡量时间序列预测性能。有什么理由我不应该使用它吗?
谢谢
Dav
我不熟悉它,抱歉。
嗨,Jason,
我对预测偏差感到困惑:“非零的平均预测误差值表明模型倾向于过度预测(正误差)或低估预测(负误差)”
实际值 – 预测值 > 0 如果预测值较低,并且我认为那是低估预测,但在您的示例中,偏差为负,而预测值较高
expected = [0.0, 0.5, 0.0, 0.5, 0.0]
predictions = [0.2, 0.4, 0.1, 0.6, 0.2]
是哪里出了错,还是我遗漏或没有理解什么?
非常感谢
是的,我搞反了,谢谢。
负数是高估预测,正数是低估预测。
已修复。
我真的很喜欢读您的帖子,谢谢您。如果我没意见的话,我想问一个问题
假设我们处理的数据集,您正在预测人口增长(人数),而您数据集中的最新值约为 3700 万人口。
假设我们正确地进行了所有预测和计算,而我们目前的情况是
平均绝对误差:52,386
均方误差:3,650,276,091
均方根误差:60,417
(为了好玩)平均绝对百分比误差:0.038
在处理如此大规模的数据集时,如何解释这些数字?我读到“越接近零越好”,但我认为我的数据集规模意味着 60,417 实际上是一个相当不错的数字,但我不太确定。
(不确定这是否是足够的数据来判断)
如果模型优于朴素预测,那么它就具有技能。
https://machinelearning.org.cn/faq/single-faq/how-to-know-if-a-model-has-good-performance
这有帮助吗?
这些矩阵是否可以用于 ARIMA 模型和 LSTM?如果可以,它是否与您的示例描述相同?
抱歉,我没明白。
也许您可以详细说明或重新表述问题?您说的“ARIMA 的矩阵”是什么意思?
嗨,Jason,
感谢您的精彩文章。你能帮我处理这个场景吗?
我的实际值和预测值都有很多 0。哪个指标更适合衡量预测准确率的百分比?我的最终用户查看的准确性是以百分比格式。
Actual -> 0,1,1,4,1,1,0
Predicted-> 1,0,0,2,1,1,0
不客气!
也许可以探讨一下 MAE 和 RMSE,甚至是其他的指标,然后选择一个最能体现您项目目标的指标。
平方损失和均方误差之间有什么区别吗?更多参考——这篇研究论文的第6页 https://arxiv.org/pdf/1511.05942.pdf
和我预期的相同。我没有检查您的论文,抱歉。
你好 Jason,我非常喜欢您的作品。
建议进行修正,在 MAE 下,第二行是否应该用“预测误差值”代替“预测值”?
谢谢,已修复!
Jason,您好!感谢这篇精彩的文章/教程。
我正在尝试使用四年的每日数据进行预测,这些数据是关于杂货销售的。
我准备了几个模型进行预测。一个有趣的发现是,在 MAPE 方面,我的 SARIMA 模型优于 RandomForest 和其他树模型,但在 RMSE 方面,Random Forests 和其他树机器学习模型表现更好。我对这个问题感到困惑,难以做出明确的判断。您对此有什么看法吗?
选择一个指标来选择模型,然后选择一个在该指标上表现良好的模型。
你好,Jason!您的书籍和文章是我问题的唯一解决方案,但我也有一个问题,我们如何衡量多步预测模型的性能,比如 3 天?例如 RMSE = [2, 4, 5],我们可以取这三个的平均 RMSE 吗?其次,我们能否测量时间序列数据的决定系数?这是一个有效的衡量指标吗?
谢谢。
是的,如果您愿意,可以单独计算每个预测前导时间的误差。
我想我在电力预测教程中对此有示例
https://machinelearning.org.cn/?s=power+forecasting&post_type=post&submit=Search
亲爱的 Jason,非常感谢您的回复。还有一个问题,我能否计算这三个的平均 RMSE、MAE?这是一个有效的衡量指标吗?以及决定系数(R-squared)?它是否是时间序列数据的有效指标?
当然,尽管我建议为您的项目选择一个指标来优化——因为有时它们可能会不一致。
非常感谢您的回复和时间。祝您有美好的一天!
不客气。
嘿,不知道您是否还在回复,但我如何找到使用 MAR 和 MARp 的标准化准确度,即大量随机猜测的 MAR?
“MAR”是什么?
你好 Jason,
感谢您整理了这些。您对使用加权 RMSE 指标有何看法?
此致,
S
没有特别的看法。我建议仔细选择最能体现您项目目标的指标。
嗨,Jason,
我预测接下来 15/30 天的会话计数。是否有任何技术可以找出预测值的准确性?
供您参考:我没有实际值可以比较。
我们无法计算回归模型的准确性,请参阅此链接
https://machinelearning.org.cn/faq/single-faq/how-do-i-calculate-accuracy-for-regression
你好,Jason。
我正在研究一个模型,在这个模型中,预测得少比预测得多更好,并且重要的是要惩罚大的错误。问题是 rmse 惩罚大的错误,但不关心预测得多还是少,而 MAE 可能倾向于负偏差,但不惩罚大的错误。
我的问题是,是否应该将预测分开如下
– 如果一个误差 e(t) 被认为是太大了(与真实值的差大于预定百分比,例如 40%),那么它就像 rmse 一样被平方
– 如果预测值高于需求,则误差乘以大于一的因子(例如 2)
– 对于其他“正常预测”,我们继续使用 mae
然后我们得到三个平均误差,从中我们得到最终平均值
我很想听听您的意见。
谢谢你。
Kay98,您好……这实际上是选择损失函数的一个很好的方法。
以下资源提供了更多关于如何选择损失函数的清晰解释。
https://machinelearning.org.cn/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
如果您有任何其他问题,请告诉我们。
此致,
你好!
我还有一个问题。我实际上找不到如何将 RMSE 计算为百分比值的答案。
我感谢您的帮助。
谢谢你。
亲爱的 Jason,
如果我使用整个时间序列数据进行训练,那么训练误差(使用您博客中的任何误差指标)是模型准确性的良好指标吗?
情况是这样的,我使用 Auto Arima 进行了时间序列预测实验,并通过拆分数据集到训练集和测试集来评估模型。但是,现在我的模型将投入实际使用,我将所有数据输入模型进行训练,以避免丢失任何信息。我仍然需要显示一个模型准确性的指标来表明我的模型的预测有多可靠。所以,我想知道在不考虑测试集的情况下,训练误差是否可以被视为模型的准确性指标。
祝好,
Samin
Samin,您好……以下内容可能对您有帮助
https://machinelearning.org.cn/a-gentle-introduction-to-the-challenge-of-training-deep-learning-neural-network-models/
https://machinelearning.org.cn/training-validation-test-split-and-cross-validation-done-right/
你好,
在您的示例中,rmse = 0.1483。那么我们该如何解释呢?
Syamini,您好……以下内容可能对您有帮助
https://machinelearning.org.cn/regression-metrics-for-machine-learning/
MSE 是在实际数据集上计算的还是在归一化数据集上计算的?
Ankit,您好……两者都可以,因为它是用于相对比较的指标。