ML 训练与测试数据不满足同分布 - 如何检测?如何解决?

news2024/12/24 2:48:28

😄 同分布问题是数据挖掘中的常见问题,也是ML中的一个重要假设。解决训练与测试数据不满足同分布问题,有助于提高模型的泛化性、稳定性!

文章目录

  • 一、定义:训练与测试数据不满足同分布
    • 定义:
    • ❓疑问:为什么数据会出现不满足同分布
  • 二、检测方法:检测训练与测试数据是否满足同分布
    • 1、基于统计指标的方法
      • 1、PSI检验
      • 2、KS检验
      • 3、Overlap Rate检验
      • 4、KL散度检验
      • 5、KDE核密度估计
    • 2、基于异常点检测的方法
    • 3、基于机器学习分类的方法
  • 三、解决方法:解决训练与测试数据不满足同分布
  • Reference:


一、定义:训练与测试数据不满足同分布

定义:

不满足同分布,也就是指训练与测试数据的数据集偏移问题。
数据集偏移用公式定义的话也就是说,训练集与测试集的联合概率分布不一致:

Ptrain(x, y) ≠ Ptese(x, y)

学过概率论的应该都记得,贝叶斯定理:

P(x, y) = P(y|x) * P(x) = P(x|y) * P(y)

  • P(x):输入空间的边缘概率分布
  • P(y):输出空间的标签分布
  • P(y|x):条件概率分布

从贝叶斯定理来看,只要其中的一项有变动,那P(x, y)就会改变,也就是数据集偏移,造成数据不满足同分布。
所以呢,以上3种因素分别对应如下3种造成数据不满足同分布问题的情况:
协变量偏移:输入空间的边缘概率分布P(x)的变化,即特征分布的变化造成的(协变量指特征)。如测试集中出现了训练集中没遇到过的特征。
先验偏移:输出空间的标签分布P(y)的变化造成的。如线上预测是在某段时间内,某种类别的样本剧增。
映射关系偏移:即P(y|x)的分布变化,x->y的映射关系变化造成。比如训练集中某类特征对应的是标签1,但线上测试时,同样的特征对应的标签却是标签2。

❓疑问:为什么数据会出现不满足同分布

这其实很正常。
(1)样本选择偏差:如我们收集数据时肯定是按照某种规则进行过滤筛选的,但和实际线上的一些数据可能是有差异的。
(2)不平稳环境:如信贷预测任务,在宏观经济景气时,某类用户是可以正常偿还的,但由于疫情等影响,这类用户无法偿还。



二、检测方法:检测训练与测试数据是否满足同分布

⭐ 有时候线上预测效果差了,你可能会认为你模型过度拟合了训练集了,但也有可能是因为待预测的数据的分布出现变化导致的。

具体地,可用如下几种常用方法:

1、基于统计指标的方法

1、PSI检验

  • 我们通常用群体稳定性指标(Population Stability Index,PSI), 衡量未来的(测试集)样本及模型训练样本评分的分布比例是否保持一致,以评估模型的稳定性。同理,PSI也可以细化衡量特征值的分布差异,评估数据特征层面的稳定性。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 其他的方法如 KS检验,KDE (核密度估计)

2、KS检验

⭐ KS是一种非参数检验方法,可以在不知道数据具体分布的情况下检验两个数据分布是否一致。当然这样方便的代价就是当检验的数据分布符合特定的分布时,KS检验的灵敏度没有相应的检验来的高。在样本量比较小的时候,KS检验作为非参数检验在分析两组数据之间是否不同时相当常用。

计算方式很简单,其实就是两组数据的累积分布图中曲线的最大垂直距离。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现:

from scipy.stats import ks_2samp
ks_2samp(train[col],test[col]).pvalue

3、Overlap Rate检验

⭐ 上面的KS检验适用于连续型变量,而对于类别型变量也可先编码然后再KS检验。或者通过特征重合率来检验(Overlap Rate,这里我简称OR)。其实OR的思想就是检测训练集的特征在测试集中出现的比率。

如:

训练集特征:[猫,狗,狗,猫,狗,狗,狗,猫] 
测试集特征:[猫,猫,鱼,猪,鱼,鱼,猪,猪]
重合率仅有1/4 (因为测试集中只有训练集中的猫,2/8=1/4)
即使该特征在训练集表现很好,但在测试集上的用处并不大,因为重合率仅有1/4,
反而会导致过拟合或者模型忽略到其他更有用的特征。

4、KL散度检验

⭐ 虽然特征重合率可以筛掉一些不好的特征,但是在下面这种情况下,特征重合率虽然是100%,但是特征的作用并不大:

