paper2skills Playbook

认知不确定性共形评分 - 数据稀疏区域自适应区间加宽

Skill-EPICSCORE-Uncertainty · 01-因果推断

causalexperimentforecastingrag推荐与搜索知识图谱与RAG
业务优先级⭐⭐⭐⭐
业务视角
适用角色增长负责人 / CMO · 数据分析师 · 广告优化师
适用平台Amazon · TikTok Shop · Meta Ads · DTC 独立站
什么情况下用广告预算花了,但不确定哪个渠道真的带来新客;做了大促,不知道销量增长是促销效果还是季节规律
成功是什么样的能区分「真实增量」和「自然购买」,砍掉虚假归因渠道后同等预算 ROI 提升 20-40%
业务痛点
钱花出去了不知道有没有用各渠道报告都说自己贡献最大怎么向老板证明这笔钱值得花

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