使用Python进行可重复数据科学的工具和协议


50

我正在使用Python进行数据科学项目。该项目分为几个阶段。每个阶段包括使用Python脚本获取数据集,辅助数据,配置和参数,以及创建另一个数据集。我将代码存储在git中,以便覆盖该部分。我想听听:

  1. 数据版本控制工具。
  2. 能够重现阶段和实验的工具。
  3. 此类项目的协议和建议的目录结构。
  4. 自动化的构建/运行工具。

2
这个问题在哪里?请花一点时间查看帮助中心的指南,特别是:“如果您提出问题的动机是'我想参加有关______的讨论',那么您不应该在这里提问。”
航空

“您只应根据自己面临的实际问题提出切实可行的问题。”
Yuval F

这与“告诉我如何执行数据科学”是实用,可回答且基于实际问题的方式几乎一样,是实用,可解决且基于实际问题的。
航空

Answers:


46

的主题重复性研究(RR)是非常流行的今天,因此,是巨大的,但我希望我的回答将是不够全面的答案,将用于提供足够的信息进一步的研究,你应该决定这样做。

尽管确实存在针对RR的特定于Python的工具,但我认为专注于更通用的工具更有意义(您永远无法确定将来将使用哪种编程语言和计算环境)。话虽如此,让我们看一下每个列表中可用的工具。

1)数据版本控制工具。我猜除非您打算使用(非常)大数据,否则git使用用于源代码版本控制的same会很有意义。基础结构已经存在。即使您的文件是二进制文件又很大,此建议也可能会有所帮助:https : //stackoverflow.com/questions/540535/managing-large-binary-files-with-git

2)用于管理RR工作流程和实验的工具。据我所知,以下是该类别中最流行的工具的列表(按流行程度降序):

例子。这是一篇有关科学工作流的有趣文章,其中以使用KeplermyExperiment项目为基础,提供了实际工作流设计和数据分析的示例http : //f1000research.com/articles/3-110/v1

有许多RR工具可以实现识字编程范例,以LaTeX软件系列为例。工具在生成报告和演示帮助也是一个大的类别,其中Sweaveknitr可能是最知名的。Sweave是一个专注于R的工具,但是它可以与基于Python的项目集成,尽管需要付出额外的努力(https://stackoverflow.com/questions/2161152/sweave-for-python)。我认为,这knitr可能是一个更好的选择,因为它是现代的,受到流行工具(例如RStudio)的广泛支持,并且与语言无关(http://yihui.name/knitr/demo/engines)。

3)协议和建议的目录结构。如果我正确理解了使用术语协议工作流)所隐含的含义,通常我认为标准RR数据分析工作流包含以下连续阶段:数据收集 => 数据准备(清理,转换,合并,采样)=> 数据分析 => 结果展示(生成报告和/或展示)。但是,每个工作流程都是特定于项目的,因此,某些特定任务可能需要添加其他步骤。

对于示例目录结构,您可以查看R软件包的文档ProjectTemplatehttp://projecttemplate.net),以尝试使数据分析工作流和项目自动化:

在此处输入图片说明

4)自动化的构建/运行工具。由于我的回答集中在通用(与语言无关)的RR工具上,因此最受欢迎的工具是make。出于某些原因,请阅读以下文章,以make用作首选的RR工作流自动化工具:http : //bost.ocks.org/mike/make。当然,还有其他类似的工具,它们可以改进的某些方面make,或者添加一些其他功能。例如:(ant正式地,Apache Ant:http : //ant.apache.org),Maven(“下一代ant”:http : //maven.apache.org),rakehttps://github.com/ruby/rake) ,Makepphttp://makepp.sourceforge.net)。有关此类工具的完整列表,请参见Wikipedia:http : //en.wikipedia.org/wiki/List_of_build_automation_software


这里是有关识字编程的链接:基本上,它是关于对代码进行足够的注释,以使代码成为独立的文档。
2015年

@gaborous:我了解识字编程的含义,并且未包含任何与范式的链接,因为它有很多来源,而且很容易找到。不过,谢谢您的评论。
Aleksandr Blekh

1
我猜到了,这就是为什么我将此信息添加为有兴趣的读者的评论的原因:)
令人讨厌的

4
这是一个非常全面的答案,但令我惊讶的是似乎缺少一个方面。交叉验证是大多数DS项目的重要组成部分,通常需要随机抽样,这会使重现性变得困难。我建议您简要介绍一下将相同的种子用于随机生成器,以便无论统计差异如何都能重现结果。谢谢!
AN6U5

