使用 Conformal Prediction (CP) 构建销量预测区间,其核心优势在于无需对数据分布做任何假设,即可提供具有理论保证的边际覆盖率。以下是两种可直接落地的实现方法。
1. 基础方法:分位数调整法(Split Conformal Prediction)
此方法假设预测误差在不同样本间是同方差的,实现简单,能保证边际覆盖率。
步骤:
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 通过引入一个尺度因子来适应异方差性,能产生宽度更合理的区间。
步骤:
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 调整区间宽度,对于波动大的样本给出更宽的区间,反之则更窄,从而在保持边际覆盖率的同时,获得更高效(平均宽度更小)的预测区间 。
方法对比与选择
| 核心假设 | 预测误差同方差 | 预测误差的方差可由特征解释(异方差) |
| 实现复杂度 | 低 | 中(需额外训练一个尺度模型) |
| 区间效率 | 较低(所有样本区间宽度相同) | 较高(区间宽度随样本特征自适应) |
| 理论保证 | 边际覆盖率 ≥ 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}")
理想的结果是覆盖率接近目标值,同时平均区间宽度尽可能小。
参考来源
- 销量预测中的不确定性量化:从点预测到区间预测
- 销量预测中的不确定性量化:从点预测到区间预测



