KS检验及其在机器学习中的应用

什么是KS检验

Kolmogorov–Smirnov 检验,简称KS检验,是统计学中的一种非参数假设检验,用来检测单样本是否服从某一分布,或者两样本是否服从相同分布。在单样本的情况下,我们想检验这个样本是否服从某一分布函数,记是该样本的经验分布函数。我们构造KS统计量:

如下图,经验分布函数与目标分布的累积分布函数的最大差值就是我们要求的KS统计量:

95%置信度的KS统计量的临界值由给出,如果我们根据样本得到的KS统计量的值小于,那么我们就接收原假设!否则,拒绝原假设。

两样本的KS检验

用同样的思想,我们可以检验「两个样本是否服从同一分布」,此时KS统计量为两样本的经验分布函数的最大差值

这时候,95%置信度的临界值为

「KS 检验只能检验连续型的分布」

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kstest, ks_2samp
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

如何用Python进行KS检验

Python的scipy.stats模块提供了与KS检验有关的函数

单样本检验

有函数:scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', mode='approx')最重要的两个参数:

  • rvs : str, array or callableIf a string, it should be the name of a distribution in scipy.stats.If an array, it should be a 1-D array of observations of randomvariables.If a callable, it should be a function to generate random variables;it is required to have a keyword argument size.

  • cdf : str or callableIf a string, it should be the name of a distribution in scipy.stats.If rvs is a string then cdf can be False or the same as rvs.If a callable, that callable is used to calculate the cdf.```


Returns:statistic : floatKS test statistic, either D, D+ or D-.pvalue :  floatOne-tailed or two-tailed p-value.
x = np.random.randn(100)
kstest(x, 'norm')
KstestResult(statistic=0.14648390717722642, pvalue=0.024536061749414313)

生成100个标准正态分布随机数,得到KS统计量的值为,因此我们认为该样本服从正态分布。

x = np.random.exponential(size=100)
kstest(x, 'norm')
KstestResult(statistic=0.505410956721057, pvalue=3.4967106846361894e-24)
kstest(x, 'expon')
KstestResult(statistic=0.09854002120537766, pvalue=0.2685899206780503)

生成100个指数分布随机数,KS检验拒绝它们服从正态分布的假设,接收了它们服从指数分布的假设。

两样本检验

有函数:scipy.stats.ks_2samp(data1, data2, alternative='two-sided', mode='auto')参数:

  • data1, data2 : sequence of 1-D ndarraystwo arrays of sample observations assumed to be drawn from a continuousdistribution, sample sizes can be different`


Returns
statistic : float
KS statistic
pvalue : float
two-tailed p-value
x = np.random.randn(100)
y = np.random.randn(50)
ks_2samp(x, y)
Ks_2sampResult(statistic=0.11, pvalue=0.804177768619009)

,因此我们接收原假设,认为x,y服从相同分布。

x = np.random.randn(100)
y = np.random.exponential(size=50)
ks_2samp(x, y)
Ks_2sampResult(statistic=0.59, pvalue=3.444644569583488e-11)

拒绝x,y服从相同分布的假设。

KS检验在机器学习中的应用

应用一:判断特征在训练集和测试集上分布是不是相同

特征迁移是在机器学习任务中经常碰到的情况,「线上数据的分布跟离线数据的分布情况不一致」,这就导致模型的泛化能力不足。而我们去判断两份数据的分布是不是相同的一个工具就是KS检验!

X, y = datasets.make_classification(n_samples=10000, n_features=5,n_informative=2, n_redundant=2, random_state=2020)
X_train, X_test, y_train, y_test = \train_test_split(X, y, test_size=0.4, random_state=2020)
for i in range(5):print(ks_2samp(X_train[:, i], X_test[:, i]))
Ks_2sampResult(statistic=0.013083333333333334, pvalue=1.0)
Ks_2sampResult(statistic=0.013083333333333334, pvalue=1.0)
Ks_2sampResult(statistic=0.008916666666666666, pvalue=1.0)
Ks_2sampResult(statistic=0.012916666666666667, pvalue=1.0)
Ks_2sampResult(statistic=0.013583333333333333, pvalue=1.0)

随机生成了一个有5个特征,包含10000组数据的数据集,划分训练集和测试集后,对比每个特征上测试集和训练集的分布。这里每一个特征都通过了KS检验(这里显然是可以通过的hhh)

应用二:判断二分类模型能否将正负样本很好的分开

在信用评分领域,会使用KS统计量衡量二分类模型分类正负样本的能力。在测试集上,将模型对y_true=1的样本的输出概率值作为data1,对y_true=0的样本的输出概率值作为data2,计算两个分布的KS统计量。我们用 lr 拿上面的数据做个例子。画出测试集上正负样本的预测概率值的分布情况。