训练集特征:[猫,猫,鱼,狗,鱼,鱼,猪,猪]
测试集特征:[猫,狗,狗,狗,狗,狗,狗,狗]
  • 该特征在训练集可能有很大的作用,但在测试集无法有效的划分样本,因为在测试集大多是一样的取值。在这种情况下,可先用用Overlap Rate筛选过后,再计算测试集的信息熵(在决策树中我们提到过,信息熵更大代表着可以更好的对样本进行划分)。
  • 但其实没必要这么麻烦,直接用KL散度即可一步到位。KL 散度是一种衡量两个概率分布的匹配程度的指标,两个分布差异越大,KL散度越大。注意如果要查看测试集特征是否与训练集相同,P代表训练集,Q代表测试集,这个公式对于P和Q并不是对称的。

5、KDE核密度估计

⭐ KDE核密度估计,看起来好像是统计学里面一个高端的非参数估计方法。我简单的理解下哈,大概就是通过一个核函数把一个频率分布直方图搞成平滑的了(如下图),然后把测试集和训练集的特征分别画出来,看看图像不像,不像的直接扔了就行/敷衍。大该知道是这个步骤就好。
在这里插入图片描述

代码实现:

import numpy as np
import seaborn as sns

sns.set(color_codes=True)
np.random.seed(10)
mean, cov = [0, 2], [(1, .5), (.5, 1)]
x, y = np.random.multivariate_normal(mean, cov, size=50).T
ax = sns.kdeplot(x)

2、基于异常点检测的方法

  • 这类方法属于异常检测那块了,通过训练集训练一个模型,再利用这个模型来识别出测试集中哪些样本不同于训练集的分布。如可用one-class SVM只在训练集里训练(整个训练集作为一类)。

3、基于机器学习分类的方法

