基于 Python 的 8 种常用抽样方法
抽样是统计学、机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到。所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本。
上面所说的都是以概率为基础的,实际上还有一类非概率的抽样方法,因此总体上归纳为两大种类:
概率抽样:根据概率理论选择样本,每个样本有相同的概率被选中。
非概率抽样:根据非随机的标准选择样本,并不是每个样本都有机会被选中。
概率抽样技术
随机抽样(Random Sampling)
这也是最简单暴力的一种抽样了,就是直接随机抽取,不考虑任何因素,完全看概率。并且在随机抽样下,总体中的每条样本被选中的概率相等。
比如,现有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
分层抽样(Stratified Sampling)
分层抽样其实也是随机抽取,不过要加上一个前提条件了。在分层抽样下,会根据一些共同属性将带抽样样本分组,然后从这些分组中单独再随机抽样。
因此,可以说分层抽样是更精细化的随机抽样,它要保持与总体群体中相同的比例。 比如,机器学习分类标签中的类标签0和1,比例为3:7,为保持原有比例,那就可以分层抽样,按照每个分组单独随机抽样。
Python
中我们通过train_test_split
设置stratify
参数即可完成分层操作。
from sklearn.model_selection import train_test_splitstratified_sample, _ = train_test_split(population, test_size=0.9, stratify=population[['label']])
print (stratified_sample)
聚类抽样(Cluster Sampling)
聚类抽样,也叫整群抽样。它的意思是,先将整个总体划分为多个子群体,这些子群体中的每一个都具有与总体相似的特征。也就是说它不对个体进行抽样,而是随机选择整个子群体。
用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)
系统抽样(Systematic Sampling)
系统抽样是以预定的规则间隔(基本上是固定的和周期性的间隔)从总体中抽样。比如,每 9 个元素抽取一下。一般来说,这种抽样方法往往比普通随机抽样方法更有效。
下图是按顺序对每 9 个元素进行一次采样,然后重复下去。
用Python
实现的话可以直接在循环体中设置step
即可。
population = 100
step = 5
sample = [element for element in range(1, population, step)]
print (sample)
多级采样(Multistage sampling)
在多阶段采样下,我们将多个采样方法一个接一个地连接在一起。比如,在第一阶段,可以使用聚类抽样从总体中选择集群,然后第二阶段再进行随机抽样,从每个集群中选择元素以形成最终集合。
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种方法。
简单采样(convenience sampling)
简单采样,其实就是研究人员只选择最容易参与和最有机会参与研究的个体。比如下面的图中,蓝点是研究人员,橙色点则是蓝色点附近最容易接近的人群。
自愿抽样(Voluntary Sampling)
自愿抽样下,感兴趣的人通常通过填写某种调查表格形式自行参与的。所以,这种情况中,调查的研究人员是没有权利选择任何个体的,全凭群体的自愿报名。比如下图中蓝点是研究人员,橙色的是自愿同意参与研究的个体。
雪球抽样(Snowball Sampling)
雪球抽样是说,最终集合是通过其他参与者选择的,即研究人员要求其他已知联系人寻找愿意参与研究的人。比如下图中蓝点是研究人员,橙色的是已知联系人,黄色是是橙色点周围的其它联系人。
总结
以上就是8种常用抽样方法,平时工作中比较常用的还是概率类抽样方法,因为没有随机性我们是无法通过统计学和编程完成自动化操作的。
比如在信贷的风控样本设计时,就需要从样本窗口通过概率进行抽样。因为采样的质量基本就决定了你模型的上限了,所以在抽样时会考虑很多问题,如样本数量、是否有显著性、样本穿越等等。在这时,一个良好的抽样方法是至关重要的。
更多精彩推荐
Windows 11 上手机!小米 8、一加 6T、微软 Lumia 950 XL 都可以运行深度学习教你重建赵丽颖的三维人脸Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货点分享点收藏点点赞点在看
相关文章:

RegularExpressions(4) RegularExpressions 成员(一)
为什么80%的码农都做不了架构师?>>> 主要成员有: IRegex、ICapture、IMatch、IMatchCollection、IGroup、IGroupCollection 先看: ICapture; 常用的 IMatch、IGroup 都是从它继承而来; 作为一个底层接口一般不会被直接使用. 它为 IMatch、IGroup 提供了…

