协变量偏移Covariate Shift
内部协变量偏移和协变量偏移还是有所不同,这里主要强调的是外部协变量的偏移,也就是训练集和应用测试集的分布不一样。
Covariate Shift - 知乎 (zhihu.com)(转载)
内部协变量偏移(Internal Covariate Shift)和批归一化(Batch Normalization) - 简书 (jianshu.com)
Dataset Shift概念
在ML项目中,我们一般将采集到的真实场景的数据分成训练集和测试集(或验证集),并假设训练集和测试集符合独立同分布,这样才能保证在训练集上表现良好的模型同样适用于测试集(真实场景)。
但是当因为某些原因,导致训练集和测试集不同分布,便发生了 dataset shift (or drifting)。
Dataset Shift类型
dataset shift的类型一般分为三种(以下的协变量因变量可以理解为数据中的x及对应标签y):
协变量偏移(Covariate Shift)
协变量的变化,比如模型应用场景中环境、位置的变化等
注:这里解释下此处的协变量,假设我们要拟合方程 y=wx,对于一个数据对(x,y):
y为因变量,w为自变量,x为协变量。
先验概率偏移(Prior probability shift)
因变量的变化,比如根据月份预测销售额的模型,用平时月份训练的模型预测销售高峰月份的销售额。输入仍然为月份没有变化,但训练集和实际场景中的因变量完全不一样(一般月份和销售高峰月份的销售额本就不一样)。
概念偏移
字面理解就是自变量和因变量之间的关系发生了改变。
识别Covariate Shift的一般思路
如果数据发生了Covariate Shift的数据,那么理论上可以通过一个分类器以一个较高的准确率将原始数据和测试数据区分开(毕竟分布不同)。
- 在训练集和测试集中随机采样(注意训练集和测试集的采样数量需要一致),然后将采样数据混合到一起形成新的训练数据,对数据增加一个新维度标签,取值取决于数据来源(比如训练集标识1,测试集标识0)。
2.上一步得到了一个新的训练集. 将这个训练集的一部分数据(如80%)用来训练模型(KNN, SVM等), 剩下的数据(如20%)用来测试模型的性能。
3.计算模型在测试集上的AUC-ROC,如果指标较大(比如大于0.8),便可判定发生了Covariate Shift。
解决covariate shift的方法
这里介绍两种方法解决covariate shift现象:
去除产生covariate shift现象的特征(Dropping of drifting features)
使用密度比的重要性加权(Importance weight using Density Ratio Estimation)
Dropping of drifting features
这个方法很简单,就是去掉产生了偏移(shift)的特征。但是直接去掉特征很可能带来信息损失,导致模型效果变的更差。所以一个简单的原则就是:去除产生偏移的且不重要的特征。
以kaggle的俄罗斯联邦储蓄银行住房市场 ( Sberbank Russian Housing Market)数据为例。我们通过逐个特征分类分析,得到了产生了偏移的特征:
然后分析出所有特征中最重要的20个特征如下,通过对比找出产生偏移的且不重要的特征去除掉即可。
这里有个重要问题就是如何确定特征的重要性。介绍两种比较流行的特征重要性评估方法[2]:
Mean decrease impurity
这个方法的原理其实就是Tree-Model进行分类、回归的原理:特征越重要,对节点的纯度增加的效果越好。而纯度的判别标准有很多,如GINI、信息熵、信息熵增益。(sklearn中的树模型提供了feature_importances_采用的就是这种方法计算得到的)
Mean decrease accuracy
这个方法更直观一些,是说某个特征对模型精度的影响。把一个变量的取值变为随机数,随机森林预测准确性的降低程度。该值越大表示该变量的重要性越大。 这个方法是很多研究、文献中所采用的方法。
Importance weight using Density Ratio Estimation
Discriminative Learning Under Covariate Shift[3]这篇文章介绍了一种通过对训练数据加权解决训练数据分布与测试数据分布不一致的问题。具体的论证可以参考论文,这里给出简单实现。
1.获取不同数据分布之间的差异
假设样本点为xi,它在训练数据分布为q(xi),在测试数据中的分布为p(xi),则它的密度比表示为p(xi)/q(xi),作为后续的权重系数。那么如何求解分布q和p,文中的思路为训练一个分类模型,数据为“训练+测试”数据,Label为是否属于训练集(测试集标识1,训练集标识-1)。 分类器分得准,证明数据差异明显,分布不一致。反之亦然。
image.png
2.使用权重系数对训练数据加权
学到了这个系数便可以对训练数据中的每个样本加权。(可以理解为重要性加权)