covariate shift现象的解释

本文介绍了机器学习中的covariate shift问题,即训练集和测试集样本点概率密度不同的情况。传统机器学习假设两者独立同分布,但现实中该假设常不成立。文中还阐述了通过附加由x决定的权值来解决此问题,从迁移学习角度看,这也是一种知识迁移方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:训练机器学习系统时,一个一般的假设是它每次的输入的分布是稳定的。如果不满足这个假设,就是covariate shift,这个通常通过domian adaption解决。在训练一个复杂的机器学习系统时,同样要求这个sub-network对应的输入(activation)分布(distribution)是稳定的,如果不满足这个假设,就是本文提出的internal covariate shift(ICS)。CNN训练中,存在的ICS问题提出batch normalizaiton,一方面通过normalization使得每个网络层的输入尽量保持稳定的分布(均值为0以及单位方差),另一方面通过一个线性变化(transform)使得该层的输入在表达能力上也同时保持较好的效果。 


原文:https://blog.youkuaiyun.com/a1154761720/article/details/50812607 
 

一、什么是covariate shift?
在论文中经常碰到covariate shift这个词,网上相关的中文解释比较少。你可能会在介绍深度学习Batch Normalization方法的论文到中看到covariate shift这个词,并且所有看过这篇论文的或者实际做过工程的人,都知道BN这种归一化手段很好用,可以避免covariate shift

那么covariate shift到底是什么?
不用想得太复杂,covariate shift最早只是机器学习中的一个问题。同时迁移学习会经常涉及到这个概念。
假设x是属于特征空间的某一样本点,y是标签。covariate这个词,其实就是指这里的x,那么covariate shift可以直接根据字面意思去理解:样本点x的变化。
这么简单?没错就是这么简单!

我们讲的规范一点:
假设q1(x)是测试集中一个样本点的概率密度,q0(x)是训练集中一个样本点的概率密度。最终我们估计一个条件概率密度p(y|x,θ),它由x和一组参数θ={θ1,θ2......θm}所决定。对于一组参数来说,对应loss(θ)函数评估性能的好坏
综上,当我们找出在q0(x)分布上最优的一组θ'时,能否保证q1(x)上测试时也最好呢?
传统机器学习假设训练集和测试集是独立同分布的,即q0(x)=q1(x),所以可以推出最优θ'依然可以保证q1(x)最优。但现实当中这个假设往往不成立,伴随新数据产生,老数据会过时,当q0(x)不再等于q1(x)时,就被称作covariate shift


二、怎么解决covariate shift?
以上已经知道一个样本点分别在训练集和测试集上的概率密度q0(x)和q1(x),实际当中的解决方案是附加一个由x决定的权值

使得在训练过程当中对于q1(x)很大或者q0(x)很小的样本视作“重要”样本,这样的样本是有益于测试集预测的,我们应该尽量把它分类正确。而对于q1(x)很小或者q0(x)很大的样本,它只是被时代遗弃的“老数据”,这些样本对于模型训练的意义也是无关紧要了

举一个形象的例子:

现在我们要通过多项式回归预测某一个函数。数据产生通过下式,并且用正态分布产生噪声加在上面

通过一个其中产生q0(x)当作训练集,大小为n=100

假设模型的形式是,最终训练得到一根直线去尽可能拟合这些点。

实验结果如左图,最终得到一条线,对应图中OLS

根据其中生成测试集q1(x),如右图

最理想的情况,我们直接拟合测试集的点,得到右图中的实线,和左边的线完全不一样,看出covariate shift发生了。

但是我们需要测试集的辅助来解决covariate shift问题(如果直接训练测试集就毫无意义了),求得

通过附加权值的方法,最终训练得到左图中虚线WLS

可以看出最终得到的模型,是可以很好的适应测试集的。

从迁移学习的角度看,这也是一种用source domain的标签数据,结合target domain的无标签数据,指导进行知识的迁移的方法。


原文:https://blog.youkuaiyun.com/mao_xiao_feng/article/details/54317852 
 

### 协变量移位的概念 协变量移位(Covariate Shift)是指训练数据和测试数据之间的输入特征分布存在差异的情况。这种现象不会改变条件概率 \( P(y|x) \),即给定输入 \( x \) 的输出 \( y \) 的分布保持不变,但边缘分布 \( P(x) \) 发生变化[^1]。 具体来说,在机器学习模型中,如果训练集中的特征分布与实际应用环境下的特征分布不同,则可能会发生协变量移位。这可能导致模型性能下降,因为模型是在特定的数据分布上进行了优化,而在不同的分布下可能不再适用。 ### 示例解释 考虑一个简单的例子来说明协变量移位: 假设有一个用于预测房屋价格的任务,其中使用的特征包括房子面积、房间数量等。现在有两组数据:一组来自城市A,另一组来自城市B。两个城市的房价结构相似,因此可以认为对于相同的房子属性,其价值评估方式相同,即 \( P(price|features) \) 是一致的。然而,由于地理因素的影响,这两个地方的房子大小通常会有所不同;比如城市A里的住宅普遍较小而紧凑,相比之下城市B则拥有更多大型别墅式的房产。这就意味着尽管目标函数未变,但是输入空间的概率密度发生了偏移,从而形成了所谓的covariate shift。 为了应对这种情况,一种常见的方法是对新样本重新加权或将源域上的模型迁移至目标域。通过调整权重使得新的观测更接近于原始训练集中所见的情形,或者采用领域适配技术让算法能够更好地泛化到未知环境中去[^2]。 ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression # 假设这是城市 A 和 B 的数据 X_A = np.random.normal(loc=80, scale=15, size=(1000, 1)) # 平均面积为80平米的城市A y_A = X_A * 3 + np.random.randn(1000, 1)*10 # 简单线性关系加上噪声 X_B = np.random.normal(loc=150, scale=40, size=(1000, 1)) # 平均面积为150平米的城市B y_B = X_B * 3 + np.random.randn(1000, 1)*10 # 同样的简单线性关系加上噪声 # 训练基于城市A的数据建立回归模型 scaler = StandardScaler() model = LinearRegression() X_train_scaled = scaler.fit_transform(X_A) model.fit(X_train_scaled, y_A) # 测试该模型在城市B的表现前先标准化处理 X_test_scaled = scaler.transform(X_B) predictions_on_city_b = model.predict(X_test_scaled) print("Model performance on City B might be poor due to covariate shift.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值