@ AN6U5:谢谢您的客气话!我同意-我错过了这一方面(+1)。请随时更新我的​​答案,并添加有关交叉验证的相关简要信息。
Aleksandr Blekh '16

23

自从我开始在学术界进行研究以来,我一直在寻找令人满意的工作流程。我认为我终于找到了令我满意的东西:

1)将所有内容置于版本控制下,例如Git:

对于爱好研究项目,我使用GitHub,对于工作研究,我使用由我们大学提供的私有GitLab服务器。我还将数据集保存在那里。

2)我将大部分分析工作与IPython笔记本上的文档一起进行。(对我来说)组织代码,图表和讨论/结论都非常有条理(如果对我而言),如果我运行较大的脚本,通常会将它们放在单独的脚本.py文件中,但我仍然会执行它们通过%run魔术从IPython笔记本中添加有关目的,结果和其他参数的信息。

我为IPython和IPython笔记本编写了一个小的单元魔术扩展,称为“水印”,用于方便地创建时间戳并跟踪所使用的不同包版本以及Git哈希

例如


%watermark

29/06/2014 01:19:10

CPython 3.4.1
IPython 2.1.0

compiler   : GCC 4.2.1 (Apple Inc. build 5577)
system     : Darwin
release    : 13.2.0
machine    : x86_64
processor  : i386
CPU cores  : 2
interpreter: 64bit


%watermark -d -t

29/06/2014 01:19:11 


%watermark -v -m -p numpy,scipy

CPython 3.4.1
IPython 2.1.0

numpy 1.8.1
scipy 0.14.0

compiler   : GCC 4.2.1 (Apple Inc. build 5577)
system     : Darwin
release    : 13.2.0
machine    : x86_64
processor  : i386
CPU cores  : 2
interpreter: 64bit

有关更多信息,请参见此处文档


2
我喜欢水印魔术。对于那些不知道的人,GitHub现在为与学术机构相关的用户提供了多达5个免费的私人存储库。
bogatron 2014年

19

最好的可重复性工具是记录您的操作,如下所示:

experiment/input ; expected ; observation/output ; current hypothesis and if supported or rejected
exp1 ; expected1 ; obs1 ; some fancy hypothesis, supported

这可以写在纸上,但是,如果您的实验适合计算框架,则可以使用计算工具来部分或完全自动化该日志记录过程(特别是通过帮助您跟踪可能庞大的输入数据集和输出)图)。

当然,IPython / Jupyter Notebook是一个学习曲线较低的Python的出色重现性工具(请不要忘记%logon和%logstart魔术)。提示:为确保您的笔记本计算机具有可复制性,请重新启动内核并尝试从上至下运行所有​​单元(按钮“运行所有单元”):如果可行,则将所有内容保存在存档文件中(“冻结”),否则,特别是如果您需要以非线性,非顺序和非显而易见的方式运行单元格以避免错误,则需要进行一些重做。

最近的另一个出色工具(2015年)是recipy,它非常类似于sumatra(请参见下文),但是是专门为Python设计的。我不知道它是否可以与Jupyter Notebooks一起使用,但是我知道作者经常使用它们,所以我想如果将来不支持它的话。

Git也很棒,它与Python无关。它不仅可以帮助您保留所有实验,代码,数据集,图形等的历史记录,而且还可以为您提供使用科学工具进行维护(git pickaxe),协作()和调试(git - bisect)的工具。调试方法(称为增量调试)。是一个虚构的研究人员试图制作自己的实验记录系统的故事,直到最终成为Git的传真为止。

Sumatra是另一种适用于任何语言的通用工具(在pypi上使用Python API )是Sumatra,它专门用于帮助您进行可复制的研究(可复制的目的是在使用完全相同的代码和软件的情况下产生相同的结果,而可再现性旨在产生可复制的内容。无论使用哪种介质,结果都是相同的,这是非常困难且耗时的,并且无法实现自动化)。

这是苏门答腊的工作方式:对于您通过苏门答腊进行的每个实验,该软件都将像电子游戏中经常出现的“保存游戏状态”一样工作。更准确地说,它将节省:

  • 您提供的所有参数;
  • 整个实验应用程序和配置文件的确切源代码状态;
  • 输出/图表/结果,以及实验应用程序生成的任何文件。

