异常检测类数据的处理:
- 对于异常检测类的应用要包含全部异常样本 。对于异常检测类的分析建模,本来异常数据就非常稀少,因此抽样时要优先将异常数据包含进去 。
- 对于需要去除非业务因素的数据异常,如果有类别特征需要与类别特征分布一致;如果没有类别特征,属于非监督式的学习,则需要与整体分布一致 。
文章插图
04 代码实操:Python数据抽样本示例中,将使用random包以及自定义代码实现抽样处理 。数据源文件data2.txt、data3.txt和data4.txt位于“附件-chapter3”中 。
整个示例代码分为5部分 。
第1部分:导入需要的库
import random # 导入标准库import numpy as np # 导入第三方库这里用到了Python内置标准库random以及第三方库Numpy,前者用于做随机抽样,后者用于读取文件并做数据切片使用 。
第2部分:实现简单随机抽样
data = https://www.isolves.com/it/cxkf/yy/Python/2019-09-26/np.loadtxt('data3.txt') # 导入普通数据文件data_sample = data[random.sample([i for i in range(len(data))], 2000)] # 随机抽取2000个样本print(data_sample[:2]) # 打印输出前2条数据print(len(data_sample)) # 打印输出抽样样本量首先通过Numpy的loadtxt方法读取数据文件 。
然后使用Random库中的sample方法做数据抽样 。由于sample库要求抽取的对象是一个序列或set,因此这里使用了一个列表推导式直接基于data数据集的记录数生成索引列表,然后再返回给sample随机抽样,抽样数量为2000;最后从data中直接基于索引获得随机抽样后的结果 。
打印输出前2条数据和总抽样样本量 。返回结果如下:
[[-4.59501348 8.82741653 4.40096599 3.40332532 -6.54589933] [-7.23173404 -8.92692519 6.82830873 3.0378005 4.64450399]]2000
- 相关知识点:Python中的列表推导式
ind = []for i in range(len(data)): ind.Append(i)而这里的列表推导式的写法[i for i in range(len(data))]除了在语法上更加简洁和优雅外,在性能上同样会有提升 。我们通过如下实验做简单测试,对从0到1000000的每个数求平方然后添加到列表 。两种方法如下:
# 方法1:传统方法import timet0=time.time() # 开始时间ind = []for i in range(1000000): sqr_values = i*i ind.append(sqr_values)t1 = time.time() # 结束时间print(t1-t0) # 打印时间# 方法2:列表推导式import timet0=time.time() # 开始时间sqr_values = [i*i for i in range(1000000)]t1 = time.time() # 结束时间print(t1-t0) # 打印时间上述代码执行后的输出结果分别是:
0.392022371292114260.12700724601745605上面只是简单的计算逻辑并且数据量也不大,如果配合大数据量以及更复杂的运算,那么效率提升会非常明显 。与之类似的还有生成器表达式、字典推导式,都是很Pythonic的实现方法 。
第3部分:实现等距抽样
data = https://www.isolves.com/it/cxkf/yy/Python/2019-09-26/np.loadtxt('data3.txt') # 导入普通数据文件sample_count = 2000 # 指定抽样数量record_count = data.shape[0] # 获取最大样本量width = record_count / sample_count # 计算抽样间距data_sample = [] # 初始化空白列表,用来存放抽样结果数据i = 0 # 自增计数以得到对应索引值while len(data_sample) <= sample_count and i * width <= record_count - 1: # 当样本量小于等于指定抽样数量并且矩阵索引在有效范围内时 data_sample.append(data[int(i * width)]) # 新增样本 i += 1 # 自增长print(data_sample[:2]) # 打印输出前2条数据print(len(data_sample)) # 打印输出样本数量首先使用Numpy的loadtxt方法读取数据文件;然后指定抽样样本量为2000,并通过读取原始数据的形状找到最大样本量边界,这可以用来作为循环的终止条件之一;接着通过最大样本量除抽样样本量得到抽样间距;建立一个空列表用于存储最终抽样结果数据,通过一个变量i做循环增长并用来做索引递增,然后进入抽样条件判断过程 。
当样本量小于等于指定抽样数量并且矩阵索引在有效范围内时做处理,这里需要注意的是索引从0开始,因此最大数量值减去1得到循环边界,否则会报索引溢出错误 。
通过列表的append方法不断追加通过间距得到的新增样本,在本节后面的方法中还会提到列表追加的extend方法,前者用于每次追加1个元素,后者用于批量追加多个元素 。
i += 1指的是每次循环都增加1,可以写成i = i + 1 。
最后打印输出前2条数据和抽样样本量 。
返回结果如下:
推荐阅读
- Python中print的那些事
- 4种出色的Python测试框架
- Python数据分析、挖掘常用工具
- Mac平台一款前端代码开发神器
- 烘青绿茶品质特征茶叶的芽叶较完整 外形松散不紧结
- Python如何解决200台服务器业务端口检测?技术大牛教你实现
- Python一键查询10万个ip地址归属地
- 30段极简Python代码:这些小技巧你都Get了么
- Python 的序列
- Python库大全