河口水质监测站的小林,每天早上要做一件看似枯燥的事:从上游取一桶水样,和手册里的「基准水样」对比。基准水样是一个月前采集、经过全项检测的「标准答案」。她不看平均值,不碰单点读数,而是把两桶水按溶解氧浓度分进 12 个「格子」,数每个格子里有多少样本,再算一个「综合偏移分」。这个分数超过某条线,她就得上报并启动全流程排查;没超过就照常放行。这套方法,就是特征级 Population Stability Index(PSI)的雏形——把「分布长得像不像」变成「一个可量化的数字」。对 AI 模型来说,训练时的特征分布是「基准水样」,上线后的实时特征就是「每天的水样」;分布一旦漂移,模型预测就会悄悄失真。PSI 的核心价值,就是给每个特征装一个水质监测器,用量化指标回答最朴素的问题:今天的输入,还像不像训练时看到的输入?

岗位关联

对 AI 从业者而言,掌握特征级 PSI 计算是模型上线后「可观测性」的第一课——用一套成熟的量化标准做数据漂移检测,在模型失效前抢到预警时间,是规避业务损失和信任危机的核心技能。

目录
  1. 可视化演示
  2. PSI核心公式
  3. 分箱策略
  4. 缺失值处理
  5. 阈值解读
  6. 批量特征监控
  7. 工程化实现
  8. 方法论局限
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示PSI计算流程:分箱分布对比(expected vs actual)、逐箱PSI贡献计算、阈值评估与稳定性判定(<0.1稳定/0.1-0.25关注/>0.25更新)。

本节配有交互动效(进入视口后自动加载,约 3KB)。

分布对比 exp:训练基准分布 act:生产实际分布 PSI=Σ(%act-%exp)×ln(%act/%exp) 比较各分箱占比差异,识别分布漂移。

PSI核心公式

小林把基准水样按溶解氧浓度分进 12 个格子,数出每个格子的占比,这叫「预期占比」;今天的水样分进同样的格子,得到「实际占比」。如果水体没变,每个格子的两个占比应该差不多;如果上游偷偷排了废水,溶解氧整体偏低的格子占比就会明显抬升。但小林不能只盯一个格子——她要的是全部格子差异的「总分」。

这个「总分」就是 PSI。它把两个分布的差异压缩成一个无量纲标量:对每一个格子的占比差和占比比分别打分,再逐格累加。占比变化越大、越不均匀,分数越高;完全同分布时分数趋近 0。相比只看均值或方差,PSI 能捕捉分布形状的整体偏移,既不过度敏感于单点噪声,也不放过系统性漂移。

回到小林的工作台:她不需要看 12 个格子的原始数字,只看这个总分就能判断「今天的水质状态」——这也正是模型监控里把上百个特征浓缩成一张漂移排行的基础逻辑。

PSI=∑i=1n(Picur−Piexp)×ln⁡ ⁣(PicurPiexp)\displaystyle \text{PSI} = \sum_{i=1}^{n} \left( P^{\text{cur}}_i - P^{\text{exp}}_i \right) \times \ln\!\left( \frac{P^{\text{cur}}_i}{P^{\text{exp}}_i} \right)
公式的直觉:每个格子都在「投票」——占比差是投票权重,占比比的对数是投票强度;所有格子加权求和,得出分布整体偏移的综合分。
  1. 遍历分箱对第 $i$ 个格子(共 $n$ 格)逐一计算,每个格子贡献一个子分数。
    i=1,2,…,ni = 1, 2, \dots, n
  2. 占比差用当前分布第 $i$ 格占比 $P^{\text{cur}}_i$ 减去基准分布第 $i$ 格占比 $P^{\text{exp}}_i$,差值越大说明这个格子的样本比例偏移越多。
    Picur−PiexpP^{\text{cur}}_i - P^{\text{exp}}_i
  3. 对数偏移比两个占比的比值取自然对数,放大比例差异;当两占比相等时对数项为 0。
    ln⁡ ⁣(PicurPiexp)\ln\!\left( \frac{P^{\text{cur}}_i}{P^{\text{exp}}_i} \right)
  4. 逐格加权求和把每格的「占比差」「对数比」相乘再全部累加,得到特征整体的分布漂移分数。
    ∑i=1n(Picur−Piexp)×ln⁡ ⁣(PicurPiexp)\sum_{i=1}^{n} \left( P^{\text{cur}}_i - P^{\text{exp}}_i \right) \times \ln\!\left( \frac{P^{\text{cur}}_i}{P^{\text{exp}}_i} \right)

