4. 域与分布偏移分析

在多数据集联合训练中,真正让模型“翻车”的往往不是数据量不足,而是训练域与目标域之间的分布不一致。若把源域记作 P_s(X, Y),目标域记作 P_t(X, Y),那么联合分布的差异可以沿不同路径分解。工程上最常用的四类偏移是:协变量偏移、标签偏移、概念偏移与条件偏移。识别它们,决定了后续该做重加权、重采样、伪标签、还是直接做特征对齐。

核心分解:P(X, Y) = P(X) · P(Y|X) = P(Y) · P(X|Y)。协变量偏移看 P(X),标签偏移看 P(Y),概念偏移看 P(Y|X),条件偏移看 P(X|Y)。四者并非互斥,真实场景常是混合偏移。

四类偏移的识别逻辑

协变量偏移(Covariate Shift):输入分布变化,但标签生成机制不变,即 P_s(Y|X) = P_t(Y|X),而 P_s(X) ≠ P_t(X)。典型场景是训练集来自白天道路图像,部署时是夜间图像;或医疗训练数据来自 A 医院设备,推理时来自 B 医院设备。识别信号是:输入特征统计量(均值、方差、直方图、嵌入分布)明显漂移,但同一输入下的标注规则一致。

标签偏移(Label Shift / Prior Shift):类别先验变化,但类条件分布不变,即 P_s(X|Y) = P_t(X|Y),而 P_s(Y) ≠ P_t(Y)。例如训练集正负样本 1:1,线上真实流量正负比 1:100。识别信号是:混淆矩阵中各类的预测比例与真实先验不一致,且类内特征分布相对稳定。

概念偏移(Concept Shift):输入到标签的映射本身改变,即 P_s(Y|X) ≠ P_t(Y|X)。例如“垃圾邮件”的定义随季节变化,或金融风控中“违约”的判定标准调整。识别信号是:即使输入分布相似,模型在目标域上的条件错误率显著上升,且错误集中在特定类别或特定区域。

条件偏移(Conditional Shift):给定标签时输入分布变化,即 P_s(X|Y) ≠ P_t(X|Y)。它常与标签偏移同时出现,例如同一疾病在不同人群中的影像表现不同。识别信号是:类内特征分布发生漂移,而类别先验可能不变。

联合分布 P(X,Y) 的四类偏移分解与识别路径 源域 P_s(X,Y) → 目标域 P_t(X,Y) 先判断哪一项发生变化 协变量偏移 P(X) 变,P(Y|X) 不变 标签偏移 P(Y) 变,P(X|Y) 不变 概念偏移 P(Y|X) 变 条件偏移 P(X|Y) 变 识别信号 输入统计漂移 域分类器 AUC 高 条件错误率稳定 识别信号 预测类别比例偏移 类内特征稳定 混淆矩阵先验失配 识别信号 同输入不同标签 条件错误率上升 决策边界失效 识别信号 类内分布漂移 类条件嵌入偏移 先验可能不变 度量与可视化工具箱 • 一维/二维特征直方图、核密度估计(KDE)对比:快速看 P(X) 漂移 • t-SNE / UMAP 嵌入散点:按域着色,观察域簇是否可分 • 域分类器 AUC:接近 0.5 表示域不可分,接近 1 表示强偏移 • MMD / KL / JS / Wasserstein:量化分布距离,适合监控与告警

度量方法与工程流程

识别偏移不能只靠肉眼看损失曲线。推荐按“先粗后细、先无监督后有监督”的顺序推进:

  1. 特征级监控:对每个关键特征计算源域与目标域的均值、方差、分位数,并用 PSI(Population Stability Index)或 KS 检验做告警。
  2. 域分类器:训练一个二分类器区分样本来自源域还是目标域。若 AUC 显著高于 0.5,说明域间存在可区分差异;再通过特征重要性定位漂移维度。
  3. 分布距离度量:在嵌入空间计算 MMD 或 Wasserstein 距离,作为联合训练时的对齐损失或早停指标。
  4. 标签侧诊断:用混淆矩阵估计目标域类别先验,若预测比例与源域先验差异大,优先怀疑标签偏移。
  5. 条件侧诊断:固定标签后比较类内特征分布,若类内距离大而类间距离小,则条件偏移显著。
# 域分类器 AUC 快速诊断示例
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
import numpy as np

X = np.vstack([X_source, X_target])
y_domain = np.array([0]*len(X_source) + [1]*len(X_target))

clf = LogisticRegression(max_iter=1000)
auc = cross_val_score(clf, X, y_domain, cv=5, scoring="roc_auc").mean()
print(f"Domain classifier AUC = {auc:.3f}")
# AUC ≈ 0.5:域不可分,偏移弱
# AUC > 0.8:域强可分,需重点处理

案例:跨医院影像分类的偏移诊断

假设源域是 A 医院 2 万张胸部 X 光片,目标域是 B 医院 5 千张。训练前先做三件事:第一,用域分类器得到 AUC=0.91,说明存在强协变量偏移,主要来自设备灰度与分辨率差异;第二,统计标签先验,A 医院肺炎阳性率 32%,B 医院 18%,存在明显标签偏移;第三,固定“肺炎”标签后比较影像嵌入,类内 MMD 较大,说明条件偏移同时存在。此时若只做简单的类别重加权,无法解决设备差异;正确做法是“图像标准化 + 域对抗特征对齐 + 目标域先验校正”组合拳。

常见误区与复盘清单

误区 表现 纠正方式
把偏移等同于数据量不足 盲目扩增源域数据,目标域指标不升 先做域分类器 AUC 与分布距离诊断
只用准确率判断偏移 整体准确率尚可,但少数类崩溃 分类别、分域报告指标与混淆矩阵
忽略标签偏移 阈值校准失效,召回率骤降 估计目标域先验,做 logit adjustment
把概念偏移当协变量偏移处理 重加权后仍无法收敛 检查 P(Y|X) 是否变化,必要时重新标注
实用建议:在联合训练流水线中,把“域分类器 AUC、MMD、类别先验 KL”作为三个常驻监控指标。任何一项超过阈值,就触发偏移诊断子流程,而不是等到最终指标下降才回头排查。
注意:四类偏移的识别依赖对 P(X)、P(Y)、P(Y|X)、P(X|Y) 的估计,而目标域标签往往缺失。工程上应优先使用无监督指标(域分类器、MMD、特征统计)做初筛,再在少量目标域标注上做条件侧确认,避免过度依赖不可得的监督信号。