Python完整代码带你一文看懂抽样( 四 )


[array([-3.08057779, 8.09020329, 2.02732982, 2.92353937, -6.06318211]), array([-2.11984871, 7.74916701, 5.7318711 , 4.75148273, -5.68598747])]2000第4部分:实现分层抽样
data2 = np.loadtxt('data2.txt')# 导入带有分层逻辑的数据each_sample_count = 200# 定义每个分层的抽样数量label_data_unique = np.unique(data2[:, -1])# 定义分层值域sample_data = []# 定义空列表,用于存放最终抽样数据sample_dict = {}# 定义空字典,用来显示各分层样本数量for label_data in label_data_unique:# 遍历每个分层标签 sample_list = []# 定义空列表,用于存放临时分层数据 for data_tmp in data2:# 读取每条数据 if data_tmp[-1] == label_data:# 如果数据最后一列等于标签 sample_list.append(data_tmp)# 将数据加入分层数据中 each_sample_data = random.sample(sample_list, each_sample_count) # 对每层数据都随机抽样 sample_data.extend(each_sample_data)# 将抽样数据追加到总体样本集 sample_dict[label_data] = len(each_sample_data)# 样本集统计结果print(sample_dict)# 打印输出样本集统计结果首先使用Numpy的loadtxt方法导入带有分层逻辑的数据 。在该示例中,读取的数据文件中包含了分类标签,放在最后一列 。该列分类标签用于做分层抽样的标识 。接着通过unique方法获取分层(分类标签)的值域,用于后续做循环处理 。然后分别定义了用于存放临时分层数据、最终抽样数据、显示各分层样本数量的空列表和空字典 。
下面进入正式的主循环过程,实现分层抽样:

  • 遍历每个分层标签,用来做数据的分层划分,数据一共分为2类标签(0和1) 。
  • 读取每条数据并判断数据的分层标签是否与分层标签相同,如果是则将数据加入各分层数据列表中 。
  • 当每个分层标签处理完成后会得到该分层标签下的所有数据,此时使用Python内置的random库的sample方法进行抽样 。由于抽样结果是一个列表,因此这里使用extend(而不是append)批量追加到最终抽样数据列表中 。然后将每个分层标签得到的样本数量,通过len方法对列表长度进行统计,并打印输出各个分层对应的样本数量 。结果是每个分层都按照指定数量抽取样本,输出如下:
{0.0: 200, 1.0: 200}第5部分:实现整群抽样
data3 = np.loadtxt('data4.txt')# 导入已经划分好整群的数据集label_data_unique = np.unique(data3[:, -1])# 定义整群标签值域print(label_data_unique)# 打印输出所有整群标签sample_label = random.sample(set(label_data_unique), 2) # 随机抽取2个整群sample_data = https://www.isolves.com/it/cxkf/yy/Python/2019-09-26/[]# 定义空列表,用来存储最终抽样数据for each_label in sample_label:# 遍历每个整群标签值域 for data_tmp in data3:# 遍历每个样本 if data_tmp[-1] == each_label:# 判断样本是否属于抽样整群 sample_data.append(data_tmp)# 样本添加到最终抽样数据集print(sample_label)# 打印输出样本整群标签print(len(sample_data))# 打印输出总抽样数据记录条数首先使用Numpy的loadtxt方法导入已经划分好整群的数据集 。在该示例中,读取的数据文件中的最后一列存放了不同整群的标识,整群一共被划分为4个群组,标识分别为0、1、2、3 。接着通过unique方法获取整群标签的值域,用于基于整群的抽样 。打印输出结果如下:
[ 0. 1. 2. 3.]然后使用Random的sample方法从整群标签中进行抽样,这里定义抽取2个整群 。最后将所有属于抽取到的整群下的数据进行读取和追加,并得到最终样本集,打印输出样本集的整群标签和总样本数量,结果如下:
[3.0, 1.0]502由于是随机概率抽样,因此读者使用代码抽取到的样本很可能与笔者示例不一致,这属于正常现象 。另外,读者多次随机抽样程序也可能得到不一样的结果 。
上述过程中,需要考虑的关键点是:如何根据不同的数据特点、建模需求、业务背景综合考虑抽样方法,得到最适合的结果
代码实操小结:本节示例中,主要用了几个知识点:
  • 使用Numpy的loadtxt方法读取数据文件 。
  • 使用内置标准库Random库中的sample方法做数据抽样 。
  • 对列表通过索引做截取、通过len方法做长度统计、通过append和extend做追加等操作 。
  • 字典赋值操作 。
  • 使用Numpy的unique方法获得唯一值 。
  • 通过for和while循环,遍历一个可迭代的对象 。
  • if条件语句的使用,尤其是单条件和多条件判断 。
关于作者:宋天龙,深大数据技术专家,触脉咨询合伙人兼副总裁,前Webtrekk中国区技术和咨询负责人(德国最大在线数据分析服务提供商) 。擅长数据挖掘、建模、分析与运营,精通端到端数据价值场景设计、业务需求转换、数据结构梳理、数据建模与学习以及数据工程交付 。在电子商务、零售、银行、保险等多个行业拥有丰富的数据项目工作经验 。


推荐阅读