用于时间序列概率预测的共形分位数回归


预测中的不确定性对于决策者了解潜在结果和相关风险的范围非常重要。通过量化不确定性,企业可以做出更明智的决策,并有效地分配资源。关于预测的不确定性,前面有"用于时间序列概率预测的定量回归“ 和 ”时间序列概率预测的共形预测“的介绍。本文将介绍另一项重要技术--共形分位数回归(CQR)。共形分位数回归(CQR)结合了分位数回归(QR)共形预测(CP),使两者相辅相成。

分位数回归 QR

QR 估算的是目标变量的条件量值,如中位数或第 90 个百分位数,而不是条件均值。通过分别估计不同水平预测变量的条件量值,可以很好地处理异方差。虽然大多数情况下量化值可以提供准确的预测区间,但当模型假设被违反时,量化值预测可能会不准确。

共形预测 CP

另一方面,CP 能确保预测区间中的实际值,而无需明确关注特定的量化值。它根据实际数据而非任何模型规范形成预测区间。对所有数据范围都会产生一个固定的宽度。

共形分位数回归CQR

为什么不同时使用 QR 和 CP 呢?共形分位数回归(CQR)技术提供了一个值得称赞的解决方案,可以提供具有有效覆盖保证的预测区间。这些覆盖保证是由量回归产生的。CQR 调整了预测区间,以确保实际值总是落在预测区间内,并达到所需的置信水平。

什么是CQR

CQR(Conformal Quantile Regression)的基本思想是建立分位数回归(QR)模型用于预测区间,并使用CP技术进行调整。上一章中介绍了CP如何建立预测区间,通过获取点预测值与实际值之间的误差得出容差区间,然后将其与点估计值相连形成预测区间。然而,QR已经给出了预测区间。要调整预测区间,我们需要修改CP方法为CQR,因为在量化预测中,CP以点预测为中心,而应用于预测区间的CQR则以预测区间的两个锚点(下限和上限)为中心。

CQR的发展过程称为一致性得分。符合性得分涉及实际值与预测区间上下限之间的距离。如果实际值持续高于上限或下限,则应根据一致性得分调整预测区间,确保在选定的时间水平下,实际值在预测区间内。一致性得分是大括号中两个项中较大的一项。

公式(1)

其中,yt是实际值,QlQu是低量化值和高量化值(下限和上限),ct是符合性得分

我们以图(A)中的示例来解释等式(1)。假设有六个实际值y1y6及其相应的预测区间。在第一次预测中,实际值y1的预测区间在下限Ql和上限Qu之间,而y1更接近上限QU。每个预测区间都会有一个一致性得分。根据公式(1),第一个预测值c1的一致性分值为-2,处于-2和-5之间。当y在预测区间内时,一致性总是负数,而当实际值在预测区间外时,一致性总是正数。

图(A):一致性得分

我们将为一致性得分绘制一个直方图,如图(B)所示。左侧的负分表示实际值在预测区间内。右侧的正分数表示预测区间无法捕捉实际值。

图(B):一致性得分直方图

可以根据容忍度确定一个阈值s。根据图(B),95% 一致性得分是 6.0。预测区间将会扩大,保证实际值包含在预测区间内。

形式上,CQR 根据下面的公式 (2) 调整分位数回归的预测区间。它从下限Ql中减去阈值s,再将阈值s加到上限QU

公式(2)

一致性得分可为负,表示所有预测区间均包含实际值。在这种情况下,符合性得分的加减可能导致预测区间变短。CQR 会根据 QR 在区间内的表现调整预测区间,对于始终低估或高估的 QR 会做出相应调整。

CQR 的构建

其过程可概括如下:

  • 首先,我们将历史时间序列数据分为训练期、校准期和测试期。
  • 然后在训练数据上训练分位数回归模型。应用训练模型生成校准数据的量化预测。
  • 然后根据公式 (1) 计算一致性得分。绘制符合性得分直方图,以定义容差水平,如图 (B)。
  • 然后根据公式 (2) 调整不同量化值的预测区间。

环境要求

NeuralProphet 有三个选项:
(i) 分位数回归 (QR)
(ii) 保形预测 (CP)
(iii) 保形分位数回归 (CQR),用于处理预测的不确定性。

!pip install neuralprophet
!pip uninstall numpy
!pip install git+https://github.com/ourownstory/neural_prophet.git numpy==1.23.5

数据

%matplotlib inline
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
import logging
import warnings
logging.getLogger('prophet').setLevel(logging.ERROR)
warnings.filterwarnings("ignore")

data = pd.read_csv('/bike_sharing_daily.csv')
# 数据获取:公众号:数据STUDIO 后台回复 云朵君
data.tail()
图(C):自行车租赁数据

数据集包含每日租赁需求、天气信息(如温度和风速)等多变量数据。在进行建模之前,需要对数据进行最基本的准备。NeuralProphet 要求列名为dsy

# convert string to datetime64
data["ds"] = pd.to_datetime(data["dteday"])
df = data[['ds','cnt']]
df.columns = ['ds','y']

建模

使用具有趋势和季节性模式的NeuralProphet模型,可以添加其他组件,如AR、假期和其他协变量。目前代码已进行了注释。

from neuralprophet import NeuralProphet
quantile_list=[0.05,0.95 ]
# Model and prediction
cqr_model = NeuralProphet(
    quantiles=quantile_list,
    #n_changepoints=10,
    yearly_seasonality=True,
    weekly_seasonality=True,
    daily_seasonality=False,
    # Add the autogression
    #n_lags=10,
    # Forecast the next 50 days
    #n_forecasts= 50
)
cqr_model = cqr_model.add_country_holidays("US")
#cqr_model.set_plotting_backend("matplotlib")  # Use matplotlib

