Conformal Prediction Demand UQ(需求预测不确定性量化)
Skill-Conformal-Prediction-Demand-UQ · 03-时间序列
causalexperimentforecastingrag供应链与补货知识图谱与RAGWF-A 智能补货
收录于大促备货决策手册
年化 ROI30-50 万元
实现难度⭐⭐☆☆☆
业务视角
适用角色供应链负责人 / 采购负责人 · 运营负责人 · 财务负责人
适用平台Amazon FBA · 海外仓 · 多市场多仓
什么情况下用大促前备货总是不是多了就是少了;新品上线第一个月断货,再补又积压;年底预算不知道各月目标怎么定
成功是什么样的提前 4-8 周准确预判各 SKU 需求峰值,库存积压减少 30%,断货率降低 50%
业务痛点
1. 解决的问题
传统需求预测只给点估计("下月卖 1000 件"),业务需要区间估计("95% 置信区间: 850-1200 件")。Conformal Prediction 提供分布无关的、有限样本有效的预测区间,无需假设误差分布。
2. 核心算法逻辑
传统需求预测只给点估计("下月卖 1000 件"),业务需要区间估计("95% 置信区间: 8501200 件")。Conformal Prediction 提供分布无关的、有限样本有效的预测区间,无需假设误差分布。
3. 业务应用场景
业务问题:Prophet 预测下月销量 1200 件。但点估计不能直接用于安全库存——需要 90% 置信区间来决定备货量。
数据要求:24 个月月度销量 × 10 SKU。Conformal PID 自适应季节性(Q4 旺季区间自然变宽)
预期产出: - 90% 预测区间:[1020, 1420](vs Prophet 点估计 1200) - 安全库存建议:按区间上界 1420 备货,避免缺货损失 - 覆盖率追踪:实际值落在区间内的频率维持在 90%±3%
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:减少缺货损失 $1,500-2,500/月 + 减少过度备货积压;年化 30-50 万元
- 实施难度:⭐⭐☆☆☆(2 星)— PID Conformal 有开源实现,即插即用
- 优先级评分:⭐⭐⭐☆☆(3 星)— 需求预测的第二阶能力(先有点估计,再要区间估计)
- 评估依据:NeurIPS 2023 顶级团队(Angelopoulos/Candès/Tibshirani),代码已开源 pip 可用
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
Conformal Prediction for Demand UQ — PID 自适应预测区间
基于 Conformal PID Control (arXiv:2307.16895)
"""
import numpy as np
from typing import Tuple, List
class ConformalPID:
"""Conformal PID 控制器 — 自适应预测区间"""
def __init__(self, alpha: float = 0.1, # 目标误覆盖率
kp: float = 0.5, ki: float = 0.1, kd: float = 0.05):
self.alpha = alpha
self.kp, self.ki, self.kd = kp, ki, kd
self.integral_error = 0.0
self.prev_error = 0.0
self.quantile = 1.0 # 初始 quantile
def update(self, actual: float, predicted: float,
score: float) -> float:
"""PID 更新 quantile,返回调整后的预测区间半宽"""
error = (1 - self.alpha) - (abs(actual - predicted) <= self.quantile * score)
self.integral_error = 0.9 * self.integral_error + error
derivative = error - self.prev_error
adjustment = self.kp * error + self.ki * self.integral_error + self.kd * derivative
self.quantile = max(0.5, min(3.0, self.quantile + adjustment))
self.prev_error = error
return self.quantile * score
def conformal_forecast_intervals(
y_true: np.ndarray,
y_pred: np.ndarray,
scores: np.ndarray,
alpha: float = 0.1
) -> Tuple[np.ndarray, np.ndarray, List[float]]:
"""
生成 conformal 预测区间
Returns:
(lower_bounds, upper_bounds, coverages)
"""
pid = ConformalPID(alpha=alpha)
n = len(y_true)
lower = np.zeros(n)
upper = np.zeros(n)
coverages = []
for t in range(n):
half_width = pid.update(y_true[t], y_pred[t], scores[t])
lower[t] = y_pred[t] - half_width
upper[t] = y_pred[t] + half_width
covered = 1.0 if lower[t] <= y_true[t] <= upper[t] else 0.0
coverages.append(covered)
# 滚动覆盖率
window = 30
rolling_cov = [np.mean(coverages[max(0,i-window):i+1])
8. 论文来源
- 2212.03281
- 2307.16895