首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

清理、处理和可视化数据集,第 1 部分 处理散乱数据-2

清理、处理和可视化数据集,第 1 部分 处理散乱数据-2

数据概要分析当数据整洁时,作为清理过程中的辅助步骤,下一步是对数据执行概要分析。概要分析指的是分析数据以确保它是一致的。通过概要分析,可以剖析数据来查看各个字段的分布,以便查找异常值和其他与这个通用数据集不匹配的数据。
例如,图 5 演示了这一流程。在第 1 行,假定实数值表示物理测量值,那么 0 值可能表示此观察值存在的某个问题。在第 3                行,可以看到此处的测量值范围明显与此字段的其他测量值的范围不同(而且字段类型也不同)。最后,在第 5 行,可以注意到类名拼写错了。
图 5. 通过数据概要分析揭示数据集错误在一些情况下,这些问题可通过概要分析自动检测出来。您可以指示所有测量值应大于                0,以便捕获第一种问题。通过统计分析,可以识别出第二个测量值异常。最后一个问题可通过捕获唯一类名来识别,通过它们出现的频率,可以理解这个特定的类名是一个异常值(可能仅出现了一次)。
可以在操作流的上下文中验证时序数据,确保按给定时间戳的正确顺序处理数据。否则,结果的有效性可能值得怀疑。可以通过移动数据窗口来将异常值(或峰值)修改为窗口中间值(通过应用                Hampel 过滤器)。
数据概要分析可以手动执行,我将通过构造一个数据清理工具来演示这一过程。
构建一个数据清理工具构建通用的数据清理工具相对比较简单。我将演示构造一个简单的 CSV 数据清理工具来实现一组重要特性,包括:
  • 通过用户定义的模式来检查字段类型
  • 验证观察值的字段是否太少或太多
  • 自动提取错误数据供用户检查
  • 使用用户定义的概率来生成训练和测试数据集
  • 汇总数据以执行简单的数据概要分析
首先简要讨论一下此工具的操作流程。图 6 演示了工作流程和得到的数据。
图 6. 一个数据清理和概要分析工具的操作流程首先是一个格式化为逗号分隔文本文件的原始数据集。用户以字符串形式提供模式,识别每个字段的类型,以用于解析和验证每个观察值的每个字段。将没有通过类型检查(或包含太少或太多字段)的观察值写入一个错误文件(我可以手动修复该文件并重新应用于原始数据集)。通过初始检查的观察值被视为有效,然后前进到数据集拆分和汇总步骤。我可以(基于用户定义的概率)将每个新样本发送到一个训练或测试数据集,每个字段按特定于类型的方式进行汇总。例如,对字符串执行聚合(最多                10 个),分析整数和实数值中的最小值、最大值和平均值。
可以在 GitHub 上找到这个 简单清理工具 的源代码,如下文所示。这个存储库包含 3 个源文件,分别实现输入文件管理、行解析和汇总。源代码将功能拆分为处理循环                (cleanse.c)、字段解析 (parse.c) 和汇总                (summary.c)。处理循环解析来自命令行的选项,打开(和关闭)所有相关文件,迭代式读取输入文件中的行。这些行传递到解析器,解析器然后解析各行中的每个字段,并使用所提供的模式验证这些字段。摘要在一个单独文件中管理,以维护给定字段的唯一字符串列表或对数字数据进行概要分析。
图 7. 演示数据清理和概要分析工具的流程图现在看看如何实际使用该工具。
我使用了 Richard Forsyth 创建的一个称为动物园数据库的旧数据集,其中包含 15                个描述动物及其名称和类(称为类型)的二进制值属性,以及一个表示动物的腿数量的非二进制属性。模式和样本如图 8                所示,此数据集中包含了(7 个可能类的)101 个总观察值中的 3 个。
图 8. 动物园数据集演示(模式和 3 个观察值)源代码包含一个 Makefile,通过使用它,我可以在标准 Linux 命令行上输入 make                来构建该工具:
1
2
3
$ make
gcc -o cleanse cleanse.c parse.c summary.c -I. -g -std=c99 -Wall
$




得到的可执行文件名为 cleanse。我通过指定输入文件(-i                选项)、输出文件(-o 选项)和模式(-c 选项)来调用此工具。                为数据中的每个逗号分隔字段使用单个字符来表示模式(d 表示整数,s                表示字符串,g 表示浮点数或双精度浮点数)。
1
2
$ ./cleanse -i zoo.dat -o output -c "sddddddddddddddddd"
$




