在数据挖掘比赛中,很重要的一个技巧就是要确定训练集与测试集特征是否同分布,这也是机器学习的一个很重要的假设[1]。但很多时候我们知道这个道理,却很难有方法来保证数据同分布,这篇文章就分享一下我所了解的同分布检验方法。

封面:电影《红猪(红の豚)》


1. KS检验

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

具体操作方法如下:

  1. 画出数据的累积分段图。举个例子,对于数据集 {1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38},先对其排序为 {0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57}。其中比0.24小的一共有4个,占数据集的 1/5,所以0.24的累积分布值是0.2,依次类推我们可以画出累积分布图。

2. 对于累积分布图取Log变换

3. 通过两个数据的累积分布图直接最大垂直距离描述两数据的差异

实际操作中并不建议自己手写,可以直接调用Python scipy库中封装好的函数[3]

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

2. Overlap Rate

对于连续型变量我们可以使用KS检验来检测数据分布是否一致,对于类别型变量我们可以对其进行编码然后检测[4],或者选择通过特征重合率来进行检测[5],在高基数变量中此方法经常被用到。

通过特征重合率检测的思想是检测训练集特征在测试集中出现的比率,举个例子:

训练集特征:[猫,狗,狗,猫,狗,狗,狗,猫]
测试集特征:[猫,猫,鱼,猪,鱼,鱼,猪,猪]

即使该特征在训练集表现很好,但在测试集上的用处并不大,因为重合率仅有1/4,反而会导致过拟合或者模型忽略到其他更有用的特征。

3. KL散度

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

训练集特征:[猫,猫,鱼,猪,鱼,鱼,猪,猪]
测试集特征:[猫,狗,狗,狗,狗,狗,狗,狗] 

该特征在训练集可能有很大的作用,但在测试集无法有效的划分样本,因为在测试集大多是一样的取值。在这种情况下,我第一个想法是在用Overlap Rate筛选过后,再计算测试集的信息熵(在决策树中我们提到过,信息熵更大代表着可以更好的对样本进行划分)。今天发现有个更好的end-to-end的方法,那就是KL散度。

KL 散度是一种衡量两个概率分布的匹配程度的指标,两个分布差异越大,KL散度越大。注意如果要查看测试集特征是否与训练集相同,P代表训练集,Q代表测试集,这个公式对于P和Q并不是对称的。

4. KDE 核密度估计

KDE核密度估计,看起来好像是统计学里面一个高端的非参数估计方法。我简单的理解下哈,大概就是通过一个核函数把一个频率分布直方图搞成平滑的了。具体核函数是啥,问就是不知道,我不是学统计的,自己看看叭[6]

我一般都是这么用的,从seaborn中找到KDE plot这个方法[7],然后把测试集和训练集的特征画出来,看看图像不像,不像的直接扔了就行/敷衍。

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

5. 用机器学习模型检测分布是否一致

然后就是这个月我从Kaggle了解的一个惊为天人的方法,听完我就惊了。

中心思想就是使用特征训练模型来分辨测试集与测试集,若模型效果好的话代表训练集和测试集存在较大差异,否则代表训练集和测试集分布比较相似。

具体做法是构建一个二分类模型,对train-set打上0,测试集打上1,然后shuffle一下进行训练,若分类效果好,代表训练集和测试集区分度很高,那么分布差异就较大[8]

我感觉它最大的价值是,针对不同的模型检测分布会得到不同的效果,在实践中由于选定了预测模型,它对于某个特定场景的适应效果应该比常规的检测方法好很多。

由此延申出来,我们用训练好的二分类模型对训练集进行预测,然后输出预测概率,根据这个概率为训练集设置权重(概率越接近1代表训练集分布更接近测试集),这样就可以强行过拟合到测试集上!对于非线上测试型的数据挖掘比赛应该会有比较大的提升!

参考

  1. ^为什么要同分布 https://zhuanlan.zhihu.com/p/52530189
  2. ^KS检验 https://www.cnblogs.com/arkenstone/p/5496761.html
  3. ^Scipy KS检验 https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.stats.ks_2samp.html
  4. ^离散变量编码 https://zhuanlan.zhihu.com/p/87203369
  5. ^特征重合率 https://zhuanlan.zhihu.com/p/82435050
  6. ^KDE https://blog.csdn.net/pipisorry/article/details/53635895
  7. ^KDE Drawer http://seaborn.pydata.org/generated/seaborn.kdeplot.html
  8. ^Kaggle Adversarial validation https://www.kaggle.com/kevinbonnes/adversarial-validation

