今天来和大家聊聊抽样的几种常用方法,以及在Python
中是如何实现的。
抽样是统计学、机器学习中非常重要,也是经常用到的方法,因为大多时候使用全量数据是不现实的,或者根本无法取到。所以我们需要抽样,比如在推断性统计中,我们会经常通过采样的样本数据来推断估计总体的样本。
上面所说的都是以概率为基础的,实际上还有一类非概率的抽样方法,因此总体上归纳为两大种类:
概率抽样:根据概率理论选择样本,每个样本有相同的概率被选中。
非概率抽样:根据非随机的标准选择样本,并不是每个样本都有机会被选中。
概率抽样技术
1.随机抽样(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
2.分层抽样(Stratified Sampling)
分层抽样其实也是随机抽取,不过要加上一个前提条件了。在分层抽样下,会根据一些共同属性将带抽样样本分组,然后从这些分组中单独再随机抽样。
因此,可以说分层抽样是更精细化的随机抽样,它要保持与总体群体中相同的比例。 比如,机器学习分类标签中的类标签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)
聚类抽样,也叫整群抽样。它的意思是,先将整个总体划分为多个子群体,这些子群体中的每一个都具有与总体相似的特征。也就是说它不对个体进行抽样,而是随机选择整个子群体。
用Pytho
本文来源gao!daima.com搞$代!码#网#
n可以先给聚类的群体分配聚类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)