然后,它将为每个实验构建一个带有时间戳和其他元数据的数据库,以后您可以使用webGUI进行爬网。由于Sumatra在某个特定的时间点为特定的实验保存了应用程序的完整状态,因此您可以随时恢复生成特定结果的代码,从而可以低成本进行可复制的研究(除非存储,您可以处理庞大的数据集,但是如果您不想每次都保存所有内容,则可以配置例外。

另一个很棒的工具是GNOME的Zeitgeist(以前使用Python进行编码,但现在已移植到Vala),它是一种无所不包的动作日志系统,它记录了您所做的一切,并且可以使用机器学习来总结您希望项目之间基于关系的时间段。关于相似性和使用方式的问题,例如回答“去年X月份我在X上工作时与我最相关的是什么?”之类的问题。。有趣的是,类似于Evernote的笔记应用程序Zim Desktop Wiki具有与Zeitgeist一起使用的插件。

最后,您可以使用Git或Sumatra或任何其他所需的软件,它们将为您提供大致相同的复制能力,但是Sumatra是专门为科学研究量身定制的,因此它提供了一些精美的工具,例如可进行抓取的Web GUI您的结果,虽然Git更适合代码维护(但它具有git-bisect之类的调试工具,所以如果您的实验涉及代码,则实际上可能会更好)。或者当然可以同时使用两者!

/编辑:dsign在这里触及了非常重要的一点:设置的可复制性与应用程序的可复制性一样重要。换句话说,您至少应提供所使用的库和编译器完整列表,以及它们的确切版本平台的详细信息。

就个人而言,在使用Python进行科学计算时,我发现将应用程序与库一起打包太痛苦了,因此,我现在仅使用诸如Anaconda之类的多合一科学python软件包(具有出色的软件包管理器conda),并建议用户使用相同的软件包。另一种解决方案是提供脚本以自动生成virtualenv,或使用dsign或开源Vagrant 引用的商业Docker应用程序打包所有内容(例如pylearn2-in-a-box使用Vagrant生成易于重新分发的文件)虚拟环境包)。

最后,为了真正确保您每次都拥有一个完整的工作环境,您可以制作一个虚拟机(请参阅VirtualBox),甚至可以保存计算机的状态(快照),并在其中准备运行实验。然后,您可以共享所有包含的虚拟机,以便任何人都可以使用您的精确设置来复制您的实验。这可能是复制基于软件的实验的最佳方法。容器可能是更轻量级的替代方案,但是它们不包括整个环境,因此复制保真度将较差。

/ EDIT2:这是一个很棒的视频摘要(用于调试,但也可以用于研究),这是进行可重复研究的基础:记录实验以及科学方法的其他步骤,这是一种“显式实验”


14

一定要签出docker!总的来说,软件工程为了确保隔离性和可复制性而创造了所有其他美好的事物。

我想强调,具有可复制的工作流程还不够,而且还易于复制工作流程。让我表明我的意思。假设您的项目使用Python,数据库X和Scipy。可以肯定的是,您将使用特定的库从Python连接到数据库,而Scipy将依次使用一些稀疏的代数例程。绝对是一种非常简单的设置,但并非完全简单。如果有人要执行您的脚本,那么她将必须安装所有依赖项。更糟糕的是,她可能已经安装了不兼容的版本。解决这些问题需要时间。如果您需要将计算移至群集,其他群集或某些云服务器,这也将花费您一些时间。

这是我发现docker有用的地方。Docker是一种形式化和编译二进制环境配方的方法。您可以在dockerfile中编写以下内容(我在这里使用的是普通英语,而不是Dockerfile语法):

  • 从基本的二进制环境开始,例如Ubuntu的
  • 安装libsparse-dev
  • (Pip)安装numpy和scipy
  • 安装X
  • 安装libX-dev
  • (Pip)安装python-X
  • 安装IPython笔记本
  • 将我的python脚本/笔记本复制到二进制环境,这些数据文件和这些配置中,以执行其他杂项操作。为了确保可复制性,请从命名的url(而不是本地文件)复制它们。
  • 也许运行IPython-Notebook。

有些行将使用pip在Python中安装东西,因为pip在选择特定的软件包版本时可以做得很干净。也检查一下!