训练、验证和测试数据

共形分位数回归的一个关键步骤是将训练数据分为训练数据和校准数据,用于构建符合性得分。

df_train, df_test = cqr_model.split_df(df, valid_p=0.2)
df_train, df_cal = cqr_model.split_df(df_train, freq="D", valid_p=1.0 / 11)
[df_train.shape, df_test.shape, df_cal.shape]
# [(532, 2), (146, 2), (53, 2)]

用三种颜色绘制不同的数据集。

图(D)

验证数据作为模型验证集。

metrics = cpr_model.fit(df_train, validation_df=df_cal, progress="bar")
metrics.tail()

共形分位数回归

创建一个future数据集,在df数据的最后日期之后有50个周期。它将包括所有历史数据的模型预测。或者,如果指定n_historic_predictions=40,它将只包含40个历史数据点及其预测结果。

NeuralProphet 的 CQR 选项是method=cqr。我们将通过.conformal_prediction()启用保形预测。

future = cpr_model.make_future_dataframe(df, periods=50
     n_historic_predictions=True)

# Parameter for CQR
method = "cqr"
alpha = 0.05
# Enable conformal prediction on the pre-trained models
cqr_forecast = cqr_model.conformal_predict(
    # df_test, # You can also use df_test
    future,
    calibration_df=df_cal,
    alpha=alpha,
    method=method,
    show_all_PI=True,
)
cqr_forecast

绘制预测结果和预测区间图。CQR 预测区间宽度变化。在图(E)中,95% 的情况下,实际值都在预测区间内,因为 CP 可以确保实际值在预测区间内的时间为95%。

fig = cqr_model.plot(cqr_forecast, 
    #plotting_backend = "matplotlib"
    plotting_backend="plotly-static"
)

图(E)

往期推荐阅读


用于时间序列概率预测的分位数回归
用于时间序列概率预测的共形预测
时间序列 | 从开始到结束日期自增扩充数据
时间序列 | 重采样及频率转换
时间序列 | 时期(Period)及其算术运算
时间序列 | 字符串和日期的相互转换
时间序列 | pandas时间序列基础时间序列数据分析与预测之Python工具汇总
时间序列数据处理,不再使用pandas
用Python将时间序列转换为监督学习问题
使用 Auto-TS 自动化时间序列预测
终于把时间序列预测ARIMA模型讲明白了
亚马逊最新时序大模型Chronos:将时间序列作为一种语言进行学习一文彻底搞懂 Facebook 时间序列预测算法 Prophet 的研究
LazyProphet:使用 LightGBM 进行时间序列预测
一文讲透时间序列的平稳性一文解读时间序列基本概念时间序列数据的预处理方法总结
用LightGBM进行时间序列预测项目实战
时间序列预测中如何检测随机游走和白噪声
9个时间序列交叉验证方法的介绍和对比
基于树模型的时间序列预测实战时间序列分析和预测实战
基于趋势和季节性的时间序列预测实战
使用 Transformers 进行概率时间序列预测实战用LightGBM进行时间序列预测项目实战时间序列的季节性:3种模式及8种建模方法
PatchTST:长时间序列预测神器
又一个自动化时间序列分析与预测神器
用于时间序列预测的最佳深度学习模型总结时间序列预测任务的模型选择最全总结神经网络时间序列预测PyTorch-Forecasting基于Python的时间序列异常值检测XGBoost和LightGBM时间序列预测对比特征工程:时间特征构造以及时间序列特征构造使用PyTorch-LSTM进行单变量时间序列预测的示例教程如何检测时间序列中的异方差性如何做好多元时间序列特征工程?基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比用于时间序列异常值检测的全栈机器学习系统多变量时序预测中的向量自回归(VAR)再来一个时序异常检测工具:ADTK炒股必看的时序预测基本方法 -- 移动平均(SMA、EMA、WMA)
Transformer王者归来!无需修改任何模块,时序预测全面领先
一文讲透时序和序列数据的存储、搜索、分析及挖掘
基于深度学习模型的空气污染时序预测
🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉 PythonMySQL数据分析数据可视化机器学习与数据挖掘爬虫 等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递

相关推荐

  • 每天骑的共享单车是什么通信原理,有人了解过吗?
  • 北航博士,研究所月入两万,是一种什么体验?
  • 网传Ilya Sutskever的推荐清单火了,掌握当前AI 90%
  • 加速Python循环的12种方法,最高可以提速900倍
  • 周鸿祎的简历很拉风!
  • 深入浅出Kafka
  • 为什么 B 站的弹幕可以不挡人物?
  • 一个优秀 Maven 项目,各 Model 间最佳继承设计方案
  • 标星 43.1 K!最火跨平台笔记开源项目
  • 关于OIDC,一种现代身份验证协议
  • 16 个在面试前需要知道的系统设计概念
  • CSS加载会造成堵塞吗?
  • Spring Boot集成zookeeper快速入门Demo
  • 璩静认为打工人不如螺丝钉,对吗?
  • 万众期待!JavaScript 宣布 Signals 即将到来!颠覆性的 API !
  • Python 对象有哪几种,我们可以从哪些角度进行分类呢?
  • 面试官:偏向锁的十连问,你能接住几个?
  • 面试官:JVM 对锁都进行了哪些优化?
  • 领导年薪30w,五一节后再没来上班,同事说被别的公司挖走了,就在下班时,同事悄悄告诉我领导让他跳槽过去,给他涨薪50%。
  • @Async注解失效的 9 种场景