用于時間序列概率預測的共形分位數(shù)回歸
預測中的不確定性對于決策者了解潛在結(jié)果和相關(guān)風險的范圍非常重要。通過量化不確定性,企業(yè)可以做出更明智的決策,并有效地分配資源。關(guān)于預測的不確定性,前面有"用于時間序列概率預測的定量回歸“ 和 ”時間序列概率預測的共形預測“的介紹。本文將介紹另一項重要技術(shù)--共形分位數(shù)回歸(CQR)。共形分位數(shù)回歸(CQR)結(jié)合了分位數(shù)回歸(QR)和共形預測(CP),使兩者相輔相成。
分位數(shù)回歸 QR
QR 估算的是目標變量的條件量值,如中位數(shù)或第 90 個百分位數(shù),而不是條件均值。通過分別估計不同水平預測變量的條件量值,可以很好地處理異方差。雖然大多數(shù)情況下量化值可以提供準確的預測區(qū)間,但當模型假設(shè)被違反時,量化值預測可能會不準確。
共形預測 CP
另一方面,CP 能確保預測區(qū)間中的實際值,而無需明確關(guān)注特定的量化值。它根據(jù)實際數(shù)據(jù)而非任何模型規(guī)范形成預測區(qū)間。對所有數(shù)據(jù)范圍都會產(chǎn)生一個固定的寬度。
共形分位數(shù)回歸CQR
為什么不同時使用 QR 和 CP 呢?共形分位數(shù)回歸(CQR)技術(shù)提供了一個值得稱贊的解決方案,可以提供具有有效覆蓋保證的預測區(qū)間。這些覆蓋保證是由量回歸產(chǎn)生的。CQR 調(diào)整了預測區(qū)間,以確保實際值總是落在預測區(qū)間內(nèi),并達到所需的置信水平。
什么是CQR
CQR(Conformal Quantile Regression)的基本思想是建立分位數(shù)回歸(QR)模型用于預測區(qū)間,并使用CP技術(shù)進行調(diào)整。上一章中介紹了CP如何建立預測區(qū)間,通過獲取點預測值與實際值之間的誤差得出容差區(qū)間,然后將其與點估計值相連形成預測區(qū)間。然而,QR已經(jīng)給出了預測區(qū)間。要調(diào)整預測區(qū)間,我們需要修改CP方法為CQR,因為在量化預測中,CP以點預測為中心,而應用于預測區(qū)間的CQR則以預測區(qū)間的兩個錨點(下限和上限)為中心。
CQR的發(fā)展過程稱為一致性得分。符合性得分涉及實際值與預測區(qū)間上下限之間的距離。如果實際值持續(xù)高于上限或下限,則應根據(jù)一致性得分調(diào)整預測區(qū)間,確保在選定的時間水平下,實際值在預測區(qū)間內(nèi)。一致性得分是大括號中兩個項中較大的一項。
公式(1)
其中,yt是實際值,Ql和Qu是低量化值和高量化值(下限和上限),ct是符合性得分
我們以圖(A)中的示例來解釋等式(1)。假設(shè)有六個實際值y1至y6及其相應的預測區(qū)間。在第一次預測中,實際值y1的預測區(qū)間在下限Ql和上限Qu之間,而y1更接近上限QU。每個預測區(qū)間都會有一個一致性得分。根據(jù)公式(1),第一個預測值c1的一致性分值為-2,處于-2和-5之間。當y在預測區(qū)間內(nèi)時,一致性總是負數(shù),而當實際值在預測區(qū)間外時,一致性總是正數(shù)。
圖(A):一致性得分
我們將為一致性得分繪制一個直方圖,如圖(B)所示。左側(cè)的負分表示實際值在預測區(qū)間內(nèi)。右側(cè)的正分數(shù)表示預測區(qū)間無法捕捉實際值。
圖(B):一致性得分直方圖
可以根據(jù)容忍度確定一個閾值s。根據(jù)圖(B),95% 一致性得分是 6.0。預測區(qū)間將會擴大,保證實際值包含在預測區(qū)間內(nèi)。
形式上,CQR 根據(jù)下面的公式 (2) 調(diào)整分位數(shù)回歸的預測區(qū)間。它從下限Ql中減去閾值s,再將閾值s加到上限QU:
公式(2)
一致性得分可為負,表示所有預測區(qū)間均包含實際值。在這種情況下,符合性得分的加減可能導致預測區(qū)間變短。CQR 會根據(jù) QR 在區(qū)間內(nèi)的表現(xiàn)調(diào)整預測區(qū)間,對于始終低估或高估的 QR 會做出相應調(diào)整。
CQR 的構(gòu)建
其過程可概括如下:
- 首先,我們將歷史時間序列數(shù)據(jù)分為訓練期、校準期和測試期。
- 然后在訓練數(shù)據(jù)上訓練分位數(shù)回歸模型。應用訓練模型生成校準數(shù)據(jù)的量化預測。
- 然后根據(jù)公式 (1) 計算一致性得分。繪制符合性得分直方圖,以定義容差水平,如圖 (B)。
- 然后根據(jù)公式 (2) 調(diào)整不同量化值的預測區(qū)間。
環(huán)境要求
NeuralProphet 有三個選項:(i) 分位數(shù)回歸 (QR)(ii) 保形預測 (CP)(iii) 保形分位數(shù)回歸 (CQR),用于處理預測的不確定性。
!pip install neuralprophet
!pip uninstall numpy
!pip install git+https://github.com/ourownstory/neural_prophet.git numpy==1.23.5
數(shù)據(jù)
%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')
# 數(shù)據(jù)獲?。汗娞枺簲?shù)據(jù)STUDIO 后臺回復 云朵君
data.tail()
圖(C):自行車租賃數(shù)據(jù)
數(shù)據(jù)集包含每日租賃需求、天氣信息(如溫度和風速)等多變量數(shù)據(jù)。在進行建模之前,需要對數(shù)據(jù)進行最基本的準備。NeuralProphet 要求列名為ds和y。
# convert string to datetime64
data["ds"] = pd.to_datetime(data["dteday"])
df = data[['ds','cnt']]
df.columns = ['ds','y']
建模
使用具有趨勢和季節(jié)性模式的NeuralProphet模型,可以添加其他組件,如AR、假期和其他協(xié)變量。目前代碼已進行了注釋。
from neuralprophet import NeuralProphet
quantile_list=[0.05,0.95 ]
# Model and prediction
cqr_model = NeuralProphet(
quantiles=quantile_list,
#n_changepoints=10,
yearly_seasnotallow=True,
weekly_seasnotallow=True,
daily_seasnotallow=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
訓練、驗證和測試數(shù)據(jù)
共形分位數(shù)回歸的一個關(guān)鍵步驟是將訓練數(shù)據(jù)分為訓練數(shù)據(jù)和校準數(shù)據(jù),用于構(gòu)建符合性得分。
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)]
用三種顏色繪制不同的數(shù)據(jù)集。
圖(D)
驗證數(shù)據(jù)作為模型驗證集。
metrics = cpr_model.fit(df_train, validation_df=df_cal, progress="bar")
metrics.tail()
圖片
共形分位數(shù)回歸
創(chuàng)建一個future數(shù)據(jù)集,在df數(shù)據(jù)的最后日期之后有50個周期。它將包括所有歷史數(shù)據(jù)的模型預測。或者,如果指定n_historic_predictinotallow=40,它將只包含40個歷史數(shù)據(jù)點及其預測結(jié)果。
NeuralProphet 的 CQR 選項是method=cqr。我們將通過.conformal_prediction()啟用保形預測。
future = cpr_model.make_future_dataframe(df, periods=50,
n_historic_predictinotallow=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
圖片
繪制預測結(jié)果和預測區(qū)間圖。CQR 預測區(qū)間寬度變化。在圖(E)中,95% 的情況下,實際值都在預測區(qū)間內(nèi),因為 CP 可以確保實際值在預測區(qū)間內(nèi)的時間為95%。
fig = cqr_model.plot(cqr_forecast,
#plotting_backend = "matplotlib"
plotting_backend="plotly-static"
)
圖(E)