公有云环境下应用程序的自动化部署与水平扩展问题
先介绍了一下公有云计算环境下的一些特点,再根据这些特点探讨一下作为云计算用户而言,如何对应用程序做好自动化部署和水平扩展(弹性计算)的问题。阅读本文需要有一定的云计算知识、开发运维知识。 公有云环境的优势及其特点 公有…

另辟蹊径创建移动应用:iOS和Android代码共享
2019独角兽企业重金招聘Python工程师标准>>> 过去几年,移动应用席卷了整个世界,在工作和生活的方方面面改变着我们使用互联网的方式。创建移动应用的各种技术也随之兴起,各种开发流程也 将移动应用视为一等公民,开始考…

从0开始,基于Python探究深度学习神经网络
来源 | Data Science from Scratch, Second Edition作者 | Joel Grus全文共6778字,预计阅读时间50分钟。深度学习1. 张量2. 层(Layer)的抽象3. 线性层4. 神经网络作为一个层的序列5. 损失和优化6. 示例:XOR 重新…

ASP.NET2.0雷霆之怒盗链者的祝福【月儿原创】
ASP.NET2.0雷霆之怒盗链者的祝福 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.3.28 所谓盗链就是指其他网站把我们站点的文件链接帖到他们站上,这样白白占用我们的带宽。访问对于网站盗链行为&am…

数通手稿留档——BGP
本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1954062,如需转载请自行联系原作者

ASP.NET2.0打通文件图片处理任督二脉【月儿原创】
ASP.NET2.0打通文件图片处理任督二脉 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.1 1.最简单的单文件上传(没花头)2.多文件上传3.客户端检查上传文件类型(以上传图片为例)4.服务器端检查上传文件类型(以上…

PaaS变厚了
通过与包括东方通等在内的众多厂商的合作,华云数据的运营型PaaS变得越来越厚实。借助PaaS Plus的推出,华云数据要把云化的工作前移,在产品开发和测试阶段就开始云化,这会让传统企业的云化取得更好的效果。“PaaS是个筐,…

国内首个零信任技术标准发布 腾讯安全牵头编制
7月7日,中国电子工业标准化技术协会发布了国内首个零信任技术实现标准——T/CESA 1165-2021《零信任系统技术规范》团体标准,填补了国内零信任领域的技术标准空白。 (《零信任系统技术规范》) 据悉,该标准由腾讯安全牵…

集群概述及原理笔记(1)
it你好linux学习文档之集群概述及原理笔记(1) 一 前言 目前,越来越多的网站采用Linux操作系统,提供邮件、Web、文件存储、数据库等服务。也有非常多的公司在企业内部网中利用Linux服务器提供这些服务。随着人们对Linux服务器依赖的加深,对其…

ASP.NET2.0 遍历文件夹下所有图片【月儿原创】
ASP.NET2.0 遍历文件夹下所有图片 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.4 1.以下目录有若干图片(都是大图片) 2.在页面展现效果图 3.代码 后台代码using System;using Sy…

如何看待那些互相矛盾的论文?
原文:How to Make Sense of Contradictory Science Papers作者:Haixin Dang(利兹大学博士后研究员)、Liam Kofi Bright(伦敦经济学院的哲学系助理教授)译者:武文浩相信你已经读到过一些相互矛盾…

gdb图形化调试工具总结
gdb除了命令行方式等的调试之外,还有图形化的调试工具,下面列举一些供参考 1:insight 2: ddd 3: kgdb 4: xxgdb 其它的工具欢迎补充

ATLAS入门篇之CascadingDropDown控件编程
一、引言本文将通过具体的步骤解释如何借助于数据库(Microsoft SQL Server 2005 Express Edition)数据创建一个ASP.NET AJAX 1.0 CascadingDropDown控件。在本文示例中,我们将使用此层叠下拉列表框控件来选择要显示的汽车模型信息。【作者注】…

ASP.NET2.0 永恒密码之戒【月儿原创】
ASP.NET2.0 永恒密码之戒 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.8 1.我们经常有这样的情形: 就是用户注册时由于某个信息填写错误要重新填写。但是这个过程经过了服务器PostBack。所以密码…

GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)上周,微软、GitHub、OpenAI 三方联手推出的 AI 代码生成神器 GitHub Copilot 一经官宣便引起巨大关注:试问哪个开发者不想要这么一位“虚拟程序员”来解放自己的双手?…

