欢迎光临
我们一直在努力

Conformal Prediction构建销量预测区间

使用 Conformal Prediction (CP) 构建销量预测区间,其核心优势在于无需对数据分布做任何假设,即可提供具有理论保证的边际覆盖率。以下是两种可直接落地的实现方法。

1. 基础方法:分位数调整法(Split Conformal Prediction)

此方法假设预测误差在不同样本间是同方差的,实现简单,能保证边际覆盖率。

步骤:

  • 数据划分:将数据划分为训练集(用于训练点预测模型)和校准集(用于计算非一致性分数)。
  • 训练点预测模型:在训练集上训练一个销量点预测模型(如 LightGBM、XGBoost)。
  • 计算校准集残差:使用训练好的模型预测校准集,并计算绝对残差。
  • 计算调整量:根据目标置信水平 1-α(如90%对应α=0.1),计算绝对残差的 (1-α) 分位数 q。
  • 构建预测区间:对于新样本的预测值 y_pred_new,其预测区间为 [y_pred_new – q, y_pred_new + q]。
  • Python 实现:

    import numpy as np
    from sklearn.model_selection import train_test_split
    import lightgbm as lgb

    # 1. 数据准备与划分
    # X, y 为特征和销量标签
    X_train, X_calib, y_train, y_calib = train_test_split(X, y, test_size=0.2, random_state=42)

    # 2. 训练点预测模型
    model = lgb.LGBMRegressor()
    model.fit(X_train, y_train)

    # 3. 在校准集上计算绝对残差
    y_pred_calib = model.predict(X_calib)
    residuals_calib = np.abs(y_calib – y_pred_calib)

    # 4. 定义函数以生成预测区间
    def get_conformal_interval(model, X_new, alpha=0.1):
    """
    为新的特征数据 X_new 生成预测区间。
    """
    # 计算点预测
    y_pred_new = model.predict(X_new)
    # 计算调整量 q:绝对残差的 (1-alpha) 分位数
    q = np.quantile(residuals_calib, 1 – alpha)
    # 构建对称区间
    lower = y_pred_new – q
    upper = y_pred_new + q
    return lower, upper, y_pred_new

    # 5. 对新数据生成预测区间
    X_test = … # 新样本特征
    lower_bounds, upper_bounds, point_forecasts = get_conformal_interval(model, X_test, alpha=0.1)

    理论保证:此方法能确保在所有新样本上,真实值落在预测区间内的概率(边际覆盖率)至少为 1-α 。

    2. 进阶方法:归一化 Conformal Prediction

    基础方法假设误差方差恒定,这在销量预测中通常不成立(例如,高销量商品波动更大)。归一化 CP 通过引入一个尺度因子来适应异方差性,能产生宽度更合理的区间。

    步骤:

  • 训练点预测模型:同基础方法。
  • 训练尺度模型:使用校准集数据,训练一个回归模型来预测每个样本的残差尺度(例如,绝对残差)。该模型学习不同特征(如历史平均销量)对应的误差波动大小。
  • 计算归一化残差:计算校准集上每个样本的绝对残差,并用尺度模型的预测值进行归一化。
  • 计算调整分位数:计算归一化残差的 (1-α) 分位数 q。
  • 构建预测区间:对于新样本,先预测其点销量 y_pred_new 和尺度因子 s_new,然后构建区间 [y_pred_new – q * s_new, y_pred_new + q * s_new]。
  • Python 实现:

    # 1. 训练点预测模型(同上)
    point_model = lgb.LGBMRegressor()
    point_model.fit(X_train, y_train)

    # 2. 在校准集上获取点预测和绝对残差
    y_pred_calib = point_model.predict(X_calib)
    abs_residuals_calib = np.abs(y_calib – y_pred_calib)

    # 3. 训练尺度模型(预测绝对残差)
    scale_model = lgb.LGBMRegressor()
    scale_model.fit(X_calib, abs_residuals_calib)

    # 4. 计算校准集上的归一化残差
    scale_calib = scale_model.predict(X_calib)
    normalized_residuals = abs_residuals_calib / (scale_calib + 1e-8) # 避免除零

    # 5. 计算归一化残差的分位数 q
    alpha = 0.1
    q = np.quantile(normalized_residuals, 1 – alpha)

    # 6. 定义函数以生成预测区间
    def get_normalized_conformal_interval(point_model, scale_model, X_new, alpha=0.1, q=q):
    """
    为新的特征数据 X_new 生成归一化预测区间。
    """
    # 计算点预测
    y_pred_new = point_model.predict(X_new)
    # 预测尺度因子
    scale_new = scale_model.predict(X_new)
    # 构建区间
    lower = y_pred_new – q * scale_new
    upper = y_pred_new + q * scale_new
    return lower, upper, y_pred_new

    # 7. 对新数据生成预测区间
    X_test = … # 新样本特征
    lower_bounds, upper_bounds, point_forecasts = get_normalized_conformal_interval(point_model, scale_model, X_test, alpha=0.1)

    优势:此方法通过尺度因子 s 调整区间宽度,对于波动大的样本给出更宽的区间,反之则更窄,从而在保持边际覆盖率的同时,获得更高效(平均宽度更小)的预测区间 。

    方法对比与选择

    特性基础分位数调整法归一化 Conformal Prediction
    核心假设 预测误差同方差 预测误差的方差可由特征解释(异方差)
    实现复杂度 中(需额外训练一个尺度模型)
    区间效率 较低(所有样本区间宽度相同) 较高(区间宽度随样本特征自适应)
    理论保证 边际覆盖率 ≥ 1-α 边际覆盖率 ≥ 1-α
    适用场景 快速验证、误差波动不大的场景 大多数实际销量预测场景,尤其是销量波动范围大的情况

    评估预测区间质量

    构建区间后,必须使用测试集评估其性能,核心指标如下:

    # y_true_test 是测试集真实销量
    # lower_bounds, upper_bounds 是测试集对应的预测区间上下界

    # 1. 覆盖率 (Coverage):真实值落在区间内的比例
    coverage = np.mean((y_true_test >= lower_bounds) & (y_true_test <= upper_bounds))
    print(f"目标覆盖率: {1-alpha:.1%}, 实际覆盖率: {coverage:.2%}")

    # 2. 平均区间宽度 (Mean Prediction Interval Width, MPIW)
    mpiw = np.mean(upper_bounds – lower_bounds)
    print(f"平均预测区间宽度: {mpiw:.2f}")

    理想的结果是覆盖率接近目标值,同时平均区间宽度尽可能小。


    参考来源

    • 销量预测中的不确定性量化:从点预测到区间预测
    • 销量预测中的不确定性量化:从点预测到区间预测

     

    赞(0)
    未经允许不得转载:171主机测评 » Conformal Prediction构建销量预测区间
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址