找到机器学习的标准数据集格式(2020)

2021-03-17 10:48:08

机器学习数据通常以其进入的任何形式共享(例如,图像,日志,表),而不能够对其包含的错误进行严格的假设,或者它是如何格式化的。这使得机器学习困难,因为您需要花费很多时间来解析如何解析和处理它。有些数据集伴随着加载脚本,它是特定于语言的,可能会破坏,有些则带有自己的服务器来查询数据集。这些确实有助于,但通常不可用,并且仍然需要我们单独处理每个数据集。

使用OpenML,我们的目标是采取无压力,' ZEN' - 与机器学习数据集一起使用的方法。为了使培训数据易于使用,OpenML以相同的格式提供数千个数据集,具有相同的富含元数据,使您可以直接加载它(例如Numpy,Pandas,......)并开始构建模型而无需手动干预。例如,您可以在简单的循环中跨数百个数据集进行基准测试算法。

出于历史原因,我们通过内部存储了ARFF数据格式的所有数据,包括基于CSV的文本的格式,该格式包括诸如正确的特征数据类型的元数据。然而,这种格式是松散定义的,导致不同的解析器以不同方式行事,并且当前解析器是抑制使用大型数据集的存储器效率的存储器效率。这些天是一种更流行的格式是镶木地板,是二进制单表格格式。但是,许多当前机器学习任务需要多表数据。例如,图像分割或对象检测任务具有图像和每个图像的变化量的涂布量。

简而言之,我们正在预见的未来在内部存储机器学习数据集的最佳格式,将OpenML扩展到各种现代机器学习数据集,并以统一的方式为它们提供服务。此博客文章呈现出过程和见解。在我们对如何向前迈进的决定之前,我们很乐意听到您的想法和经验。

它对于数据存储和传输应该是有用的。我们可以随时在上传期间转换数据或在OpenML'客户端下载。例如,人们可以将Python Pandas DataFrame上传到OpenML,稍后获得相同的DataFrame返回,而不实现或关心数据的应用程序。如果人们想要在本地存储数据,他们可以以它们所喜欢的格式下载(例如,像箭头/羽毛一样的内存映射格式,用于使用Tensorflow的人员的快速阅读或TFRecords)。附加代码可以促进此类转换。

应该有一个标准的方法来表示特定类型的数据,即可以验证的固定模式。例如,所有表格数据应以统一的方式存储。没有它,我们需要特定于数据集的加载代码,需要维护,并且需要检查质量并提取元数据。

该格式应允许存储大多数(已处理的)机器学习数据集,包括图像,视频,音频,文本,图形和多表格数据,例如对象识别任务和关系数据。诸如图像的数据可以转换为以这种格式存储的数字格式(例如,像素值)(以及机器学习中的使用)。

由于OpenML是一个社区项目,我们希望保持尽可能简单地使用和维护:

我们需要机器可读模式(以特定语言)描述如何格式化某种类型的数据。示例将是表格数据的模式,用于注释图像数据的模式等。每个数据集应指定它满足的模式,我们应该能够验证这一点。我们的目标是逐步推出支持表格不同类型的数据,从表格开始,并且仅在定义模式后仅包括其他类型。

我们现在需要支持批处理数据,但理想情况下,格式应该允许将来附加数据(流)。

当不同意架构时,我们可以在与其他举措合作(例如FrictionLesddata)的合作中向社区提供讨论和同意标准架构的论坛。例如,可以在GitHub Repo中创建新模式,以允许人们进行拉拔请求。一旦合并,它们就可以有效地使用。

如果可能,支持多个“资源”(例如,文件或多个关系表的集合)。

尚未足够稳定,不适合长期存储。作者也向长期存储劝阻。

限于每个文件的一个数据结构,但数据结构可以复杂(例如,dict)。

具有不同语言的解析器,但每个库中都不支持所有地板功能(见下文)。

Python库(箭头,FastParquet)不支持部分读/写入。 Java / Go实现执行。将镶木地板文件分成许多小文件可能是麻烦的。

没有版本控制,没有元数据存储,无模式强制执行。顶部(例如Delta Lake)的层数都支持这一点。简单的文件版本控制也可以使用S3完成。

不同的解析器(例如箭头内部镶木地板,FastParquet)实施镶木地板格式的不同部分和不同的压缩算法。因此,Parquet文件可能不在解析器之间兼容(请参阅此处和此处。

支持仅限于单表存储。例如,似乎没有作为单个条形文件存储对象检测数据集(用图像和注释)的明显方法。

非常灵活地访问数据部分。 SQL查询可用于选择数据的任何子集。

它仅支持2000列,我们拥有超过2000多个功能的数据集。因此,存储大型表格数据将需要不同的映射数据,这将增加大量的额外复杂性。

对所有语言的支持非常好。具有良好的解析器,所有这些都使用相同的C实现。

自我描述性:可以以编程方式轻松读取数据的结构。例如,'dump -h -a 0 mydata.hdf5'将为您提供大量详细信息数据集的结构。

复杂。我们不能提出关于数据如何构造的先验假设。我们需要定义模式和实现自动验证数据集遵循特定架构的代码(例如,使用H5dump查看它是否包含我们可以加载到Pandas的单个数据帧)。我们不知道任何措施来定义这种模式。

格式具有很长且详细的规范。虽然存在解析器,但我们真的不知道它们是否完全彼此兼容。

基于文本的,因此使用Git LFS简单的版本控制。通过简单的Git Diff,可以观察到不同版本的变化。

存在许多不同的方言。我们需要决定标准化的方言,并强制执行该方言仅在OpenML上使用(https://frictionlessdata.io/specs/csv-dialect/)。 RFC4180中指定的方言通常建议使用逗号作为分隔符和引号作为报价字符。

在存储DataFrame上存在一些先前的基准(这里和此)。这些只考虑单表数据集。为了阅读/写作,CSV显然较慢,木质镶木地板显然更快。对于储存,镶木地板最有效但却是压缩的CSV。 HDF需要更多的磁盘空间。我们还耗尽了自己的基准测试,可以比较那些数据格式的写作性能为非常大而复杂的机器学习数据集,但无法找到在地板中的一个文件中存储这些方法。

大型数据集的版本控制很棘手。对于基于文本的格式(CSV),我们可以使用Git LFS存储数据集并具有数据集的自动版本控制。我们发现它很容易将所有当前OpenML数据集导出到Gitlab:https://gitlab.com/data/d/openml。

二进制格式不允许我们跟踪数据的更改,仅恢复所需数据集的确切版本(及其元数据)。可能,额外的工具仍可用于将数据导出到DataFrames或文本,然后比较它们。 Delta Lake具有版本历史支持,但似乎仅用于在数据集上完成的Spark操作。

我们需要你的帮助!如果我们错过了我们应该调查的任何格式,或者误解了我们调查的那些,或错过了一些最佳实践,请告诉我们。您欢迎您在下面发表评论,或者在[email protected]发送电子邮件

撰稿人帖子:Mitar Milutinovic,Prabhant Singh,Joaquin Vanschoren,Pieter Gijsbers,Andreas Mueller,Matthias Feurer,Jan Van Rijn,Marcus Weimer,Marcus Wever,Gertjan Van Den Burg,Nick Poorman