认知不确定性共形评分 - 数据稀疏区域自适应区间加宽
Skill-EPICSCORE-Uncertainty · 01-因果推断
1. 解决的问题
标准共形预测对所有数据点使用统一的非一致性分数,无法区分"数据多的区域"和"数据少的区域"。根本原因:传统共形分数只捕捉偶然不确定性(aleatoric uncertainty,数据本身的随机性),对认知不确定性(epistemic uncertainty,训练数据不足导致的模型无知)视而不见——在数据稀疏区域仍然给出窄区间,形成虚假的高置信度。
2. 核心算法逻辑
标准共形预测对所有数据点使用统一的非一致性分数,无法区分"数据多的区域"和"数据少的区域"。根本原因:传统共形分数只捕捉偶然不确定性(aleatoric uncertainty,数据本身的随机性),对认知不确定性(epistemic uncertainty,训练数据不足导致的模型无知)视而不见——在数据稀疏区域仍然给出窄区间,形成虚假的高置信度。
3. 业务应用场景
桑基图中每条边代表一条用户路径转化,观测量差异极大:
| 路径边 | 日均观测量 | 标准共形区间 | EPICSCORE 区间 | 决策含义 | |--------|-----------|-------------|----------------|---------| | SEARCH → PDP | 5,000次 | [78%, 82%] | [77%, 83%] | 数据充足,区间无明显变化 | | PDP → CART | 2,100次 | [43%, 49%] | [42%, 50%] | 数据较充足 | | SUPPORT → CHECKOUT | 23次 | 标准方法仍给 [8%, 38%] | [5%, 45%] | 数据稀疏
一眼看出哪条边可信、哪条边不可信,避免把小样本冷门路径的点估计误作稳定洞察。
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
未自动抽取;请查看原始 Skill 卡片。
7. 代码模板
代码块数量:3 · 路径:未检测到
"""
EPICSCORE 完整实现
论文: arXiv:2502.06995 — Epistemic Uncertainty in Conformal Scores: A Unified Approach
依赖:
pip install numpy scipy scikit-learn gpytorch torch bartpy
或: conda install numpy scipy scikit-learn pytorch -c pytorch
pip install gpytorch bartpy
"""
import numpy as np
from scipy.stats import norm
from sklearn.linear_model import QuantileRegressor
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings("ignore")
# ─────────────────────────────────────────────
# 一、非一致性分数定义(任意分数可替换)
# ─────────────────────────────────────────────
def regression_split_score(y_pred: np.ndarray, y_true: np.ndarray) -> np.ndarray:
"""标准回归 split 分数: s(x,y) = |y - g(x)|"""
return np.abs(y_true - y_pred)
def cqr_score(q_lo: np.ndarray, q_hi: np.ndarray, y_true: np.ndarray) -> np.ndarray:
"""CQR 分数: s(x,y) = max(q_lo(x)-y, y-q_hi(x))"""
return np.maximum(q_lo - y_true, y_true - q_hi)
# ─────────────────────────────────────────────
# 二、贝叶斯后端 A — 高斯过程(GP)
# ─────────────────────────────────────────────
class GPEpistemicModel:
"""
用 GP 对非一致性分数的条件分布建模。
返回预测均值和方差,用正态近似计算 F(s | x, D)。
依赖: gpytorch(可替换为 sklearn.gaussian_process)
"""
def __init__(self, length_scale: float = 1.0, noise_var: float = 0.1):
self.length_scale = length_scale
self.noise_var = noise_var
self._X_train = None
self._s_train = None
self._K_inv = None
def _rbf_kernel(self, X1: np.ndarray, X2: np.ndarray) -> np.ndarray:
"""RBF 核函数"""
diff = X1[:, None, :] - X2[None, :, :] # (n1, n2, d)
dist_sq = np.sum(diff ** 2, axis=-1)
return np.exp(-0.5 * dist_sq / self.length_scale ** 2)
def fit(self, X_cal1: np.ndarray, scores_cal1: np.ndarray):
"""在 D_cal,1 上拟合 GP 后验"""
self._X_train = X_cal1
self._s_train = scores_cal1
8. 论文来源
- 2502.06995