paper2skills Playbook

Conformal Prediction Demand UQ(需求预测不确定性量化)

Skill-Conformal-Prediction-Demand-UQ · 03-时间序列

causalexperimentforecastingrag供应链与补货知识图谱与RAGWF-A 智能补货
年化 ROI30-50 万元
实现难度⭐⭐☆☆☆
业务视角
适用角色供应链负责人 / 采购负责人 · 运营负责人 · 财务负责人
适用平台Amazon FBA · 海外仓 · 多市场多仓
什么情况下用大促前备货总是不是多了就是少了;新品上线第一个月断货,再补又积压;年底预算不知道各月目标怎么定
成功是什么样的提前 4-8 周准确预判各 SKU 需求峰值,库存积压减少 30%,断货率降低 50%
业务痛点
备货总是压货或断货旺季淡季波动太大预测不准补货周期 30 天但预测只看 7 天

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