kl散度度量分布_数据挖掘比赛技巧——确定数据同分布相关推荐

  1. kl散度度量分布_概率图简要模型笔记(二)马尔可夫随机场与KL散度、最大熵、指数族分布、高斯分布、极大似然分布...

    这一篇文章主要是想捋一捋KL散度.最大熵.指数族分布这些东西之间的关系,这是一些非常基本的知识点,刚入门机器学习的时候,傻傻分不清楚,现在回过头来看,其实很多东西都可以串起来,不得不感叹数学真是一个很 ...

  2. kl散度度量分布_论“邻里关系”的学问:度量和改进图信息在图神经网络中的使用 | AI Time PhD ICLR...

    AI TIME欢迎每一位AI爱好者的加入! 近年来,图神经网络(GNN)在社交网络.知识图谱.推荐系统甚至生命科学等领域得到了越来越广泛的应用.但在复杂的图数据中,我们很难高效利用实体之间的相互依赖关 ...

  3. kl散度度量分布_强化学习新思潮1:值分布强化学习(04)

    经典强化学习有比较好的理论保证,尽管值分布强化学习的效果很好,但理论分析比较少.本文继续介绍值分布强化学习算法的理论分析.参考论文为"An Analysis of Categorical D ...

  4. kl散度度量分布_浅谈KL散度

    一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence) ...

  5. kl散度度量分布_解读KL散度:从定义到优化方法

    Kullback-Leibler 散度是计算机科学领域内的一个重要概念.数据科学家 Will Kurt 通过一篇博客文章对这一概念进行了介绍,机器之心技术分析师在此基础上进行了解读和扩充.本文为该解读 ...

  6. kl散度的理解_以曲率的视角理解自然梯度优化

    一个故事 我要讲一个故事:一个你几乎肯定听过的故事,但它的侧重点与你习以为常关注的不同. 所有现代深度学习模型都使用梯度下降进行训练. 在梯度下降的每个步骤中,您的参数值从某个起始点开始,然后将它们移 ...

  7. python动画篮球大小_篮球比赛动画直播数据api接口示例

    分享下篮球比赛动画直播api数据接口代码示例,详细了解请查看接口文档,需注册下 package com.huaying.demo.basketball; import javax.xml.bind.J ...

  8. java 内存分布_一图看懂JVM内存分布,永久记住!

    经常在说JVM内存分布,也经常去看,但是总是在面试的时候说不清楚或者模糊,甚至有可能说错,只有真正的理解,并且在心中有一个总结构图才能记得清楚说的清楚! | JVM总览图 java内存区域主要分程序计 ...

  9. 【机器学习】信息论基础(联合熵、条件熵、交叉熵、KL散度等)+ Python代码实现

    文章目录 一.基本概念 1.1 联合熵 1.2 条件熵 1.3 交叉熵 1.3.1 Python编程实现交叉熵计算 1.4相对熵(KL散度) 1.4.1 Python编程实现KL散度计算 二.自信息和 ...

最新文章

  1. poj2017——Speed Limit
  2. Linux运维笔记-文档总结-NFS文件共享(网络文件系统)
  3. oracle查看联机日志,oracle联机日志和归档日志
  4. python散点图点的大小-Java 学习之路
  5. 深入浅出百亿请求高可用Redis(codis)分布式集群揭秘
  6. Oracle数据库分页的三种方法
  7. Dropbox - share your doc on the cloud
  8. ccs10怎么导入工程文件_FCPX导入位置选项时如何使用!
  9. 巧用Squid的ACL和访问列表实现高效访问控制
  10. 板式橡胶支座弹性模量怎样计算_Midas Civil支座模拟的详细解决方法
  11. windows上cppcheck检查不出任何错误解决
  12. UBUNTU18禁用锁屏功能
  13. Excel常用函数命令
  14. Python作画玫瑰花
  15. 利用批处理代码快速恢复桌面图标小箭头,更可能解决win7出现黑色方块问题
  16. Java中Lambda表达式和stream的使用
  17. 【云图】自有数据的多边形检索(云检索)
  18. 常用网络测试命令——arp命令、traceroute命令
  19. 爬虫入门经典(十九) | 难度提升,破解极验验证码
  20. mysql plsql 语法_PL/SQL基本语法

热门文章

  1. tomcat启动占了12g_tomcat服务为何报内存相关错误??
  2. vscode卸载background插件_萌妹程序员鼓励师24小时在线陪你写代码,给我吹爆这个VSCode插件...
  3. 毕业了,就忘掉导师吧
  4. 他高考数学仅得15分,清华校长复查后激动拍板:这名学生,我要了
  5. 破除“论文至上”!两部委发文规范SCI指标使用
  6. 哥廷根,世界数学家的摇篮和圣地
  7. Offer年薪低于25W全额退款|阿里、腾讯内推快艇《全链路大数据分析工程师》课程招生简章...
  8. 边打工边研究数学 泸州“农民数学家”出版15本著作
  9. 霍金的遗愿清单:离开地球,警惕人工智能
  10. Unity3d(UE4)动态加载osgb倾斜摄影数据