Python实现8种常用抽样方法


Posted in Python onJune 27, 2021

今天来和大家聊聊抽样的几种常用方法,以及在Python中是如何实现的。

抽样是统计学、机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到。所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本。

上面所说的都是以概率为基础的,实际上还有一类非概率的抽样方法,因此总体上归纳为两大种类:

概率抽样:根据概率理论选择样本,每个样本有相同的概率被选中。

非概率抽样:根据非随机的标准选择样本,并不是每个样本都有机会被选中。

概率抽样技术

1.随机抽样(Random Sampling)

这也是最简单暴力的一种抽样了,就是直接随机抽取,不考虑任何因素,完全看概率。并且在随机抽样下,总体中的每条样本被选中的概率相等。

Python实现8种常用抽样方法

比如,现有10000条样本,且各自有序号对应的,假如抽样数量为1000,那我就直接从1-10000的数字中随机抽取1000个,被选中序号所对应的样本就被选出来了。

Python中,我们可以用random函数随机生成数字。下面就是从100个人中随机选出5个。

import random
population = 100
data = range(population)
print(random.sample(data,5))
> 4, 19, 82, 45, 41

2.分层抽样(Stratified Sampling)

分层抽样其实也是随机抽取,不过要加上一个前提条件了。在分层抽样下,会根据一些共同属性将带抽样样本分组,然后从这些分组中单独再随机抽样。

Python实现8种常用抽样方法

因此,可以说分层抽样是更精细化的随机抽样,它要保持与总体群体中相同的比例。 比如,机器学习分类标签中的类标签0和1,比例为3:7,为保持原有比例,那就可以分层抽样,按照每个分组单独随机抽样。

Python中我们通过train_test_split设置stratify参数即可完成分层操作。

from sklearn.model_selection import train_test_split

stratified_sample, _ = train_test_split(population, test_size=0.9, stratify=population[['label']])
print (stratified_sample)

3.聚类抽样(Cluster Sampling)

聚类抽样,也叫整群抽样。它的意思是,先将整个总体划分为多个子群体,这些子群体中的每一个都具有与总体相似的特征。也就是说它不对个体进行抽样,而是随机选择整个子群体。

Python实现8种常用抽样方法

Python可以先给聚类的群体分配聚类ID,然后随机抽取两个子群体,再找到相对应的样本值即可,如下。

import numpy as np
clusters=5
pop_size = 100
sample_clusters=2
# 间隔为 20, 从 1 到 5 依次分配集群100个样本的聚类 ID,这一步已经假设聚类完成
cluster_ids = np.repeat([range(1,clusters+1)], pop_size/clusters)
# 随机选出两个聚类的 ID
cluster_to_select = random.sample(set(cluster_ids), sample_clusters)
# 提取聚类 ID 对应的样本
indexes = [i for i, x in enumerate(cluster_ids) if x in cluster_to_select]
# 提取样本序号对应的样本值
cluster_associated_elements = [el for idx, el in enumerate(range(1, 101)) if idx in indexes]
print (cluster_associated_elements)

4.系统抽样(Systematic Sampling)

系统抽样是以预定的规则间隔(基本上是固定的和周期性的间隔)从总体中抽样。比如,每 9 个元素抽取一下。一般来说,这种抽样方法往往比普通随机抽样方法更有效。

下图是按顺序对每 9 个元素进行一次采样,然后重复下去。

Python实现8种常用抽样方法

Python实现的话可以直接在循环体中设置step即可。

population = 100
step = 5
sample = [element for element in range(1, population, step)]
print (sample)

5.多级采样(Multistage sampling)

在多阶段采样下,我们将多个采样方法一个接一个地连接在一起。比如,在第一阶段,可以使用聚类抽样从总体中选择集群,然后第二阶段再进行随机抽样,从每个集群中选择元素以形成最终集合。

Python实现8种常用抽样方法

Python代码复用了上面聚类抽样,只是在最后一步再进行随机抽样即可。

import numpy as np
clusters=5
pop_size = 100
sample_clusters=2
sample_size=5
# 间隔为 20, 从 1 到 5 依次分配集群100个样本的聚类 ID,这一步已经假设聚类完成
cluster_ids = np.repeat([range(1,clusters+1)], pop_size/clusters)
# 随机选出两个聚类的 ID
cluster_to_select = random.sample(set(cluster_ids), sample_clusters)
# 提取聚类 ID 对应的样本
indexes = [i for i, x in enumerate(cluster_ids) if x in cluster_to_select]
# 提取样本序号对应的样本值
cluster_associated_elements = [el for idx, el in enumerate(range(1, 101)) if idx in indexes]
# 再从聚类样本里随机抽取样本
print (random.sample(cluster_associated_elements, sample_size))

非概率抽样技术

非概率抽样,毫无疑问就是不考虑概率的方式了,很多情况下是有条件的选择。因此,对于无随机性我们是无法通过统计概率和编程来实现的。这里也介绍3种方法。

1.简单采样(convenience sampling)

简单采样,其实就是研究人员只选择最容易参与和最有机会参与研究的个体。比如下面的图中,蓝点是研究人员,橙色点则是蓝色点附近最容易接近的人群。

Python实现8种常用抽样方法

2.自愿抽样(Voluntary Sampling)

自愿抽样下,感兴趣的人通常通过填写某种调查表格形式自行参与的。所以,这种情况中,调查的研究人员是没有权利选择任何个体的,全凭群体的自愿报名。比如下图中蓝点是研究人员,橙色的是自愿同意参与研究的个体。

Python实现8种常用抽样方法

3.雪球抽样(Snowball Sampling)

雪球抽样是说,最终集合是通过其他参与者选择的,即研究人员要求其他已知联系人寻找愿意参与研究的人。比如下图中蓝点是研究人员,橙色的是已知联系人,黄色是是橙色点周围的其它联系人。

Python实现8种常用抽样方法

总结

以上就是8种常用抽样方法,平时工作中比较常用的还是概率类抽样方法,因为没有随机性我们是无法通过统计学和编程完成自动化操作的。

比如在信贷的风控样本设计时,就需要从样本窗口通过概率进行抽样。因为采样的质量基本就决定了你模型的上限了,所以在抽样时会考虑很多问题,如样本数量、是否有显著性、样本穿越等等。在这时,一个良好的抽样方法是至关重要的。

以上就是本次分享,原创不易,欢迎点赞、留言、分享,支持我继续写下去。

参考:

[2] https://towardsdatascience.com/8-types-of-sampling-techniques-b21adcdd2124

到此这篇关于Python实现8种常用抽样方法的文章就介绍到这了,更多相关Python 抽样方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python冒泡排序简单实现方法
Jul 09 Python
Python IDLE入门简介
Dec 08 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python实现百度语音识别api
Apr 10 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python实现的读取网页并分词功能示例
Oct 29 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
Python爬取12306车次信息代码详解
Aug 12 Python
Python3+Django get/post请求实现教程详解
Feb 16 Python
Python基于百度API识别并提取图片中文字
Python基于百度AI实现抓取表情包
Python道路车道线检测的实现
浅析Django接口版本控制
浅析Python实现DFA算法
解析目标检测之IoU
pycharm代码删除恢复的方法
You might like
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python中使用序列的方法
2015/08/03 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
在python 中实现运行多条shell命令
2019/01/07 Python
学习python可以干什么
2019/02/26 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
详解Python time库的使用
2019/10/10 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
重阳节标语大全
2014/10/07 职场文书