時間序列概率預測的共形預測
前面我們介紹了用于時間序列概率預測的分位數回歸,今天繼續學習基于概率預測的時間序列概率預測方法--共形預測。
現實世界中的應用和規劃往往需要概率預測,而不是簡單的點估計值。概率預測也稱為預測區間或預測不確定性,能夠提供決策者對未來的不確定性狀況有更好的認知。傳統的機器學習模型如線性回歸、隨機森林或梯度提升機等,旨在產生單一的平均估計值,而無法直接給出可能結果的數值范圍。如何從點估計擴展到預測區間,正是現代時間序列建模技術所關注的重點。
在預測建模中,我們知道模型的目標是為條件均值給出無偏估計。估計值與實際樣本值之間的差距被稱為誤差,體現了模型的不確定性。那么,如何量化這種不確定性呢?由于誤差代表了估計值與實際值之間的偏差,因此我們可以通過分析誤差的分布來量化不確定性的程度。
共形預測(Conformal Prediction,CP)正是一種基于這一思路的預測方法。它利用歷史數據,根據新的預測樣本點在已知誤差分布中的位置,為這個新預測給出一個范圍估計,使其以期望的置信度(如95%)落入此范圍內。值得注意的是,CP是一種與具體模型無關的元算法,可以應用于任何機器學習模型,從而將點估計擴展到概率預測區間。
概率預測的優勢在于,它不僅給出預測的平均水平,還能提供相應的不確定性量化信息。這種額外的不確定性信息對風險管理、決策優化等應用場景至關重要。比如在供應鏈、庫存管理等領域,通過概率預測可以權衡需求波動的風險,制定更加魯棒的規劃策略。
什么是共形預測
Conformal Prediction是一種非參數方法,用于生成具有概率保證的預測區域。它不依賴于特定的概率分布假設,而是通過計算數據點的“相似性”或“一致性”來產生預測。這種方法可以應用于各種類型的輸入數據(如連續變量、分類標簽、時間序列等)和輸出(如回歸、分類、排序等)。
技術分析
該項目實現了一套Python庫,包含多種算法,如Inference for Regression, Multi-class Classification等,以支持Conformal Prediction的應用。關鍵步驟包括:
- 訓練集準備:首先,對數據進行預處理,并將其分為訓練集和驗證集。
- 構建基礎模型:利用訓練集訓練一個基礎預測模型(如線性回歸、決策樹或神經網絡)。
- 計算非conformity分數:對于每個驗證集樣本,使用模型生成預測,并計算其與實際觀測值的非conformity分數。
- 確定閾值:通過將這些非conformity分數排序并應用α-level,確定劃分預測區間的閾值。
- 預測階段:對于新的未標記數據,根據該閾值生成預測區間。
這種框架允許用戶在保持預測性能的同時,為預測誤差提供嚴格的概率保證。
應用場景
- 金融風險評估:在信貸評分中,可以預測未來的違約概率,并給出置信區間,幫助金融機構做出更穩健的決策。
- 醫學診斷:在醫療預測中,可以估計治療效果的范圍,為醫生提供更全面的信息。
- 市場趨勢預測:在商業環境中,可以預測銷售量或股票價格,為策略制定者提供可靠參考。
特點
- 靈活性:適用于不同類型的預測問題和數據類型。
- 可解釋性:提供的預測區間有助于理解模型的不確定性。
- 無假設:不需要對數據的底層分布做假設,增強了泛化能力。
- 概率保證:可以量化錯誤率,提高預測的可靠性。
共形回歸(Conformal Regression)是一種獲得預測區間的有效方法,其構造過程可以概括為以下幾個步驟:
- 計算誤差分布 首先計算歷史數據中每個樣本點的預測誤差,即預測值與真實值之間的絕對差值。然后將這些誤差值從小到大排序。
- 確定誤差臨界值 在排序后的誤差分布中,選取一個臨界值,使得小于等于該臨界值的誤差所占比例等于期望的置信度(如95%)。該臨界值被視為可接受的最大預測誤差。
- 構建預測區間 對于新的預測樣本點,其預測區間被設定為[預測值-誤差臨界值, 預測值+誤差臨界值]。根據誤差臨界值的選取,該預測區間能以期望的置信度(如95%)包含真實值。
共形回歸的優勢在于,它是一種與具體模型無關的元算法,可以應用于任何機器學習回歸模型的結果之上,從點估計擴展到概率預測區間。其關鍵是利用歷史誤差分布來量化新預測的不確定性,為決策過程提供了更多不確定性信息。
需要指出的是,共形回歸所構建的預測區間是保守的,其寬度會隨著置信度的提高而增加。在一些對過度保守不利的應用場景中,可以考慮引入其他校正方法來縮小區間寬度。另一方面,共形技術還可以推廣到分類、異常檢測等其他機器學習任務。
共形預測的構造
這是在尋找預測區間的程序中使用的共形預測(CP)策略。請注意,它對模型規格和基礎數據分布不做任何假設。CP 與模型無關--適用于任何建模技術。共形預測技術由 Volodya Vovk、Alexander Gammerman 和 Craig Saunders(1999 年) 以及 Harris Papadopoulos、Kostas Proedrou、Volodya Vovk 和 Alex Gammerman(2002 年)提出。共形預測算法的工作原理如下:
- 將歷史時間序列數據分為訓練期、校準期和測試期。
- 在訓練數據上訓練模型。
- 使用訓練好的模型對校準數據進行預測。然后繪制預測誤差直方圖,并定義如圖 (A) 所示的容差水平。
- 將容差區間加減到任何未來點估算中,包括測試數據中的預測,以提供預測區間。
環境要求
在預測區間上,NeuralProphet 有三種選擇:(i) 分位數回歸 (QR)(ii) 共形預測 (CP)(iii) 共形分位數回歸 (CQR)。
你將按照標準安裝程序 pip install NeuralProphet 來安裝 NeuralProphet。
!pip install neuralprophet
!pip uninstall numpy
!pip install git+https://github.com/ourownstory/neural_prophet.git numpy==1.23.5
數據
這里我們將直接加載數據。這里的數據集可以直接在公眾號:數據STUDIO 里搜索 開源 23 個優秀的機器學習數據集,這里有提供。
%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")
# 數據獲?。涸诠娞枺簲祿TUDIO 后臺回復 云朵君
data = pd.read_csv('/bike_sharing_daily.csv')
data.tail()
自行車租賃數據
這個數據集包含多變量數據,每天的租賃需求和其他天氣信息(如溫度和風速)。我們需要做最基本的數據準備來進行建模。NeuralProphet 要求列名為 ds 和 y。
# 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, set_log_level
cp_model = NeuralProphet(
yearly_seasnotallow=True,
weekly_seasnotallow=True,
daily_seasnotallow=False,
)
cp_model.set_plotting_backend("plotly-static")
訓練、驗證和測試數據
共形預測或共形分位數回歸技術的一個重要的步驟是將訓練數據分為訓練數據和驗證數據,驗證數據將用于構建容差統計。
df_train, df_test = cp_model.split_df(df, valid_p=0.2)
df_train, df_cal = cp_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)]
我們用三種顏色繪制數據子集。
圖片
我們使用驗證數據作為模型驗證集。
metrics = cp_model.fit(df_train, validation_df=df_cal, progress="bar")
metrics.tail()
圖片
然后,我們就可以進行預測并附加預測區間了。雖然 NeuralProphet 可以自動完成 CP,但我們還是要手動操作,以便向您展示操作步驟。
共形預測
我們計劃創建一個future數據集,該數據集將在df數據的最后日期之后延續 50 個周期。該數據集將包含模型對所有歷史數據的預測,或者如果我們設定n_historic_predictinotallow=40,則將僅包括 40 個歷史數據點及其預測結果。
NeuralProphet 的 CP 選項是 method=naive。我們將通過 .conformal_prediction()啟用保形預測。
future = cp_model.make_future_dataframe(df, periods=50,
n_historic_predictinotallow=True)
# Parameter for naive conformal prediction
method = "naive"
alpha = 0.05
# Enable conformal prediction on the pre-trained models
cp_forecast = cp_model.conformal_predict(
# df_test, # You can also use df_test
future,
calibration_df=df_cal,
alpha=alpha,
method=method,
show_all_PI=True,
)
cp_forecast
輸出包含預測值 yhat1 和上限 yhat1 + qhat1。qhat1 是根據校準數據得出的容差范圍。
圖片
從 yhat1+qhat1中減去 yhat1即可得到 qhat1。這是一個 1951.214 的單一值。然后,我們可以通過從 yhat1減去 qhat1 得出下限。
cp_forecast['qhat1'] = cp_forecast['yhat1 + qhat1'] - cp_forecast['yhat1']
cp_forecast['yhat1 - qhat1'] = cp_forecast['yhat1'] - cp_forecast['qhat1']
cp_forecast
繪制預測值和預測區間圖。你會發現CP一直是一個固定值,在所有時段都是如此。它與預測值相加或相減得出上下限。
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
#plot each series
plt.plot(df_train['ds'],df_train['y'], label='Training data')
plt.plot(df_cal['ds'],df_cal['y'], label='Calibration data')
plt.plot(df_test['ds'],df_test['y'], label='Test data')
plt.plot(cp_forecast['ds'],cp_forecast['yhat1'], label='Prediction')
plt.plot(cp_forecast['ds'],cp_forecast['yhat1 - qhat1'], label='Lower bound')
plt.plot(cp_forecast['ds'],cp_forecast['yhat1 + qhat1'], label='Upper bound')
plt.legend()
plt.title('Conformal prediction')
plt.xticks(rotatinotallow=45, ha='right')
# Draw a vertical dashed line
plt.axvline(x=df_test['ds'].tail(1), color='r', linestyle='--', linewidth=2)
plt.show()
共形預測
公差區間是根據校準數據中的實際值得出的。
結論
本文介紹了共形預測技術,提供預測區間。共形預測的構造不依賴于任何模型假設,可適用于任何模型。此外,我們展示了在NeuralProphet中構建預測區間的代碼示例。一些人可能已經注意到,預測區間在所有時間段都是相同長度的。在某些情況下,不同的預測間隔可能更有意義。