转载于https://zhuanlan.zhihu.com/p/205183444

此系列文章为笔者学习工作中的阶段性总结,难免有纰漏,如有不正之处,欢迎指正,大家共同成长。

Covariate Shift现象在机器学习的工业界应用中经常遇到,这个概念实际上属于Dataset Shift的一种。

Dataset Shift概念

在ML项目中,我们一般将采集到的真实场景的数据分成训练集和测试集(或验证集),并假设训练集和测试集符合独立同分布,这样才能保证在训练集上表现良好的模型同样适用于测试集(真实场景)。

但是当因为某些原因,导致训练集和测试集不同分布,便发生了 dataset shift (or drifting)

Dataset Shift

Dataset Shift类型

dataset shift的类型一般分为三种(以下的协变量因变量可以理解为数据中的x及对应标签y):

  • 协变量偏移(Covariate Shift)

协变量的变化,比如模型应用场景中环境、位置的变化等

注:这里解释下此处的协变量,假设我们要拟合方程 y=wx,对于一个数据对(x,y):
y为因变量,w为自变量,x为协变量。

  • 先验概率偏移(Prior probability shift)

因变量的变化,比如根据月份预测销售额的模型,用平时月份训练的模型预测销售高峰月份的销售额。输入仍然为月份没有变化,但训练集和实际场景中的因变量完全不一样(一般月份和销售高峰月份的销售额本就不一样)。

  • 概念偏移

字面理解就是自变量和因变量之间的关系发生了改变。

识别Covariate Shift

在实际问题中,我们最常遇到的应该是Covariate Shift了,如下图所示,当训练集和测试集差异较大时,我们的训练往往是徒劳的。那么如何分辨发生了Covariate Shift。

Covariate Shift

识别Covariate Shift的一般思路

如果数据发生了Covariate Shift的数据,那么理论上可以通过一个分类器以一个较高的准确率将原始数据和测试数据区分开(毕竟分布不同)。

  1. 在训练集和测试集中随机采样(注意训练集和测试集的采样数量需要一致),然后将采样数据混合到一起形成新的训练数据,对数据增加一个新维度标签,取值取决于数据来源(比如训练集标识1,测试集标识0)。
  2. 上一步得到了一个新的训练集. 将这个训练集的一部分数据(如80%)用来训练模型(KNN, SVM等), 剩下的数据(如20%)用来测试模型的性能。
  3. 计算模型在测试集上的AUC-ROC,如果指标较大(比如大于0.8),便可判定发生了Covariate Shift。

第3步计算AUC-ROC,本质上就是为了衡量二元分类质量。我们还可以采用MCC(Matthews correlation coefficient)来衡量。一般MCC阈值可以设置为0.2。MCC>0.2说明出现了covariate shift的现象,反之亦然。

MCC

PS:

TP(True Positive):真实为1,预测为1 FN(False Negative):真实为1,预测为0 FP(False Positive):真实为0,预测为1 TN(True Negative):真实为0,预测为0

解决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)数据为例。我们通过逐个特征分类分析,得到了产生了偏移的特征:

# Drifting features :
{id, life_sq, kitch_sq, hospital_beds_raion,  cafe_sum_500_min_price_avg, cafe_sum_500_max_price_avg,  cafe_avg_price_500 }

然后分析出所有特征中最重要的20个特征如下,通过对比找出产生偏移的且不重要的特征去除掉即可。


这里有个重要问题就是如何确定特征的重要性。介绍两种比较流行的特征重要性评估方法[2]:

  1. Mean decrease impurity 这个方法的原理其实就是Tree-Model进行分类、回归的原理:特征越重要,对节点的纯度增加的效果越好。而纯度的判别标准有很多,如GINI、信息熵、信息熵增益。(sklearn中的树模型提供了feature_importances_采用的就是这种方法计算得到的)
  2. 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)。 分类器分得准,证明数据差异明显,分布不一致。反之亦然。

分类器以LR模型为例:

其中,z=1表示样本来自测试集,z=-1表示样本来自训练集。f(xi)表示sigmoid函数的输入值。

两式相比,求得系数p(xi)/q(xi)。

理论上这里用什么learning方法出来的分类器都是可以的。

2.使用权重系数对训练数据加权

学到了这个系数便可以对训练数据中的每个样本加权。(可以理解为重要性加权)

注:

训练LR模型的时候数据标注不一定是训练集-1测试集1,也可以反过来。反过来的话最终的系数为 ,最终加权效果是一样的,因为此时模型学得的 也是相反的。

参考

