将扩展窗口交叉验证的statsforecast实现应用于不同长度的多个时间序列

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

我希望通过在时间序列数据集上使用 statsforecast 实施扩展窗口交叉验证来评估不同经典时间序列预测模型的准确性,该数据集具有许多唯一 ID,这些 ID 具有不同的时间长度(范围在 1 到 48 个月之间)。我想预测每个窗口结束月份后的接下来七个月,并使用一些误差指标(例如 sMAPE)评估准确性。不同的时间序列存在潜在的季节性和趋势,所以我也想在交叉验证过程中捕获这些。但是,我有困难并且没有完全理解包的交叉验证功能中的不同参数(

step_size
n_windows
test_size
)。

有人可以建议我设置正确的参数吗?我正在寻找的功能是否可以通过包中提供的功能实现?如何确定

step_size
test_size
n_windows
的最佳值?

仅供参考,我的数据如下所示:

df=

唯一_id ds y
0 111111 2000-01-01 9
1 111111 2000-02-01 9
2 111111 2000-03-01 10
3 111111 2000-04-01 4
... ... ... ...
999999 111269 2003-10-01 32532
1000000 111269 2003-11-01 0
1000001 111269 2003-12-01 984214

明确地说,各个 unique_id 的历史记录可能会有所不同(即,时间序列的长度在 unique_ids 之间不相等。)

我已经使用必要的模型实例化了我的 StatsForecast 对象:

sf = StatsForecast(
    df=df,
    models=[AutoARIMA(season_length=12), AutoETS(error_type='zzz'), Naive()],
    freq='MS',
    n_jobs=-1,
    fallback_model=Naive()
)

然后,我调用cross_validation方法:

results_cv = sf.cross_validation(
    h=7 # Predict each of the future seven months
    step_size=?,
    n_windows=?
)

我已经尝试了step_size和n_windows的各种参数值,也尝试了单独的test_size(例如,7,因为我想比较每个窗口中过去7个月的实际值和预测值),但我总是留下出现以下错误:

ValueError: could not broadcast input array from shape (y,) into shape (z,)

我希望最终结果看起来与 statsforecast 教程中提供的数据框类似: screenshot from the GitHub example

或向下滚动到“crossvaldation_df.head()”

任何指点将不胜感激。谢谢!

python time-series cross-validation statsforecast
2个回答
0
投票

我遇到了与使用大于系列尺寸的

step_size
相关的类似问题。您可以尝试过滤掉较小的系列或尝试在这些系列的开头添加零。

您可以通过以下方式检查:

df.groupby('unique_id').agg({'y': 'count'}).sort_values(by='y')

希望有帮助!


0
投票

根据我的理解/实验,对地平线、截止/n_windows 和步长的各种值进行:https://github.com/moj-analytical-services/splink/discussions/2087#discussion-6404591

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