在 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
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 来检查这一点,两个函数都会得到相同的结果。