如果检查错误文件,可以看到没有正确解析并因此被存储为错误的记录。请注意,还生成了注释来表明第一个错误位于给定观察值中的何处。如下面的代码中所示,第一个错误在一个二进制值的位置找到一个问号                (?),第二个错误识别出一个缺失值。最后一个错误没有任何数据。对于存在明显问题的数据,我可以在原始数据集中修复它。
1
2
3
4
5
6
7
8
$ cat output.err
# Error in field 4
cat,1,0,0,?,0,0,1,1,1,1,0,0,4,1,1,1,1
# Error in field 4
dog,1,0,0,,0,0,1,1,1,1,0,0,4,1,1,1,1
# Error in field 0
,,,,,,,,,,,,,,,,,
$




输出文件(名为 output.dat)包含该工具已验证的观察值:
1
2
3
4
5
6
7
8
$ more output.dat
aardvark,1,0,0,1,0,0,1,1,1,1,0,0,4,0,0,1,1
antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1
bass,0,0,1,0,0,1,1,1,1,0,0,1,0,1,0,0,4
...
worm,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,7
wren,0,1,1,0,1,0,0,0,1,1,0,0,2,1,0,0,2
$




通过使用有效的数据集,然后我可以通过指定 -p 选项来查看数据的概况。下面给出了此输出的一部分,字符串数据的摘要(省略号                […] 表明有 10 个或更多唯一字符串)和 3 个数字字段。例如,从此数据可以看到,有一些观察值包含                feathers。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ ./cleanse -i output.dat -o output2 -c "sddddddddddddddddd" -p
Data Profile:

Field 0: (STRING)
     aardvark
     antelope
     bass
     bear
     boar
     buffalo
     calf
     carp
     catfish
     cavy
     ...

Field 1: (INT)
     Min: 0
     Max: 1
     Avg: 0.425743

Field 2: (INT)
     Min: 0
     Max: 1
     Avg: 0.19802
...
Field 17: (INT)
     Min: 1
     Max: 7
     Avg: 2.83168

$




这个简单数据清理工具的最后一个特性是能够将数据集拆分为两部分:一部分用于训练,另一部分用于测试。我可以通过 -s                    选项(表示拆分数据集)来实现此目的。 为了演示此功能,我为数据指定 90/10 的拆分比例(为训练数据使用概率                0.9),然后查看每个输出文件的行长度(使用 wc 或字数统计实用程序,以及                -l 或 line 选项),以查看训练数据和测试数据是否按 90/10 的大体比例拆分。                最后,我给出一个 12 行的测试数据文件,以查看测试观察值的分布。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ./cleanse -i zoo.dat -o output -c "sddddddddddddddddd" -s 0.9
$ wc -l output.dat
89 output.dat
$ wc -l output.tst
12 output.tst
$ cat output.tst
carp,0,0,1,0,0,1,0,1,1,0,0,1,0,1,1,0,4
cheetah,1,0,0,1,0,0,1,1,1,1,0,0,4,1,0,1,1
clam,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,7
crayfish,0,0,1,0,0,1,1,0,0,0,0,0,6,0,0,0,7
flea,0,0,1,0,0,0,0,0,0,1,0,0,6,0,0,0,6
frog,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,5
gorilla,1,0,0,1,0,0,0,1,1,1,0,0,2,0,0,1,1
haddock,0,0,1,0,0,1,0,1,1,0,0,1,0,1,0,0,4
mole,1,0,0,1,0,0,1,1,1,1,0,0,4,1,0,0,1
ostrich,0,1,1,0,0,0,0,0,1,1,0,0,2,1,0,1,2
raccoon,1,0,0,1,0,0,1,1,1,1,0,0,4,1,0,1,1
reindeer,1,0,0,1,0,0,0,1,1,1,0,0,4,1,1,1,1
$




我现在可以将训练数据文件 (output.dat) 和测试数据文件 (output.tst)                应用于一个机器学习算法,下一篇教程将探索该主题,介绍两种独特的分类方法。
开源数据清理工具可以在开源领域找到许多数据清理工具。一个有趣的示例是 ,它使用一种工作流方法来对基于文本的数据执行数据清理,该方法自动处理可用数据中的依赖关系并运行命令来清理它们。它支持多个输入和输出文件,而且有一个与                make 实用程序类似的操作(在管理依赖关系的上下文中)。
是一个框架兼数据概要分析引擎,它公开了一个 API,而且允许使用用户定义的扩展进行数据清理。DataCleaner                支持多种输入和输出格式,能够为数据创建数据质量规则。
结束语本教程探索了清理数据的问题和解决方案,讨论了如何开发一个能够执行数据验证和概要分析的简单实用程序。在第 2                部分,我将利用这些经过清理的数据,构建两种模型(基于自适应共振理论和矢量量化)来分类数据,以及量化每种模型的准确性。在第 3                部分,我将探索使用各种开源工具对此数据进行可视化的一些方式。
返回列表