⭐听大佬说kaggle上更为牛x的方法就是这种基于机器学习来分类的方法。

  • 如果测试数据可以拿到,那么可以将训练与测试数据分别标注为0和1,shuffle一下然后训练进行分类。若模型能够很好地区分开训练与测试数据,则说明训练与测试数据的特征值分布有较大差异,存在协变量偏移。

  • 同时,对分类贡献度高的特征也就是分布偏差较大的特征。分类准确的样本也就是分布偏差较大的样本。

  • 拓展小知识 - 竞赛tricks(代码链接请进入:https://www.kaggle.com/kevinbonnes/adversarial-validation):我们可用训练好的二分类模型对训练集进行预测,然后输出预测概率,根据这个概率为训练集设置权重(概率越接近1代表训练集分布更接近测试集),这样就可以强行过拟合到测试集上!对于非线上测试型的数据挖掘比赛应该会有比较大的提升!



三、解决方法:解决训练与测试数据不满足同分布

  • 1、增加数据。增加数据是最暴力最有效的,数据量越大,模型学到的知识更加泛化,也就见多识广了。

  • 2、数据增强。某些场景下可能比较难收集到大量数据。这时就可以通过数据增强来造出一些数据,从而提高原数据的质量,减少模型过拟合,提升泛化能力。

  • 3、选择数据。也就是说用全量数据不一定比筛选出一批数据训练效果好,因为可以筛选出和待预测的样本分布较一致的数据进行训练,这样效果更好。一般的做法有:选出较优的随机种子进行划分;人工选出与待预测样本分布较一致的训练样本(如根据时间相近,业务类型等,也可训练的时候基于这部分样本较高的学习权重)。

  • 4、半监督学习。通过半监督学习来捕捉数据整体的潜在分布。常见的做法是对无标注样本打上伪标签加入训练,看效果有无变好。对于伪标的方法:可根据业务含义或者模型来为无标注的样本打上伪标。

  • 5、特征选择。对于协变量偏移,特征选择是个不错的办法。如可根据前面说的PSI指标来分析各个特征的分布稳定性,筛掉分布差异大的特征(注:这里适用的是筛掉特征重要性一般且稳定性差的特征)。如果重要特征的分布差距也很大,这就难搞了,还是回头搞搞数据或者整整其他的强特征。

  • 6、均衡学习。均衡学习适用与标签分布差异(先验偏移)导致的数据集偏移。均衡学习的方法可以归结为:通过某种方法,使得不同类别的样本对于模型学习中的Loss(或梯度)贡献是比较均衡的,以消除模型对不同类别的偏向性,学习到更为本质的决策。还可通过采样型方法缓解,或者采用更合理的指标(如AUC),减少非均衡样本的影响造成判定结果不合理。


Reference:

[1] ​机器学习数据不满足同分布,怎么整?
[2] 5种数据同分布的检测方法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仿牛客论坛项目

源代码:https://gitee.com/qiuyusy/community 1. Spring 在测试类中使用Spring环境 RunWith(SpringRunner.class) 让Spring先运行ContextConfiguration 导入配置文件implements ApplicationContextAware 后实现方法 获得 applicationContext RunWith(SpringRunner.class) S…

关于JVM

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 内存区域的划分 程序计数器(线程私有) Java虚拟机栈 (线程私有) 本地方法栈 堆(线程共享) 方法…

Leetcode:77. 组合、216. 组合总和 III(C++)

目录​​​​​​​ 77. 组合: 问题描述: 实现代码与解析: 递归(回溯): 原理思路: 剪枝优化版: 原理思路: 216. 组合总和 III: 问题描述&#xff1a…

[C/C++]指针,指针数组,数组指针,函数指针

文章目录指针内存空间的访问方式指针变量的声明指针的赋值指针运算用指针处理数组元素指针数组用指针作为函数的参数指针型函数指向函数的指针指针 指针是C从C中继承过来的重要数据类型。通过指针技术可以描述各种复杂的数据结构,可以更加灵活的处理字符串&#xf…

Linux下dmi信息分析工具dmidecode原理

dmidecode命令主要是通过DMI获取主机的硬件信息,其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。它是通过SMBIOS(System Management BIOS)来获取信息的。SMBIOS是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 什么是DM…

QA特辑 | 以万变钳制黑灰产之变的验证码产品设计逻辑的答案,都在这里

1月12 日下午,就验证码的攻防对抗问题,顶象反欺诈专家大卫从验证码的破解手段讲起,从防御角度深度剖析如何应对黑灰产的攻击以及验证码在产品能力设计层面应该考虑哪些问题。 直播也吸引了众多关注验证码的观众前来围观,针对验证…

vue3性能优化

文章目录1. Lighthouse1.1 性能参数2. rollup-plugin-visualizer(打包代码块分析)3. vite配置优化4. PWA离线缓存技术5. 其他优化1. Lighthouse 谷歌浏览器自带的 DevTools 也可以全局安装Lighthouse # 安装 yarn global add lighthouse# 使用 lighth…

Android app集成微信支付

Android app集成微信支付 鉴于微信支付的文档入口不太容易找到、以及文档中有些逻辑不通或者容易产生歧义或者缺失一些信息的情况,记录下此次接入的流程和需要关注的一些点。 使用的是app支付-> APP支付产品介绍 首先阅读介绍等,了解一些基础的概念…

c++数据结构-图(详解附算法代码,一看就懂)

图(Graph)是一种复杂的非线性结构,它可以描述数据间的关系,被广泛使用。图 G 由两个集合 V 和 E 组成,记为 。V是顶点的有穷非空集合,E是边的集合。通常,也将 G 的顶点集和边集表示为 V(G) 和 E…

尚医通-登录注册搭建-JWT(二十八)

目录: (1)前台用户系统-登录注册-需求分析 (2)前台用户系统-登录注册-搭建环境 (3)前台用户系统-手机登录-基本实现 (4)前台用户系统-手机登录-整合JWT (…

【JUC并发编程】使用多线程可能带来什么问题

【JUC并发编程】使用多线程可能带来什么问题? 文章目录【JUC并发编程】使用多线程可能带来什么问题?什么是多线程并发为什么会出现线程带来的安全性问题可见性问题原子性问题有序性问题活跃性问题性能问题引起线程切换的几种方式什么是多线程 多线程意味着你能够在同一个应用…

Linux的ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM及分配页释放页函数的简单介绍

Linux的ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM及分配页释放页函数的简单介绍简单介绍一下页:Linux 区:分配页系统调用释放页系统调用简单介绍一下页: 内核把物理页作为内存管理的基本单位。 尽管处理器的最小可寻址单位通常为字(甚至…

ZooKeeper-分布式锁实现

4.11)Zookeeper分布式锁-概念 •在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题。 •但当我们的应用是分…

【JavaScript】实现简易购物车

💻【JavaScript】实现简易购物车 🏠专栏:有趣实用案例 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻前端…

客快物流大数据项目(一百零四):为什么选择Elastic Search作为存储服务

文章目录 为什么选择Elastic Search作为存储服务 一、​​​​​​​​​​​​​​ElasticSearch简介

【GD32F427开发板试用】懒人新手试用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:东东_dxGGN2 我收到的开发板是GD32F427R-START,MCU是GD32F427RKT6,如下图(座机拍的见谅) 测试流…

【C++】从0到1入门C++编程学习笔记 - 核心编程篇:内存分区模型

文章目录一、程序运行前二、程序运行后三、new 操作符C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释…

2022年回顾 | 被磨砺,被厚待

岁末年首, 最宜盘点过往的时光。 回顾2022团结一心,攻坚克难, 祝福2023大展宏图,鹏程万里。 2022我们遇到了"卷土重来"、 “挥之不去”, 也等到了"再也不见"和 “永远下线”。 2022是一个&…

HTML中的table标签与a标签

这里写自定义目录标题一、table标签1、什么是table标签2、table标签中长见到的标签3、例子代码及其结果二、a标签1、什么是a标签2、a标签中常见的属性3、例子代码及其结果一、table标签 1、什么是table标签 table标签表示整体的一个表格 2、table标签中长见到的标签 <tr…

基于Spring Boot和Spring Cloud实现微服务架构

首先&#xff0c;最想说的是&#xff0c;当你要学习一套最新的技术时&#xff0c;官网的英文文档是学习的最佳渠道。因为网上流传的多数资料是官网翻译而来&#xff0c;很多描述的重点也都偏向于作者自身碰到的问题&#xff0c;这样就很容易让你理解和操作出现偏差&#xff0c;…