层次预测 👑

大型时间序列集合按不同的聚合级别组织,通常要求它们的预测遵循聚合约束,这给创建能够一致预测的新算法带来了挑战。

HierarchicalForecast 提供了一系列调和方法,包括 BottomUpTopDownMiddleOutMinTraceERM。以及概率一致预测,包括 NormalityBootstrapPERMBU

🎊 特性

  • 经典的协调方法:
    • BottomUp:简单地将数据加到上层。
    • TopDown:通过层级分配顶部层级的预测。
  • 替代的协调方法:
    • MiddleOut:在中间层级固定基本预测。基本预测之上的层级使用自下而上的方法,而以下层级使用自上而下的方法。
    • MinTrace:通过最小迹协调方法,最小化一致预测空间的总预测方差。
    • ERM:优化协调矩阵,最小化带有L1正则化的目标。
  • 概率一致方法:
    • Normality:在正态假设下使用最小迹方差-协方差封闭形式矩阵。
    • Bootstrap:使用Gamakumara的自助方法生成分层协调预测的分布。
    • PERMBU:通过重新注入估计秩排列copula的多变量依赖性,协调独立样本预测,并执行自下而上的聚合。

还缺少什么吗?请在这里提交问题或通过Slack与我们联系。

📖 为什么?

简短:我们希望通过为工业和学术界的层次预测任务提供可靠的基准和基准测试,来为机器学习领域做出贡献。完整的论文在这里。

详细HierarchicalForecast 集成了公开可用的处理过的数据集、评估指标和一套经过筛选的统计基准。在这个库中,我们提供使用示例和大量实验的参考,在这些实验中我们展示了基准的使用,并评估了其预测的准确性。通过这项工作,我们希望通过弥合统计和计量经济建模的差距,对机器学习预测做出贡献,同时提供开发新型层次预测算法的工具,这些算法植根于对这些成熟模型的全面比较。我们打算继续维护并增加这个库,促进预测社区的合作。

💻 安装

PyPI

您可以从 Python 包索引 安装 HierarchicalForecast发布版本

pip install hierarchicalforecast

(建议在 python 虚拟环境或 conda 环境中安装。)

Conda

您也可以从 conda 安装 HierarchicalForecast发布版本

conda install -c conda-forge hierarchicalforecast

(建议在 python 虚拟环境或 conda 环境中安装。)

开发模式

如果您想对代码进行一些修改并实时查看效果(无需重新安装),请按照以下步骤操作:

git clone https://github.com/Nixtla/hierarchicalforecast.git
cd hierarchicalforecast
pip install -e .

🧬 如何使用

下面的例子需要 statsforecastdatasetsforecast 作为额外的包。如果未安装,请通过您喜欢的方法进行安装,例如 pip install statsforecast datasetsforecastdatasetsforecast 库允许我们下载层次数据集,我们将使用 statsforecast 来计算需要进行调和的基本预测。

您可以在 Colab 中打开此示例 在 Colab 中打开

import numpy as np
import pandas as pd

#获取层次数据集
from datasetsforecast.hierarchical import HierarchicalData

# 计算基本预测,不作调和
from statsforecast.core import StatsForecast
from statsforecast.models import AutoARIMA, Naive

#获取层次调和方法和评估
from hierarchicalforecast.core import HierarchicalReconciliation
from hierarchicalforecast.evaluation import HierarchicalEvaluation
from hierarchicalforecast.methods import BottomUp, TopDown, MiddleOut

# 加载 TourismSmall 数据集
Y_df, S, tags = HierarchicalData.load('./data', 'TourismSmall')
Y_df['ds'] = pd.to_datetime(Y_df['ds'])

#分割训练/测试集
Y_test_df  = Y_df.groupby('unique_id').tail(4)
Y_train_df = Y_df.drop(Y_test_df.index)

# 计算基本的 auto-ARIMA 预测
fcst = StatsForecast(df=Y_train_df,
                     models=[AutoARIMA(season_length=4), Naive()],
                     freq='Q', n_jobs=-1)
Y_hat_df = fcst.forecast(h=4)

# 调和基本预测
reconcilers = [
    BottomUp(),
    TopDown(method='forecast_proportions'),
    MiddleOut(middle_level='Country/Purpose/State',
              top_down_method='forecast_proportions')
]
hrec = HierarchicalReconciliation(reconcilers=reconcilers)
Y_rec_df = hrec.reconcile(Y_hat_df=Y_hat_df, Y_df=Y_train_df,
                          S=S, tags=tags)

评估

def mse(y, y_hat):
    return np.mean((y-y_hat)**2)

evaluator = HierarchicalEvaluation(evaluators=[mse])
evaluator.evaluate(Y_hat_df=Y_rec_df, Y_test=Y_test_df.set_index('unique_id'),
                   tags=tags, benchmark='朴素')

如何引用

以下是完整的 论文

@article{olivares2022hierarchicalforecast,
    author    = {Kin G. Olivares 和
                 Federico Garza 和 
                 David Luo 和 
                 Cristian Challú 和
                 Max Mergenthaler 和
                 Souhaib Ben Taieb 和
                 Shanika L. Wickramasuriya 和
                 Artur Dubrawski},
    title     = {{HierarchicalForecast}: 一个用于Python中层次预测的参考框架},
    journal   = {正在进行中的论文,提交给《机器学习研究杂志》。},
    volume    = {abs/2207.03517},
    year      = {2022},
    url       = {https://arxiv.org/abs/2207.03517},
    archivePrefix = {arXiv}
}

If you find the code useful, please ⭐ us on Github