加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

干货收藏!Python完整代码带你一文看懂抽样

发布时间:2019-09-25 18:36:04 所属栏目:优化 来源:宋天龙
导读:1.什么时候需要抽样 抽样工作在数据获取较少或处理大量数据比较困难的时期非常流行,这主要有以下几方面原因: 数据计算资源不足。计算机软硬件的限制是导致抽样产生的基本原因之一,尤其是在数据密集的生物、科学工程等领域,不抽样往往无法对海量数据进

以上的数据记录数不是固定的,在实际工作时,如果没有特定时间要求,笔者一般会选择一个适中的样本量做分析,此时应综合考虑特征数、特征值域分布数、模型算法适应性、建模需求等;如果是面向机器计算的工作项目,一般会选择尽量多的数据参与计算,而有关算法实时性和效率的问题会让技术和运维人员配合实现,例如提高服务器配置、扩大分布式集群规模、优化底层程序代码、使用实时计算的引擎和机制等。

(2)抽样样本在不同类别中的分布问题

做分类分析建模问题时,不同类别下的数据样本需要均衡分布。

抽样样本能准确代表全部整体特征:

  • 非数值型的特征值域(例如各值频数相对比例、值域范围等)分布需要与总体一致。
  • 数值型特征的数据分布区间和各个统计量(如均值、方差、偏度等)需要与整体数据分布区间一致。
  • 缺失值、异常值、重复值等特殊数据的分布要与整体数据分布一致。

异常检测类数据的处理:

  • 对于异常检测类的应用要包含全部异常样本。对于异常检测类的分析建模,本来异常数据就非常稀少,因此抽样时要优先将异常数据包含进去。
  • 对于需要去除非业务因素的数据异常,如果有类别特征需要与类别特征分布一致;如果没有类别特征,属于非监督式的学习,则需要与整体分布一致。

4.代码实操:Python数据抽样

本示例中,将使用random包以及自定义代码实现抽样处理。数据源文件data2.txt、data3.txt和data4.txt位于“附件-chapter3”中。

整个示例代码分为5部分。

第1部分:导入需要的库

  1. import random # 导入标准库 
  2. import numpy as np # 导入第三方库 

这里用到了Python内置标准库random以及第三方库Numpy,前者用于做随机抽样,后者用于读取文件并做数据切片使用。

第2部分:实现简单随机抽样

  1. data = np.loadtxt('data3.txt') # 导入普通数据文件 
  2. data_sample = data[random.sample([i for i in range(len(data))], 2000)] 
  3.  # 随机抽取2000个样本 
  4. print(data_sample[:2]) # 打印输出前2条数据 
  5. print(len(data_sample)) # 打印输出抽样样本量 

首先通过Numpy的loadtxt方法读取数据文件。

然后使用Random库中的sample方法做数据抽样。由于sample库要求抽取的对象是一个序列或set,因此这里使用了一个列表推导式直接基于data数据集的记录数生成索引列表,然后再返回给sample随机抽样,抽样数量为2000;最后从data中直接基于索引获得随机抽样后的结果。

打印输出前2条数据和总抽样样本量。返回结果如下:

  1. [[-4.59501348 8.82741653 4.40096599 3.40332532 -6.54589933] 
  2.  [-7.23173404 -8.92692519 6.82830873 3.0378005 4.64450399]] 
  3. 2000 
  • 相关知识点:Python中的列表推导式

本示例中,我们使用了列表推导式来生成data的索引列表。传统方法的实现可以这样写:

  1. ind = [] 
  2. for i in range(len(data)): 
  3.  ind.append(i) 

而这里的列表推导式的写法[i for i in range(len(data))]除了在语法上更加简洁和优雅外,在性能上同样会有提升。我们通过如下实验做简单测试,对从0到1000000的每个数求平方然后添加到列表。两种方法如下:

  1. # 方法1:传统方法 
  2. import time 
  3. t0=time.time() # 开始时间 
  4. ind = [] 
  5. for i in range(1000000): 
  6.  sqr_values = i*i 
  7.  ind.append(sqr_values) 
  8. t1 = time.time() # 结束时间 
  9. print(t1-t0) # 打印时间 
  10. # 方法2:列表推导式 
  11. import time 
  12. t0=time.time() # 开始时间 
  13. sqr_values = [i*i for i in range(1000000)] 
  14. t1 = time.time() # 结束时间 
  15. print(t1-t0) # 打印时间 

上述代码执行后的输出结果分别是:

  1. 0.39202237129211426 
  2. 0.12700724601745605 

上面只是简单的计算逻辑并且数据量也不大,如果配合大数据量以及更复杂的运算,那么效率提升会非常明显。与之类似的还有生成器表达式、字典推导式,都是很Pythonic的实现方法。

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读