[1] Covariate Shift – Unearthing hidden problems in Real World Data Science

https://www.analyticsvidhya.com/blog/2017/07/covariate-shift-the-hidden-problem-of-real-world-data-science/

[2] sklearn的feature_importances_含义是什么?

https://blog.csdn.net/weixin_37659245/article/details/100171656

[3] Discriminative Learning Under Covariate Shift

https://jmlr.csail.mit.edu/papers/volume10/bickel09a/bickel09a.pdf

[4] covariate shift现象以及解决方法

https://blog.csdn.net/guoyuhaoaaa/article/details/80236500

[5] 豆瓣Discriminative Learning Under Covariate Shift

https://site.douban.com/204776/widget/notes/13820472/note/286149491/

Covariate Shift(协变量偏移)相关推荐

  1. 协变量偏移_恶意软件分类的协变量偏移

    协变量偏移 介绍 (Introduction) Covariate shift in the data-generating distribution lowers the usefulness of ...

  2. 关于Teacher Forcing、自回归和内部协变量偏移等概念梳理

    Teacher Forcing Teacher Forcing是一种训练神经网络生成模型的技术,通常应用于序列到序列(seq2seq)模型,特别是在机器翻译等任务中.它的基本思想是在训练时,将真实的目 ...

  3. 【论文理解】Batch Normalization论文中关于BN背景和减少内部协变量偏移的解读(论文第1、2节)

    最近在啃Batch Normalization的原论文(Title:Batch Normalization: Accelerating Deep Network Training by Reducin ...

  4. 协变量偏移与领域偏移

    转载于https://zhuanlan.zhihu.com/p/195704051 协变量偏移Covariate Shift 数据集偏移 Dataset Shift的一种,源域与目标与边缘分布不同,条 ...

  5. 协变量偏移/标签偏移/概念偏移

    协变量偏移 这里我们假设,虽然输入的分布可能随时间而改变,但是标记函数,即条件分布P(y∣x)不会改变.虽然这个问题容易理解,但在实践中也容易忽视. 想想区分猫和狗的一个例子.我们的训练数据使用的是猫 ...

  6. Covariate Shift

    转载于https://zhuanlan.zhihu.com/p/205183444 此系列文章为笔者学习工作中的阶段性总结,难免有纰漏,如有不正之处,欢迎指正,大家共同成长. Covariate Sh ...

  7. 【翻译】Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift

    Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift Sergey I ...

  8. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文笔记

    Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文链接: h ...

  9. Batch Nornaliation:Accelerating Deep Network Training by ReducingInternal Covariate Shift

    研究背景: 训练深度神经网络的复杂性在于,每一层的 输入分布在训练期间随着前一层的参数变化而变化,这需要通过较低的学习率和仔细的参数初始化来减慢训练速度,并且使得训练具有饱和非线性的模型变得非常困难. ...

最新文章

  1. 一个接口同时支持 form 表单、form-data、json 的优雅写法
  2. atitit.android模拟器使用报告
  3. MemSQL可以为时间序列应用做些什么
  4. (转)基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面...
  5. LG化学和三星SDI宣布关闭美国电池工厂直至4月13日
  6. Linux Man手册的使用示例
  7. 【简报】kube框架结构-一个小型响应式CSS框架
  8. spring的路径匹配问题
  9. 【液晶模块系列基础视频】3.2fatfs接口函数的使用2
  10. ZipArchive是一个开源的zip开发包工具。
  11. ubuntu16.04下运行海康威视网络摄像头sdk(qtdemo)
  12. 推荐几个高质量图片网站,再也不怕没图装X了
  13. jquery图片3D旋绕效果 rotate3Di的操作
  14. Matlab中mat2str函数使用
  15. ValueError: Format specifier missing precision
  16. C语言和R语言变量命名规则的比较
  17. c++中getline用法
  18. LiteOS学习---开发环境初识
  19. js如何实现重定当前向页面并刷新?
  20. 《数据分析咖哥十话》包邮送3本

热门文章

  1. 解决dia无法输入中文问题
  2. 收藏 | JS开发必须知道的41个技巧
  3. Maven 打包报“java.lang.StackOverflowError”错解决办法
  4. shell命令和编程设置环境变量
  5. tf.logging.set_verbosity(tf.logging.INFO)
  6. Linux gizp、bzip2、tar详解
  7. java编程实现给微信发送消息
  8. 阿根廷探戈预热“环球春晚”(图)_网易新闻中心
  9. 探索iOS之多摄像头预览架构
  10. 理解Python元类——e-satis