1. 題目
你已有一個點預測模型 f(x),但業務需要輸出類似 [lower, upper] 的預測區間,並希望在信心水準 1 - alpha 下具備可解釋的覆蓋率。請設計 split conformal prediction 流程,說明訓練集、校準集和測試點如何分工。
2. 約束與釐清
- 先討論迴歸和絕對誤差分數;分類集合、線上校準和條件覆蓋率屬於延伸。
- 訓練模型後固定參數,校準集不能再用來擬合點預測器。
- 覆蓋率是對一批可交換樣本的邊際保證,不承諾每個子群或每個單點都達到相同比例。
- 需要區分隨機抽樣資料、時間序列和發生共變量漂移時的有效性。
3. 核心思路
將資料分為訓練集和校準集。用訓練集擬合點預測器,在校準集上計算非一致性分數 si = |yi - f(x_i)|。對目標覆蓋率 1 - alpha,取校準分數的有限樣本修正分位數 q;新樣本 x 的區間為 [f(x) - q, f(x) + q]。
在交換性假設下,這個構造給出邊際覆蓋率保證:新標籤落在區間內的機率至少接近 1 - alpha,有限樣本版本需要依校準集大小選擇保守的次序統計量。它不要求點預測器本身正確,但區間寬度會反映模型殘差和資料雜訊。
4. 參考實作
def fit_split_conformal(train, calibration, alpha):
model = fit_point_predictor(train.x, train.y)
scores = sorted(
abs(y - model.predict(x))
for x, y in zip(calibration.x, calibration.y)
)
# Use the finite-sample conformal quantile, not a naive percentile.
rank = ceil((len(scores) + 1) * (1 - alpha))
q = scores[min(rank, len(scores)) - 1]
def predict_interval(x):
center = model.predict(x)
return center - q, center + q
return predict_interval5. 正確性與評估
評估時必須在獨立測試集上統計覆蓋率與平均區間寬度,並按時間、地區或使用者群組檢查差異。覆蓋率低於目標可能來自非交換資料、校準集過小、分布漂移或實作錯誤;只報告平均覆蓋率無法發現某個群組系統性失效。
區間寬度與分數定義有關:絕對殘差給出對稱區間,分位數迴歸或局部尺度分數可產生非對稱或自適應區間。更窄的區間不自動代表更好,必須與覆蓋率和業務損失一起比較。
6. 追問與陷阱
- 「分布無關」不是「任何分布都無條件保證」;經典保證依賴校準樣本與新樣本滿足交換性。
- 時間序列的順序相依會破壞樸素 split conformal,需使用滾動校準、加權方法或明確降低保證範圍。
- 共變量漂移下可按密度比加權,但權重估計錯誤會影響覆蓋率,不能繼續宣稱原始保證不變。
- 邊際覆蓋率不等於條件覆蓋率;小群體或極端輸入仍可能有很寬或很窄的區間。
7. 延伸閱讀
可以比較 split、cross-conformal、線上 conformal 和加權 conformal:它們在資料重用、計算成本、適應漂移和理論保證之間取捨。生產系統還應監控覆蓋率、區間寬度、殘差漂移、校準集新鮮度和拒絕/人工複核比例。
8. 面試評分點
能正確拆分訓練與校準
應說明點預測器只在訓練集擬合,校準分數來自未參與擬合的樣本,並使用有限樣本分位數。
能解釋覆蓋率假設
應說清交換性、邊際覆蓋率與條件覆蓋率的差別,不能把結果描述成每個樣本的確定性保證。
能處理漂移與時間相依
應提出滾動、加權或線上校準,並說明這些方法的額外假設和保證變化。
能平衡區間寬度
應同時報告覆蓋率和寬度,按子群監控失效,並把統計指標與業務損失連結起來。