分箱策略

分格子的方式直接决定分数是否可靠。小林最初把溶解氧按每桶 2mg/L 等宽切 5 格,结果发现基准水样几乎全挤在最浓的两格,其余三格空荡荡——占比出现大量 0,对数项直接爆炸。这就是等距分箱的经典问题:数值分布不均时,稀疏格子的占比估计极不稳定。

工程上更常用的是等频分箱:按基准分布的分位数切边界,让每格样本数大致相等。这样每格占比天然在 $1/n$ 附近,既避免空箱,也保证每格都有足够的统计量。箱数选择需平衡敏感度与噪声:太少会漏掉局部偏移,太多则每格样本稀疏、随机抖动被放大;经验上 10~20 箱是常见起点,遇到大量重复值(如收入取整万元)还要主动并箱去重。

分箱策略的本质是「用合理的刻度尺量分布」:等距适合均匀分布的连续特征,等频适合长尾特征,自定义边界适合有业务含义的特征(如信用分 600/700 分界点)。小林最后给每类指标配了专属刻度,PSI 才真正稳定可信。

pi=niN\displaystyle p_i = \frac{n_i}{N}
每个箱子的占比 $p_i$ 就是「箱内样本数 $n_i$ 除以总样本数 $N$」。等频分箱等价于先让 $n_i$ 尽量均匀,再算出稳定的 $p_i$ 供 PSI 使用。
  1. 箱内计数统计落在第 $i$ 个箱子的样本数量 $n_i$,分箱边界来自基准分布的分位数。
    ni=∣{x∈bini}∣n_i = \left| \{ x \in \text{bin}_i \} \right|
  2. 总样本归并用基准分布总体本数 $N$ 做分母,把计数归一化为比例。
    N=∑i=1nniN = \sum_{i=1}^{n} n_i
  3. 占比归一化$n_i$ 除以 $N$ 得到第 $i$ 箱占比 $p_i$,所有箱占比之和恒为 1。
    pi=niNp_i = \frac{n_i}{N}

缺失值处理

水质指标偶尔会「缺测」——仪器故障、采样瓶破损、浓度超检测上限。小林没有把这些样本扔掉,而是单独放一个「缺测格」。原因很简单:缺失本身可能就是漂移信号。某个指标之前缺测率 1%,突然升高到 15%,往往意味着传感器老化或数据链路异常,这比数值分布偏移更值得警惕。

特征级 PSI 计算同样遵循这个原则:先将缺失值单独归入一个箱参与分箱统计,或者把缺失率作为独立维度与 PSI 并列展示。如果当前窗口的缺失率与基准窗口差异显著,即使 PSI 未超阈值也要标记「数据质量告警」。只有缺失率接近 100% 的特征才直接跳过并降级处理,避免空分布制造虚假分数。

缺失箱就像水样里的「空瓶记录」:单独一瓶测不出可能是意外,但空瓶率骤升一定是流程出了问题。把缺失率纳入监控链路,PSI 才不会对数据质量劣化视而不见。