就是这样。如果在创建Dockerfile之后可以构建它,那么任何人都可以在任何地方构建它(前提是他们也有权访问您的项目特定文件,例如,因为您将它们放在Dockerfile引用的公共URL中)。最好是,您可以将结果环境(称为“映像”)上载到公共或私有服务器(称为“注册”),以供其他人使用。因此,当您发布工作流程时,您既可以使用Dockerfile的形式完全可复制的配方,又可以方便您或其他人复制您所做的工作:

docker run dockerregistery.thewheezylab.org/nowyouwillbelieveme

或者,如果他们想在您的脚本中四处逛逛,等等:

docker run -i -t dockerregistery.thewheezylab.org/nowyouwillbelieveme /bin/bash

8

不幸的是,我没有足够的声誉积分来回答Plank的帖子,所以必须回答整个主题-对此感到抱歉。

我实际上是上述开放源代码集体知识框架的开发人员。它试图通过通过GitHub共享的统一JSON API和JSON meta简化作为可重用和可重现的Python组件的工件和实验工作流的共享。它们也可以使用相同的统一JSON API连接到预测分析。

我们刚刚发布了新版本V1.8.1,并提供了广泛的文档,因此希望现在可以更轻松地理解这些概念:http : //github.com/ctuning/ck/wiki

现在,我们有许多基于此框架的学术和工业项目,因此您可以检查其中之一-志愿者以可重复的方式跨移动设备进行众包计划优化:http : //cknowledge.org/repo

我们还在这里跟踪与可再生科学相关的各种资源:https : //github.com/ctuning/ck/wiki/Enabling-open-science

尽管我主要致力于使计算机系统的研究具有可重复性,但是我与来自其他领域的同事进行了有趣的聊天,似乎他们遇到了非常相似的问题。因此,如果我们的框架可以为其他社区提供任何帮助,我将非常高兴!如果您有任何疑问或建议,请随时与我们联系!


1
今年夏天关于可重复研究的摘要(包括与相关工具,数据集,文章和事件的链接)也可能引起关注:github.com/ctuning/ck/wiki/Enabling-open-science-blog-20160919
gfursin


6

我最近遇到了以下工具-http://github.com/ctuning/ck。它已经用Python编写,似乎包含了您所需要的东西(我的同事正在试验项目中使用它来自动进行图像识别)。

优点:

  1. 非常小巧,可移植且可定制
  2. 包括网络服务器以分发实验并使用预测分析进行处理
  3. 有一个很酷的用法示例,可以众包并复制编译器优化-http: //cknowledge.org/repo

缺点:

  1. 有点低级-您需要使用JSON API或命令行从通过GitHub共享的Python组件实现自己的工作流
  2. 文档有些复杂-我真的希望他们能有时间尽快对其进行更新。

6

我已经创建并最近发布了一个开源工具http://dvc.org或DVC,它完全可以实现您想要达到的目的:

  1. [用于数据版本控制的工具。] DVC在Git之上运行,添加数据文件版本控制(文件存储在Git外部),并跟踪代码和数据文件之间的依赖关系。DVC自动导出代码和数据的依赖关系图(DAG)。
  2. [能够重现阶段和实验的工具。] dvc repro data/scores.csv重现了有关DAG的所有必需步骤。
  3. [此项目的协议和建议的目录结构。] DVC需要一个数据目录(data默认情况下),您应该在其中存储所有数据文件。但是,DVC透明地将实际内容移动到.cache目录并创建符号链接(是的,我也使它在Windows上也可以使用)。该.cache目录未同步到Git,但可以通过命令通过云(S3或GCP)dvc sync data/scores.csv同步(它从缓存同步相应的数据文件,例如.cache/scores.csv_29de545
  4. [自动化的构建/运行工具。]从上面查看。

DVC教程是一个很好的起点- “数据版本控制:迭代式机器学习”


5

免责声明:我在Datmo公司工作,该公司创建了一个开源工具来实现这一目标。

再现性的最佳做法如下:

1)首先,通过创建Dockerfile并确保该文件包含所有依赖项,将您的环境容器化为Docker环境。我发现此资源是最好的(https://arxiv.org/pdf/1410.0846.pdf

2)一旦有了,便要决定在哪里可以跟踪所有性能指标和配置(以便您可以重新访问以进行将来的实验)

3)最后,编写一些文档,以便新的实验人员/开发人员能够重新访问您的代码,将其与环境一起复制,并查看将配置和性能指标保留在何处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.