LAMP的安装及Xcache的配置
LAMP是LinuxApacheMySQLPHP的简称,意指以Linux作为服务器的操作系统,以Apache的HTTPD作为Web服务器,以PHP作为动态网页的解释器,以MySQL作为后端数据库管理系统,由此而搭建起来的一套Web服务器系统。为方便起见&#x…

Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
前言: Windows Server 2008 是现在企业比较流行的服务器操作系统,安全性高,配置灵活、方便,集成了Hyper-V虚拟化功能,能够充分发挥硬件的性能。Windows Server 2008改写了底层的网络传输代码,理论上&#x…

ASP.NET2.0 ReportingServices使用详解
ASP.NET2.0 ReportingServices使用详解 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.9本文先做个简单介绍,更多关于ReportingServices的文章见后续。 1.打开BIDS,这是报表开发工具 2.新建项目 3.选择…

输出程序运行的时间(精确到微秒)
对于要求性能的代码,输出程序运行的时间还是很有必要的,而且需要较高的精确度,下面这个代码段就实现了此功能 注意:只限于Linux下使用,因为<sys/time.h>的缘故 1 #include <sys/time.h>2 #include <ios…

售前比售后机器人控制逻辑更复杂,仅凭大规模数据后发优势难赶超!
实现人与机器的自然交互,一直以来都是全世界人类的共同愿望,无数科学家倾尽毕生精力致力于实现这个目标。语言,作为人与外界交流最有效的工具,成为机器智能的重点研究对象,而对话型机器人则成为实现人机交互最早的突破…

JAVAEclipse:could not find the main class,program will exit!
JAVAEclipse:could not find the main class,program will exit! 遇到这个错误主要是当前的工程的jdk与eclipse的版本配置不匹配造成的,修改方法如下: 在当前工程点右键选择Properties->Java Compiler->选中Enable project specific settings->…

ASP.NET2.0 文本编辑器FCKeditor的冰冷之心 【月儿原创】
ASP.NET2.0 文本编辑器FCKeditor的冰冷之心 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.9 FCKeditor是目前最好的html文本编辑器,如果还不明白的话看了下图就知道了效果图: 那么为什么说是FC…

转:strcat与strcpy与strcmp与strlen
转自:http://blog.chinaunix.net/uid-24194439-id-90782.html strcat 原型:extern char *strcat(char *dest,char *src);用法:#include <string.h>功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的\0)并添加\0。说明…

2021 EdgeX中国挑战赛盛大开幕,英特尔赋能开发者,助力创新方案落地
2021年7月12日,北京中关村论坛隆重举行。论坛上,英特尔研究院副总裁、英特尔中国研究院院长宋继强博士,北京市科委、中关村管委会高科技产业促进中心主任徐剑发表致辞并联合Linux基金会、VMware威睿等单位代表共同宣布2021 EdgeX中国挑战赛开…

构建安全的 ASP.NET 应用程序
最近开发的系统因为用到Asp.net的安全性方面的东西,所以拼命看MSDN,E文看着有点慢,还好现在在MSDN 中文网站中很多文章都有了翻译,所以今天索性在MSDN中文网站上找了一把,还真有。有感兴趣的朋友可以看看,不…

.NET2.0隐形的翅膀,正则表达式搜魂者【月儿原创】
.NET2.0隐形的翅膀,正则表达式搜魂者 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.14 本文实现了:只能输入1个数字只能输入n个数字只能输入至少n个数字只能输入m到n个数字只能输入数…

连华为都在研究的计算机视觉,到底有多牛?
去年,华为在CCF-GAIR 大会上介绍了在人工智能领域的愿景,华为为了实现这个战略目标,从中梳理出深耕基础研究、打造全栈方案、投资开放生态和人才培养、解决方案增强、内部效率提升五大方向,以此打造无所不及的AI,构建万…

JS 点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/ 相册模块,点击弹出图片,并左右滚动幻灯片...
1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta ht…

Nginx+Tomcat实现反向代理与动静分离
1. 什么是动静分离 所谓动静分离就是通过nginx(或apache等)来处理用户端请求的静态页面,tomcat(或weblogic)处理动态页面,从而达到动静页面访问时通过不同的容器来处理。 2. 为什么做动静分离 Nginx处理静态…