missing_rate=MmissNtotal\displaystyle \text{missing\_rate} = \frac{M_{\text{miss}}}{N_{\text{total}}}
缺失率 = 缺失样本数除以窗口总样本数。它本身就是一维分布,可以像 PSI 一样跨时间窗口做差异对比。
  1. 统计缺失数在当前时间窗口内统计特征取值为空的样本数量 $M_{\text{miss}}$。
    Mmiss=∑x∈W1[x is missing]M_{\text{miss}} = \sum_{x \in W} \mathbb{1}[x \text{ is missing}]
  2. 计算窗口总量取窗口总样本数 $N_{\text{total}}$ 作为分母,包含缺失与非缺失样本。
    Ntotal=∣W∣N_{\text{total}} = |W|
  3. 归一化缺失占比二者相除得到缺失率,范围 $[0,1]$,用于跨期对比或作为监控指标。
    missing_rate=MmissNtotal\text{missing\_rate} = \frac{M_{\text{miss}}}{N_{\text{total}}}

阈值解读

分数算出来了,怎么判断要不要处理?小林的经验被沉淀成了行业惯例:PSI 小于 0.1,水体稳定,继续日常巡检;0.1 到 0.25,需要关注,加密采样并排查可能的上游污染源;超过 0.25,触发红色警报,启动全流程评估甚至模型换版。这套阈值不是数学推导出来的,而是大量业务实践的统计约定。

阈值区间本质是「分级响应」而非「非黑即白」。小于 0.1 不代表分布完全重合,只是偏移幅度在可接受范围;0.1~0.25 区间通常对应数据中轻度衰减,模型预测能力可能下降但未失控;超过 0.25 则基本意味着当前分布与训练分布已经显著偏离,继续使用可能产生系统性误差。实际业务中阈值可依据模型重要程度调整,核心模型用更严的 0.05/0.15,非核心特征可放宽。

阈值分级给监控系统赋予了「行动语义」:不是每个漂移都要惊动团队,而是把有限的注意力投向最危险的信号,这正是可观测性工程的核心思想。

