协变量偏移Covariate Shift
发布网友
发布时间:2022-11-24 02:25
我来回答
共1个回答
热心网友
时间:2024-10-28 17:08
内部协变量偏移(Internal Covariate Shift)和批归一化(Batch Normalization) - (jianshu.com)
在ML项目中,我们一般将采集到的真实场景的数据分成训练集和测试集(或验证集),并假设训练集和测试集符合独立同分布,这样才能保证在训练集上表现良好的模型同样适用于测试集(真实场景)。
但是当因为某些原因,导致训练集和测试集不同分布,便发生了 dataset shift (or drifting)。
Dataset Shift类型
协变量偏移(Covariate Shift)
先验概率偏移(Prior probability shift)
概念偏移
字面理解就是自变量和因变量之间的关系发生了改变。
2.上一步得到了一个新的训练集. 将这个训练集的一部分数据(如80%)用来训练模型(KNN, SVM等), 剩下的数据(如20%)用来测试模型的性能。
3.计算模型在测试集上的AUC-ROC,如果指标较大(比如大于0.8),便可判定发生了Covariate Shift。
这里介绍两种方法解决covariate shift现象:
去除产生covariate shift现象的特征(Dropping of drifting features)
Dropping of drifting features
这个方法很简单,就是去掉产生了偏移(shift)的特征。但是直接去掉特征很可能带来信息损失,导致模型效果变的更差。所以一个简单的原则就是:去除产生偏移的且不重要的特征。
以kaggle的俄罗斯联邦储蓄银行住房市场 ( Sberbank Russian Housing Market)数据为例。我们通过逐个特征分类分析,得到了产生了偏移的特征:
然后分析出所有特征中最重要的20个特征如下,通过对比找出产生偏移的且不重要的特征去除掉即可。
这里有个重要问题就是如何确定特征的重要性。介绍两种比较流行的特征重要性评估方法[2]:
这个方法的原理其实就是Tree-Model进行分类、回归的原理:特征越重要,对节点的纯度增加的效果越好。而纯度的判别标准有很多,如GINI、信息熵、信息熵增益。(sklearn中的树模型提供了feature_importances_采用的就是这种方法计算得到的)
这个方法更直观一些,是说某个特征对模型精度的影响。把一个变量的取值变为随机数,随机森林预测准确性的降低程度。该值越大表示该变量的重要性越大。 这个方法是很多研究、文献中所采用的方法。
Discriminative Learning Under Covariate Shift[3]这篇文章介绍了一种通过对训练数据加权解决训练数据分布与测试数据分布不一致的问题。具体的论证可以参考论文,这里给出简单实现。
1.获取不同数据分布之间的差异
假设样本点为xi,它在训练数据分布为q(xi),在测试数据中的分布为p(xi),则它的密度比表示为p(xi)/q(xi),作为后续的权重系数。那么如何求解分布q和p,文中的思路为训练一个分类模型,数据为“训练+测试”数据,Label为是否属于训练集(测试集标识1,训练集标识-1)。 分类器分得准,证明数据差异明显,分布不一致。反之亦然。
2.使用权重系数对训练数据加权
学到了这个系数便可以对训练数据中的每个样本加权。(可以理解为重要性加权)