lr = LogisticRegression(solver='liblinear')
lr.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, l1_ratio=None, max_iter=100,multi_class='auto', n_jobs=None, penalty='l2',random_state=None, solver='liblinear', tol=0.0001, verbose=0,warm_start=False)
data1 = np.sort(lr.predict_proba(X_test[y_test==1])[:, 1])
data2 = np.sort(lr.predict_proba(X_test[y_test==1])[:, 0])
plt.figure(figsize=(8, 4))
last, i = 0, 0
while i < len(data1):plt.plot([last, data1[i]], [i/len(data1), i/len(data1)], 'k')if i < len(data1):last = data1[i]i += 1last, i = 0, 0
while i < len(data2):plt.plot([last, data2[i]], [i/len(data2), i/len(data2)], 'r')if i < len(data2):last = data2[i]i += 1

这两条曲线的最大差值就是我们要求的KS统计量。这个差值越大,说明模型对这个正负样本的区别能力越强。

ks_2samp(data1, data2)
Ks_2sampResult(statistic=0.9219219219219219, pvalue=0.0)

这里KS统计量甚至超过了0.9,一般来说,KS统计量超过0.6,就说明模型的分类能力比较强了。

赞 赏 作 者

推荐阅读:

2020Python招聘内推渠道开启啦!

老司机教你5分钟读懂Python装饰器

用Python实现粒子群算法

抄底美股?用Python分析美股实际收益率

▼点击成为社区会员   喜欢就点个在看吧

KS检验及其在机器学习中的应用相关推荐

  1. ks检验正态分布结果_KS检验及其在机器学习中的应用

    KS检验及其在机器学习中的应用 什么是KS检验 Kolmogorov–Smirnov 检验,简称KS检验,是统计学中的一种非参数假设检验,用来检测单样本是否服从某一分布,或者两样本是否服从相同分布.在 ...

  2. KS检验样本测试集和训练集分布问题

    最初引入KS检验的原因:用SVM 做分类问题时,发现在测试集上跑出来的准确率等参数比在训练集高许多,经过分析,推断可能是由于训练集和测试集上的数据分布情况不一致.所以想通过KS检验一下数据分布情况. ...

  3. 机器学习中的度量指标:ROC曲线,AUC值,K-S曲线

    机器学习中的度量指标:ROC曲线,AUC值,K-S曲线 首先,回顾一下二分类问题的一些定义: 预测 1 0 实 1 TP FN ​际 0 FP TN 上表中,四个项分别为:TP真阳性:FN假阴性:FP ...

  4. Matlab中的数据分布KS检验

    KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布 Kolmogorov-Smirnov是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方 ...

  5. KS检验、qq图、Scalability可扩展性

    1.KS检验 Kolmogorov-Smirnov test(KS检验)是一种重要的非参数检验方法,应用非常广泛,比如之前介绍的数据库CMap,其核心算法就是借鉴KS检验. KS检验是一种统计检验方法 ...

  6. 数据集分布评估-KDE (核密度估计)、KS检验

    参考: https://zhuanlan.zhihu.com/p/368073953 https://blog.csdn.net/u014028070/article/details/75171108 ...

  7. 机器学习中的高斯分布

    高斯分布与数据预处理:数据分布转换 高斯分布与聚类:GMM 高斯分布与异常检测 高斯分布与马氏距离 高斯分布与数据预处理:数据分布转换 当我们上手一个数据集时,往往第一件事就是了解每个特征是如何分布的 ...

  8. 机器学习中的模型评价、模型选择及算法选择

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 正确使用模型评估.模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要.本文将对这三个任务的相关技术 ...

  9. 一文介绍机器学习中的三种特征选择方法

    作者 | luanhz 来源 | 小数志 导读 机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.也正因如此,特征工程在机器学习流程中占有着重要地位.广义的特征 ...

最新文章

  1. centos6.x 安装php5.6 tar,CentOS6.x安装php5.6.x
  2. RemoveError: ‘requests‘ is a dependency of conda and cannot be removed from
  3. 安全观之我见(三):省银之道在预防
  4. 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)
  5. mysql修改表结构权限_mysql 修改表结构操作
  6. Excel VBA - Workbook对象
  7. php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel
  8. Java LinkedList公共对象pollLast()方法(带示例)
  9. linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
  10. java list 内存分页_Java List内存分页
  11. 西班牙语dele等级_西班牙语DELE不同等级是什么水平?
  12. Python使用marshal模块操作二进制文件
  13. php加速 PHP APC 浅析
  14. 最详细的Android SDK下载安装及配置教程
  15. phpwind升级php7,【原创文章】升级phpwind为https
  16. Noisy Channel Language Model Prompting for Few-Shot Text Classification
  17. Spring基础(持续更新)
  18. chrome清除https状态
  19. Flash鼠标拖尾效果
  20. FreeBSD中安装源的方法

热门文章

  1. SLAM | 视觉SLAM中的后端:后端优化算法与建图模板
  2. 大数据产业现状及发展趋势分析
  3. 万事达卡与德国电信旗下T-Mobile合作在欧洲推出NFC移动支付
  4. TFN系列DC700S手持式监测接收机
  5. 【php网页爬虫】php抓取网页数据
  6. RMAN利用auxiliary复制数据库
  7. 如何通过flex布局实现换行
  8. 图图的存储、BFS、DFS(听说叠词很可爱)
  9. 一文详细讲解API网关核心功能和API管理扩展
  10. JS 程序中可能存在的内存泄漏