level={stable,PSI<0.1watch,0.1≤PSI≤0.25drift,PSI>0.25\displaystyle \text{level} =\begin{cases}\text{stable}, & \text{PSI} < 0.1 \\\text{watch}, & 0.1 \le \text{PSI} \le 0.25 \\\text{drift}, & \text{PSI} > 0.25\end{cases}
阈值的通俗理解:0.1 是黄灯、0.25 是红灯。黄灯提醒你留意,红灯要求你行动。
  1. 稳定判定当 PSI 低于 0.1 时判定为 stable,分布偏移可忽略,正常监控即可。
    PSI<0.1\text{PSI} < 0.1
  2. 关注判定当 PSI 落在 $[0.1, 0.25]$ 区间时判定为 watch,需要排查特征来源、样本采集是否异常。
    0.1≤PSI≤0.250.1 \le \text{PSI} \le 0.25
  3. 漂移判定当 PSI 超过 0.25 时判定为 drift,触发模型重新训练或评估流程。
    PSI>0.25\text{PSI} > 0.25

批量特征监控

一个风控模型往往有上百个特征,小林不可能每天手工逐个测 327 项指标的水质。她做的是:设定每天零点自动采样,对全部特征统一分箱、统一计算 PSI,生成一张按分数降序排列的漂移排行榜。排在榜首的永远是最需要人工介入的特征,而正常特征全部静默。

批量监控的关键是「全量扫描 + 分级告警」。系统对每个特征独立计算 PSI 和缺失率,再按预警等级分类:红色(PSI > 0.25)立即发群通知,黄色(0.1~0.25)进入周报跟踪清单,绿色静默存储。这样既不会漏报——每个特征都被覆盖,又不会误报风暴——只有真正超限的特征才打扰值班人员。

批量监控让小林从「逐项盯数据」升级为「盯排行榜」。对 AI 团队同理:特征监控的价值不在于算出分数,而在于把数百个分数组织成可排优先级、可自动响应的运维闭环。

alert(f)={P1,PSIf>0.25P2,PSIf>0.1OK,otherwise\displaystyle \text{alert}(f) =\begin{cases}\text{P1}, & \text{PSI}_f > 0.25 \\\text{P2}, & \text{PSI}_f > 0.1 \\\text{OK}, & \text{otherwise}\end{cases}
对每个特征 $f$ 独立计算 PSI 后套用分级函数,输出统一的告警等级,再按等级驱动不同的通知策略。
  1. 遍历特征集对模型的所有特征 $f$ 逐一执行 PSI 计算,不遗漏任何一个输入维度。
    f∈{f1,f2,…,fm}f \in \{ f_1, f_2, \dots, f_m \}
  2. 套用分级函数将每个特征的 PSI 代入阈值区间,产出 P1/P2/OK 三级标签。
    level(f)=alert(PSIf)\text{level}(f) = \text{alert}(\text{PSI}_f)
  3. 降序排序与派发按 PSI 值降序排列并派发告警,P1 特征进入即时通知、P2 特征进入周报。
    rank=sort_desc(PSIf1,…,PSIfm)\text{rank} = \text{sort\_desc}(\text{PSI}_{f_1}, \dots, \text{PSI}_{f_m})

工程化实现

把 PSI 从公式变成线上服务,需要一套工程骨架。首先是时间窗口切分:基准分布来自训练期样本快照,当前分布来自最近一个监控窗口(如 T+1 的每日批次或滑动 7 日窗口)。两者样本不能重叠,窗口长度要足够支撑分箱统计,一般要求每个箱子至少几十个样本。

其次是基准快照与存储:基准分布不是每次随时重算,而是随模型版本固化存储(如 HDFS 分区或特征库快照表),监控任务运行时读取快照与当前窗口比对。最后是调度与展示:用 Airflow 或定时任务驱动批量计算,结果写入监控库,由看板(Grafana 等)渲染趋势曲线,并联动告警渠道。窗口占比公式是计算核心:

工程化把「每天手动取水测指标」变成了「自来水厂的自动化水质站」:窗口定采样频率、快照定对比基准、看板定可视化、告警定响应动作。四者齐备,特征级 PSI 监控才算真正落地。

p^i(t)=1∣W(t)∣∑x∈W(t)1[bin(x)=i]\displaystyle \hat{p}_i(t) = \frac{1}{|W(t)|} \sum_{x \in W(t)} \mathbb{1}[\text{bin}(x) = i]
当前窗口 $W(t)$ 内,第 $i$ 箱的占比估计值 = 落在该箱的样本数除以窗口总样本数。这是 PSI 计算在工程上的程序化表达。
  1. 定义时间窗口取最近一个监控周期 $W(t)$,如近 7 天或当日批次的数据集合。
    W(t)={xs:t−T≤s≤t}W(t) = \{ x_s : t - T \le s \le t \}
  2. 指示函数计数用示性函数 $\mathbb{1}[\cdot]$ 判断每个样本 $x$ 是否落在第 $i$ 箱,命中则计 1。
    1[bin(x)=i]\mathbb{1}[\text{bin}(x) = i]
  3. 窗口均值归一累计命中数除以窗口样本总数,得到第 $i$ 箱的占比估计值 $\hat{p}_i(t)$。
    p^i(t)=1∣W(t)∣∑x∈W(t)1[bin(x)=i]\hat{p}_i(t) = \frac{1}{|W(t)|} \sum_{x \in W(t)} \mathbb{1}[\text{bin}(x) = i]

方法论局限

PSI 不是万能的。小林的第一个教训来自枯水期:连续几天水样只有十几瓶,分箱后每格样本少得可怜,PSI 在 0.05 到 0.4 之间剧烈跳动——小样本下占比估计的方差太大,分数失去意义。统计学上,占比估计的方差与样本量成反比,样本越少,统计噪声越容易被误判为漂移。

第二个局限是非线性漂移不敏感。PSI 比较的是「各箱占比」,它能看到整体形状变化,但若某个分布均值略微右移且方差同步缩小,各箱占比可能整体抵消,PSI 数值很小。第三是分箱粒度敏感:同一样本,10 箱和 50 箱算出的 PSI 可能差出数倍。因此 PSI 应搭配 KS 检验、KL 散度、特征分布可视化等方法交叉验证,避免单一指标盲区。

PSI 是「分布漂移的体温计」,能快速指示发烧,但无法告诉你病因。小样本先补数据、非线性漂移要配合分布图、粒度敏感需固定分箱参数——认识到边界,才能正确使用它。

Var(p^i)≈p^i(1−p^i)n\displaystyle \text{Var}(\hat{p}_i) \approx \frac{\hat{p}_i \left( 1 - \hat{p}_i \right)}{n}
第 $i$ 箱占比估计的方差约等于 $p_i(1-p_i)/n$。样本量 $n$ 越小,占比抖动越大,PSI 越不可信。
  1. 占比估计方差箱占比 $\hat{p}_i$ 的方差近似公式显示,它与箱占比本身和样本量相关。
    Var(p^i)≈p^i(1−p^i)n\text{Var}(\hat{p}_i) \approx \frac{\hat{p}_i (1 - \hat{p}_i)}{n}
  2. 小样本放大波动分母 $n$ 越小方差越大,说明样本量不足时分箱占比的随机抖动会被 PSI 误读为漂移。
    lim⁡n→0Var(p^i)=∞\lim_{n \to 0} \text{Var}(\hat{p}_i) = \infty
  3. 监控下限约束工程上设置最小样本量阈值,如 $n \ge 1000$ 才计算 PSI,否则标记「样本不足」不参与预警。
    n≥nmin⁡n \ge n_{\min}

AI 应用场景

信贷风控模型特征漂移监控

阶段:模型部署上线后的可观测性与监控

解决的问题:信贷评分卡上线后,用户群体随宏观经济波动而变化。传统方式靠月度人工抽看特征均值,既滞后又看不清分布形态变化。用特征级 PSI 每日扫描几十个入模特征,在逾期率恶化前提前捕捉「收入分布右移」「年龄结构年轻化」等漂移信号。

具体案例:某消费金融公司对「月收入」特征做 PSI 监控,某周 PSI 从 0.08 跳至 0.31,定位到合作渠道投放人群从工薪族转向自由职业者,及时调整授信策略,避免坏账率上升。

推荐系统用户偏好漂移检测

阶段:特征管道监控与模型迭代决策

解决的问题:推荐模型的用户行为特征(点击时长、类目分布)会随季节和热点漂移。传统依赖离线评估 AUC 下降,反映滞后且难定位到具体特征。利用分箱策略对用户特征批量计算 PSI,快速定位是「哪个特征」贡献了大部分漂移,指导特征工程调整。

具体案例:电商大促后,「浏览类目占比」特征 PSI 达 0.42,触发重训;重训后线上 CTR 回升 7%,证明 PSI 预警准确命中时序性偏好漂移。

大模型服务输入分布监控

阶段:LLM 应用的输入可观测性

解决的问题:大模型应用的 prompt 特征(文本长度、语言分布、主题分布)会随用户习惯变化。传统只监控 token 消耗与延迟,看不到语义分布漂移。对 prompt 的数值化特征(embedding 某一维、长度统计)做特征级 PSI 监控,及时发现恶意注入或用法偏离等异常输入模式。

具体案例:某客服机器人的「提问长度」特征 PSI 连续 3 天高于 0.2,排查发现新增了批量脚本刷接口,遂触发限流策略,保障正常用户体验。

Python 演示

python71 行
import numpy as npimport pandas as pd def psi_calc(bench, cur, bins=10, bin_type='quantile'):    """计算单特征的 PSI 值。    bench: 基准分布(训练期样本)    cur: 当前分布(监控窗口样本)    """    if bin_type == 'quantile':        edges = np.quantile(bench, np.linspace(0, 1, bins + 1))    else:        edges = np.linspace(np.min(bench), np.max(bench), bins + 1)    edges = np.unique(edges)  # 去重,避免空箱    if len(edges) < 2:        return None    bench_cnt = np.histogram(bench, bins=edges)[0]    cur_cnt = np.histogram(cur, bins=edges)[0]    bench_pct = bench_cnt / np.sum(bench_cnt)    cur_pct = cur_cnt / np.sum(cur_cnt)    psi = 0.0    for b, c in zip(bench_pct, cur_pct):        if b > 0 and c > 0:            psi += (c - b) * np.log(c / b)    return psi def monitor_features(df_bench, df_cur, features):    """批量计算多个特征的 PSI 与缺失率差异,返回按 PSI 降序的排行榜。"""    results = {}    for feat in features:        b = df_bench[feat].dropna()        c = df_cur[feat].dropna()        miss_diff = abs(df_bench[feat].isna().mean() - df_cur[feat].isna().mean())        if len(b) == 0 or len(c) == 0:            results[feat] = {'psi': np.nan, 'miss_diff': miss_diff, 'level': 'missing_all'}            continue        psi = psi_calc(b, c)        if psi is None:            results[feat] = {'psi': np.nan, 'miss_diff': miss_diff, 'level': 'bad_bins'}            continue        level = 'stable' if psi < 0.1 else ('watch' if psi < 0.25 else 'drift')        results[feat] = {'psi': psi, 'miss_diff': miss_diff, 'level': level}    ranked = sorted(        results.items(),        key=lambda kv: kv[1]['psi'] if not np.isnan(kv[1]['psi']) else -1.0,        reverse=True    )    return ranked if __name__ == '__main__':    np.random.seed(42)    bench = np.random.normal(0.5, 0.1, 5000)    cur_drift = np.random.normal(0.58, 0.12, 5000)    print('单特征漂移示例 PSI: %.4f' % psi_calc(bench, cur_drift))     df_b = pd.DataFrame({        'age': np.random.normal(35, 5, 8000),        'income': np.random.normal(10000, 2000, 8000)    })    df_c = pd.DataFrame({        'age': np.random.normal(38, 6, 8000),        'income': np.random.normal(10500, 2500, 8000)    })    df_c.loc[100:300, 'age'] = np.nan     for feat, info in monitor_features(df_b, df_c, ['age', 'income']):        print('特征: %s, PSI: %.4f, 缺失率差: %.4f, 状态: %s' % (            feat,            info['psi'] if not np.isnan(info['psi']) else -1.0,            info['miss_diff'],            info['level']        ))
目的:实现等频/等距分箱下的单特征 PSI 计算,并演示批量特征监控的降序排行榜逻辑。
  1. psi_calc(bench, cur, bins=10, bin_type='quantile')核心 PSI 计算函数,默认用分位数等频分箱,保证每个箱子有稳定样本量。
  2. edges = np.quantile(bench, np.linspace(0, 1, bins + 1))用基准分布的分位数生成箱子边界,这是等频分箱的关键,避免空箱。
  3. edges = np.unique(edges)合并重复边界(如中位数重叠时),防止 histogram 报错。
  4. bench_pct = bench_cnt / np.sum(bench_cnt)把箱内计数归一化为占比,后续 PSI 公式直接使用。
  5. psi += (c - b) * np.log(c / b)逐箱累加公式:占比差乘以占比比的对数,与正文公式完全一致。
  6. miss_diff = abs(...isna().mean() - ...isna().mean())计算缺失率差异,把数据质量信号纳入监控。
  7. level = 'stable' if psi < 0.1 else ...按阈值把 PSI 映射为 stable/watch/drift 三级标签。
  8. ranked = sorted(results.items(), key=lambda kv: ..., reverse=True)按 PSI 降序排列特征,把最危险的漂移特征排在榜首。

常见误区

误区我一直以为 PSI 越小越好,最好是 0,说明模型输入完全没变,这样最安全。

正解PSI 接近 0 只能说明两个分布的箱占比高度相似,但它对细微偏移并不敏感,且完全相同的分布几乎不存在。实际监控中 0.02~0.08 的 PSI 都属正常波动,盲目追求 0 会导致对微小噪声过度反应,反而制造告警疲劳。像水质监测一样,完全一模一样的水样反而不正常。

为何常见:初学者容易把「稳定」等同于「相同」,忽略了自然采样本身就带随机波动。

误区我以为箱数越多,对分布刻画越细,PSI 算得越准,于是把连续特征分 100 箱。

正解箱数过大会让每箱样本量骤减,占比估计方差变大,PSI 被噪声主导。比如 1 万样本分 100 箱,平均每箱只有 100 个样本,任意波动都会让占比剧烈跳动。工程经验是 10~20 箱起步,再根据样本量和业务含义调整。分箱是「刻度尺的精度选择」,尺子太细反而量不准。

为何常见:直觉上「更精细 = 更准确」,忽略了统计估计中样本量与方差的制约关系。

误区我习惯先 dropna() 再算 PSI,觉得缺失值不属于真实分布,留着会污染结果。

正解缺失率的骤变本身就是重要的漂移信号。某特征缺失率从 1% 升到 20%,可能意味着上游数据管道故障或采集逻辑变更,这比数值分布的偏移更需要优先排查。正确做法是把缺失单独成箱或把缺失率作为并列监控指标,丢弃等于主动屏蔽掉一个高质量告警源。

为何常见:把「缺失」视为脏数据是数据处理课养成的习惯,但在漂移检测场景里,缺失是「元数据」,同样携带信息。

误区我以为只要 PSI 不超阈值,特征分布就一定没问题,可以放心让模型继续跑。

正解PSI 对「分布整体形状偏移」敏感,但对某些非线性变化不敏感——比如均值微移但方差同步缩小,各箱占比可能互相抵消,PSI 数值很小。此外它只针对单特征,无法捕获特征间相关性漂移。工程上需搭配 KS 检验、KL 散度、特征分布图,甚至多变量漂移指标,才能形成完整的监控网。

为何常见:单一量化指标上手快,容易让人产生「一个数字搞定一切」的依赖心理,而现实漂移形态多样。

面试题

Q1. PSI 的英文全称及中文含义是什么?

单选题 · easy

  • A.Population Stability Index,群体稳定性指标← 正确答案
  • B.Probability Status Index,概率状态指标
  • C.Population Sampling Indicator,群体采样指标
  • D.Precision Stability Index,精度稳定性指标

答案:A。PSI 全称是 Population Stability Index,译为群体稳定性指标,衡量两个时段特征分布的差异。B、C、D 都是对首字母的臆造,实际 PSI 中的 P 与 S 分别指 Population(群体)与 Stability(稳定性),与概率、采样、精度无关。

Q2. 某特征在第 3 箱的基准占比为 0.1,当前占比为 0.2,该箱对 PSI 的贡献最接近多少?

单选题 · mid

  • A.0.0693← 正确答案
  • B.0.2000
  • C.0.6930
  • D.0.0100

答案:A。代入公式 (0.2 − 0.1) × ln(0.2 / 0.1) = 0.1 × ln2 ≈ 0.1 × 0.693 = 0.0693。这就像水质监测中某一格水样的占比翻倍,会贡献一个正的偏移分。B 只取了占比差,C 只取了对数项,D 是两者相乘前的中间值。

Q3. 关于 PSI 分箱策略,以下说法正确的有哪些?

多选题 · mid

  • A.等距分箱对长尾分布易产生大量空箱← 正确答案
  • B.等频分箱可保证箱内样本量相对均匀← 正确答案
  • C.分箱越多一定越能提升 PSI 的准确性
  • D.重复值较多的特征需要合并边界去重← 正确答案

答案:ABD。等距分箱在长尾分布下大量样本挤在头几箱,其余箱可能为空,A 正确;等频通过分位数切分让样本均匀分布,B 正确;箱数过多会让每箱样本量稀疏、方差增大,C 错误;重复边界会导致空箱甚至计算异常,需要合并去重,D 正确。

Q4. 某特征当前窗口 PSI 为 0.08,最合理的处理方式是?

单选题 · easy

  • A.判定分布稳定,维持日常监控即可← 正确答案
  • B.立即触发模型重新训练流程
  • C.直接删除该特征不再监控
  • D.认定两分布完全重合无差异

答案:A。PSI 小于 0.1 表示分布偏移在可接受范围,A 正确。0.25 以上才触发重训,B 过度反应;删除特征是错误操作,C 错误;PSI 接近 0 只是占比相似,不代表完全重合,D 错误。

Q5. 特征缺失率从 1% 骤升至 18%,且 PSI 为 0.05,此时应如何处理?

单选题 · mid

  • A.缺失率本身是漂移信号,需优先排查数据链路← 正确答案
  • B.忽略缺失,因为 PSI 正常即代表分布稳定
  • C.删除所有缺失样本后重新计算 PSI
  • D.缺失不影响模型,继续观察即可

答案:A。缺失率骤变是数据质量劣化的强信号,即使 PSI 正常也应优先排查,A 正确。忽略缺失会放过管道故障,B 错误;删除样本会掩盖问题且改变分布,C 错误;缺失率飙升对模型预测有实质影响,D 错误。

Q6. 关于 PSI 的局限性,以下说法正确的有哪些?

多选题 · hard

  • A.样本量过小时占比估计方差大,分数不可信← 正确答案
  • B.对均值与方差同步调整的非线性漂移可能不敏感← 正确答案
  • C.分箱粒度不同会显著影响 PSI 数值← 正确答案
  • D.PSI 可检测特征间相关性的联合漂移

答案:ABC。样本量越小占比波动越大,A 正确;当均值右移同时方差缩小,各箱占比可能抵消,PSI 漏报,B 正确;同一分布用不同箱数算出的 PSI 可能差距很大,C 正确;PSI 只作用于单特征,无法感知特征相关性变化,D 错误。

Q7. 批量特征监控的正确执行顺序是?

单选题 · mid

  • A.全特征算 PSI,按降序排列并分级告警← 正确答案
  • B.只监控训练时最重要的一个特征
  • C.先重新训练模型,再回头算 PSI
  • D.人工随机抽查部分特征计算

答案:A。批量监控的本质是「全量扫描 + 降序排序 + 分级告警」,先覆盖所有特征再按漂移程度排优先级,A 正确。只监控一个特征会漏掉其他漂移,B 错误;重训应在告警触发后评估决定,C 逻辑颠倒;人工抽查无法保证全覆盖,D 错误。

Q8. 当前分布与基准分布的重叠度下降时,PSI 数值通常会怎样变化?

单选题 · hard

  • A.PSI 升高,因为各箱占比差异增大← 正确答案
  • B.PSI 降低,因为分布形状更接近
  • C.PSI 不变,重叠度与 PSI 无关
  • D.PSI 先降后升,无稳定规律

答案:A。重叠度下降意味着样本在两个分布的箱占比差异变大,逐箱的占比差和对数比都会增大,累加后 PSI 升高,A 正确。B 与公式方向相反;C、D 忽略 PSI 本质是分布距离度量,分布差异越大分数必然越高。

Q9. 特征级 PSI 监控系统工程化落地需要哪些关键组件?

多选题 · mid

  • A.固定时间窗口切分当前样本← 正确答案
  • B.保存训练期的基准分布快照← 正确答案
  • C.基准分布每日自动重建覆盖
  • D.缺失率与 PSI 并列纳入告警规则← 正确答案

答案:ABD。窗口切分提供「当前分布」的数据来源,A 正确;基准快照是计算对比的锚点,需随模型版本固化,B 正确;频繁自动重建基准会掩盖真实漂移,基准应人工评估后低频更新,C 错误;缺失率是数据质量信号,应与 PSI 一起参与告警,D 正确。

Q10. PSI 在 AI 工程化中最主要的用途是什么?

单选题 · easy

  • A.数据漂移检测与模型监控← 正确答案
  • B.模型梯度下降参数更新
  • C.图像数据增强策略选择
  • D.文本分词词典构建

答案:A。PSI 是比较两个时段特征分布差异的指标,核心用途是数据漂移检测与模型监控,A 正确。它与梯度下降、图像增强、分词都没有关系,B、C、D 属于干扰项,混淆了不同领域的常见术语。