数据共享非常困难,但众所周知的是它在探索和回报上有很大潜力。一个典型的“共享操作”就像用移动硬盘传播信息,将压缩文件放在大学或云端服务器,或在一个安全的大学集群中存储大量数据(但会经常担心它被清除)。这是最理想的方法吗?这足够简单易行吗?为了回答以上问题,我们要考虑处理数据集需要经过的流程。如下所示:
事件的流程往往是循环的,因为数据的产生往往是一个流。从步骤1到步骤6,唯一让数据停止流动的理由是停止搜集数据。最理想的情况下,所有步骤可以自动实现。步骤1可能是核磁共振扫描图像的产生,步骤2可能是自动将初始形式转化为研究者所需形式,步骤3将其转移到私有的集群存储,步骤4被研究团队使用,随后步骤5和6(如果流程全部发生)是额外工作用来进一步处理数据并将其转移到共享地址。
通常情况下,我们在步骤4停止,因为此时足以满足实验要求、完成分析及论文撰写。讽刺的是,步骤5和6常常会有意外的收获。但是不言而喻的是,如果我分享数据集后,你抢先一步发表论文,我就会一无所获。数据类似于橙子,在放弃这个橙子之前要榨出它所有汁水,所以我当然不想这么做。但是有争议的是,如果分享数据集本身可以完成论文(或类似的成果)并且步骤4和5很简单,会有更多的数据共享。这就是我今天要讨论的主题,尽管没有可用的结论,我将告诉你分享Kaggle数据集非常简单。
Living Data
译者注:变动数据这个概念作者在其他文中提及,对变动数据的定义是未来一种理想的状态下,研究者可以专注于提出问题,软件工程师会为其提供数据。
我曾经讨论过变动数据的概念。总之,随着新数据的出现,我们可以更新对世界的理解以及一些有趣问题的答案。把知识比作静态的PDF并不恰当,因为它只代表一个时间点的状态。相反,变动数据体现我们为了证实或否认假设所积累的知识是变化的。为了将这种理想状态变为现实,我们要能轻易地满足其需求。现在,共享数据是刊物发表后的人工操作。许多期刊鼓励或要求这种行为,研究人员可以把某些时间点的数据集上传到各个平台。尽管这种做法聊胜于无,但我认为这不是了解世界最好的方式。相比于静态文章,我们应该能把一组数据输入到算法中,然后得到一个新的答案。我们希望在数据产生时自动完成数据共享,并可供所有想研究的人使用。现在看来这个目标可能过于崇高,但我们可以想象在这两个极端中间的情况。如何通过一个简单的流程来自动生成和共享数据集?可能如下所示:
步骤4到6同上(研究员完成分析),但不是一个组织独享数据,它可供数千人使用。变化在于我们在步骤3增加了持续集成这个助手,使处理和共享数据变得容易。我们往往认为持续集成(CI)用于测试或部署,但是它在数据共享中也是有价值的工具。基于这个想法的本质,我们将它命名为“持续数据”。一旦数据被处理并传输到研究组的存储中,它也可能经历持续数据的步骤,将其打包以便共享。
小结
我们需要在存储这一步中激发数据共享,并为研究者提供支持。机构要配备足够的数据工程师,并优先开发用于此任务的组织标准和工具。与此同时,小型研究计算小组可以帮助研究者完成目标。研究者应寻求帮助来分享他们的数据集。
Kaggle API
尽管更大的,机构层面的资源会更理想,但同时我们可以利用开源的免费资源,如Kaggle。对于初期的科学再现性,我认为Kaggle具备Github那样的潜力。如果共享数据集是简单而有趣的并且有潜在的回报,Kaggle可以对成规模的探索和协作产生影响。但我们必须从某个地方开始!我决定首先展示我可以使用Kaggle API来上传数据集。在网页接口中实现相当容易,而且通过命令行执行也很容易。简而言之,我们所需要的只是一个包含数据文件和元数据(json文件)的目录,我们可以将其指向API客户端。例如,这里是我上传的一个数据集
datapackage.json用来描述上传的内容。
那么,向别人共享数据集以供使用和探索有多难呢?您可以下载证书来对服务进行身份验证 credential file。然后将文件(.tar.gz或.csv)放在文件夹中,创建json文件,并将工具指向它。这很简单,你能在没有任何额外帮助的情况下完成所有事情。将这样的脚本插入到一些持续集成中,以便在将数据集添加到存储时更新数据集,这是非常简单的。
你的工具!
我创建了一个Docker Container,它提供了一个简单的示例,用于与Kaggle API交互并生成数据集。我将介绍脚本的基本逻辑。Kaggle命令行客户端在很多任务上完成得很好,但是作为开发人员,我希望更多地控制元数据规范和文件清理创建等类似的事情。我也希望它能容器化,这样我就可以做一个与主机隔离的创建操作。
构建容器
以下在Docker Hub上提供,你也可以构建自己的容器:
我没有将创建脚本作为切入点,因为我希望交互成为一个交互式的“进入到容器中并理解发生了什么。”你可以进行如下操作。
请注意,我们将把Kaggle API提供的证书绑定到root用户的home目录当中,以便用户端发现到它们,并且我们将通过加 -v 后缀的方式指定目录与数据文件(我们上传的数据集)的关联:现在所讨论问题中的数据集是一个恐龙的Zenodo ML的数据集,具体来说,它是将numpy数组转化为实际png图片的数据样本。对于感兴趣的人,这里提供了用于重新组织和生成数据子集的脚本。这样做的初衷是因为我根本无法分享Kaggle上的恐龙数据集(太大了!)我的想法是共享一个可用的子集,感兴趣的人可以下载整个数据集。如果您感兴趣的话,完整的数据集如下。
生成数据集
脚本create_dataset.py位于进入的工作目录中,该用法将接受您希望生成数据集的参数。我们可以在没有参数的情况下运行脚本以查看详细信息,
我在/tmp/data/ARCHIVE中有我的数据文件(.tar.gz files),所以首先我为它们准备了一个空格分隔的完整路径列表:
我想把它们上传到一个叫做 vanessa/code-images的新数据集。命令如下:
以上提到的参数解释如下:
- keywords 是逗号分隔的关键词列表 (没有空格!)
- files 是要上传数据文件的完整路径
- title 是赋予数据集的标题(有空格时需要加引号)
- name 是数据集本身的名字 (不能包含空格和特殊符号,最好加引号)
- username 是kaggle的用户名,或数据集所属的机构名称
这将会生成一个数据包的临时目录
你可以把你的文件加入其中,例如以下是我在临时文件夹里填充的内容:
回想起来,我也不需要在这里复制文件,但我这样做是因为我不喜欢对原始数据进行任何操作(以防意外)。这样的话,工具将显示元数据文件(上面已经显示的一个),然后开始上传。这可能需要一些时间,完成后它会显示一个URL!
非常重要!有一种后处理的情况,这可能需要更多的时间(考虑到上传的规模大小,它确实花了我这么多时间)。直到第二天早上,数据集才存到URL中,所以你要有足够的耐心。在它完成操作以前,你只能得到404。你可以去跑步,或者当天到此为止。由于数据集需要额外的元数据和描述/助手,因此建议在可用时访问URL,并添加图像、描述、示例等。上传(默认使用我的工具)是私有的,这样用户可以在公开之前检查内容。这是体力劳动吗?对于第一次上传,答案是肯定的,但是数据集的后续版本不一定需要它。同时,工具也在快速增长和变化,你应该期待更好的变化!
可重复科学展望
机构需要格外重视数据,并帮助研究者承担管理数据的重任。研究人员应该能获得支持来管理数据,然后使其具备可编程的访问性。这必须超越传统图书馆提供的“档案”,深入研究API、通知、部署或分析触发器。虽然我们没有这样的系统,但它始于简单的解决方案,可以轻松创建和共享数据集。我希望计算发生位置(我们的研究计算集群)和数据存储位置(并通过上传或API自动共享)之间建立密切的关系。如下所示:
通知可以包括以下任何范围1)提醒另一个新数据的研究者,2)触发一个CI作业从存储重新上传到一个共享位置,或者3)触发某个容器新版本的构建和部署,其依赖于某些数据。
我们需要数据工程师
一个机构需要分配资源和人员,仅仅用于为研究者提供数据。而不是新的PI需要每次都从头开始,完成实验室收集,整理,然后处理数据。收集数据的机器应该收集它,并按规定格式将其发送到指定位置。
我们需要协作平台
我相信未来研究者可以合作研究。他们利用其他研究者提供的数据源,在协作平台上完成某种类型的出版物。感觉就像一种“如果你建造平台,研究者会参与”的场景,有趣的问题是:“由谁来建造它?”
现在,我们的计算集群就像狂野的西部!
当然,我们有当地执法部分来防止不受欢迎的牛仔误入野生沙漠(文件和目录许可),但主要是由不同的小组决定如何组织他们的文件。因此我们看到如下:
- 我们忘记了文档在哪里
- 我们忘记了文档是什么
- 用于论文的数据和脚本丢失和被遗忘
- 每一个空间看起来都不一样
我们目前所面临的问题-我们有一些新的数据集要处理,但是没有足够空间,所以我们用电子邮件发送我们的研究计算来问为什么(我能有更多空间吗?)然后发送电子邮件到我们的实验室请求“清理这些文件!” 然后再删除一些我们曾认为非常重要的数据,但是它不再重要了,因为“磁盘空间不足。”
想象一个可能的场景,研究者不用完全负责管理数据、关注数据和相关元数据。他们可以专注于科学。数据工程师会为他们提供帮助,同时有异常多的细节和正常人无法关注到的元数据。不做这件事的成本是不可避免的浪费时间,丢失和发现事物,不能复制工作,或者从容易地得到数据指向(复杂地)使用数据。
尚存的挑战
我们仍然需要考虑一些潜在的挑战:
和学术出版的联系是什么?
我持续关注Kaggle是因为还没有找到一个类似的成熟平台来处理数据集。我对Kaggle的感觉是“让我们享受过程,学习并利用机器学习”或“让我们通过竞赛争夺奖励。”我遇到过研究生想用他的业余时间尝试参加比赛来赢得一些东西,或者学习和娱乐,但并不是为了深入研究。正如我所理解的,Kaggle没有适合学术研究人员的氛围。但当我想到这些时,“竞争”和“协作”并没有太大的差异,两者都是很多人同时工作来解决类似问题。这两个情况都有挑战的目标,和可以评估的度量标准来评价一个解决方案的优劣。有趣的是,Kaggle像Github一样,是一个相对无偏见的平台,我们可以选择以不同的方式使用它。学术研究人员可以选择“竞争”,这实际上包括研究人员一起回答一个科学问题。需要完善补充的是一些附加的规则和工具,以便为参与者和数据提供者提供发表的途径并获得应有的奖励。
如果我们想鼓励数据共享,从而推动探索,我们需要解决这个缺失的激励因素。研究生或研究人员可应当能通过像Kaggle这样的平台来进一步发展自己的事业。这应该很容易并且很有趣。如果一场比赛根本不是一场竞赛,而实际上是一次合作。一个研究生会和他的PI说:“嘿,我发现这个kaggle数据集在解决类似的问题,我可以尝试一下这种方法?“PI会肯定他的想法,因为它和学生独立解决问题是一样的,但有一些数据需要预处理,还有一些问题要讨论。研究生将进入其内核入口,以优化一些度量,并努力自动总结成某种类似论文出版物。评论将在一直伴随这些步骤的推进,因为工作将是完全开放的。所有那些贡献的人,从创建初始数据集到提交讨论解决方案,都将被得到奖励,因为他们已经参与了出版。如果进展顺利,问题本身也会被概念性地组织起来,所以我们可以开始映射假设的空间。
我们如何能掌握所有方法?
方法就像容器一样。目前在大多数论文中,他们没有实质性的重复工作。很难从一个文本中得到一个完整的方法论本体和它们与函数的链接(是的,我实际上是从一个研究生院项目开始的,并且早就放弃了它,以支持我的委员会认为有意义的项目。”但是假如我们有代码,这些方法可以自动导出(甚至可能与文档源链接)。未来可能当代码与出版物非常接近时,我们将大幅削减了我们花费在方法部分上的时间。或者因为在容器中提供了方法部分而可以复制工作。
如何处理数据中的敏感信息?
不言而喻,我们要注意去除数据中的敏感信息。想起来这是一件可怕的事情,尤其是在这个时代,似乎不再有隐私之类的东西了。任何数据共享初始化过程或管道必须采取隐私和(如果必要的话)协议去识别。
机构的动力是什么?
这是一个更难的问题。一个机构如何才能仅仅为了数据,将资金投入到人力和资源中?据我所知,一直以来人们都会组成委员会并谈论事情。也许这是需要做的事情,但是很难坐在硅谷,并看着公司跳过闲聊,直接把事情办好。也许刚开始这样并不完美,但万事开头难,后面进展会更顺利。
总结
这就是我现在的想法!我们还没有一个完美的解决方案,但我们有办法分享我们的数据以供其他人探索。我希望Kaggle上的团队能够在激励研究人员方面起带头作用,这将使学术界的软件工程师很容易地帮助研究者分享他们的数据。以下是我要采取的步骤:
- 创建共享数据的简单工具/示例(本文)
- 创建共享学术数据集的激励(合作,开源出版物?)
- 支持一种学者分享文化,并做一些测试案例
- 寻找研究软件工程师帮助研究人员!
然后出炉啦!我们有开源、协作共享数据集和出版物。说到最后一点,如果你是掌握着有价值的数据集的研究者(即使是杂乱的),并且你想要帮助分享它,请伸出手让我帮助你。如果你有一些想法或思考如何能做一个以上的示例,我希望你能提供帮助。
原文链接:
http://blog.kaggle.com/2018/06/21/open-source-datasets-with-kaggle/