飞镖中回测和历史预测的误差指标是不同的

问题描述 投票:0回答:1

在 darts 中使用回测和历史预测时,我预计会出现相同的错误。然而,在进行测试时,我对相同的输入变量得到不同的 MAPE 值。有人可以解释这是如何发生的吗?如何使这两种方法具有可比性?

示例:

import pandas as pd
from darts import TimeSeries
from darts.models import NaiveDrift
from darts.metrics import mape

df = pd.read_csv('AirPassengers.csv')

series = TimeSeries.from_dataframe(df, 'Month', '#Passengers')

print("Backtest MAPE: ", NaiveDrift().backtest(series,
                                            start=12,
                                            forecast_horizon=6,
                                            metric=mape))

historical_forecast = NaiveDrift().historical_forecasts(series,
                          start=12,
                          forecast_horizon=6,
                          verbose=False)


print("Historical Forecast MAPE: ", mape(historical_forecast, series))

输出:

回测MAPE:16.821355933599133

历史预测MAPE:21.090231183002143

链接

文档链接:https://unit8co.github.io/darts/ generated_api/darts.models.forecasting.baselines.html

数据集链接:https://www.kaggle.com/datasets/rakannimer/air-passengers

python forecasting u8darts
1个回答
0
投票

MAPE 不同的原因是用于计算它们的数据不同。 Historical_forecast() 和 backtest() 对于参数“last_points_only”有不同的默认值。对于history_forecast(),该参数设置为True,而对于backtest(),该参数设置为False。

这意味着 Historical_forecast 默认情况下会生成一个系列,并根据该系列检查准确性。另一方面,回测会生成多个序列并对它们之间的误差进行平均。 backtest() 函数的默认“stride”参数为 1,这意味着在进行一次预测后,它将向前移动一个时间步并生成另一个时间步,再向前移动一个时间步并生成另一个时间步,依此类推。这些多个系列的平均 MAPE 与历史预测中的一个系列不同。

如果last_points_only设置为True(在history_forecast()中默认是这样),当函数前进一个时间步时,它只会在计算中包含新的(最后一个)时间序列点,而不是再次包含整个序列.

您可以通过将 backtest() 中的“last_point_only”参数设置为 True 来检查这一点,两个函数都会得到相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.