我正在使用 Python 进行数据科学项目。该项目有几个阶段。每个阶段包括获取数据集、使用 Python 脚本、辅助数据、配置和参数,以及创建另一个数据集。我将代码存储在 git 中,因此涵盖了该部分。我想听听:
- 数据版本控制工具。
- 能够重现阶段和实验的工具。
- 此类项目的协议和建议的目录结构。
- 自动构建/运行工具。
我正在使用 Python 进行数据科学项目。该项目有几个阶段。每个阶段包括获取数据集、使用 Python 脚本、辅助数据、配置和参数,以及创建另一个数据集。我将代码存储在 git 中,因此涵盖了该部分。我想听听:
可重复性研究(RR)的主题在今天非常流行,因此规模很大,但我希望我的回答足够全面,并为进一步研究提供足够的信息,如果您决定这样做的话。
虽然用于 RR 的 Python 特定工具肯定存在,但我认为专注于更通用的工具更有意义(你永远不知道将来会使用哪些编程语言和计算环境)。话虽如此,让我们看一下您的列表中可用的工具。
1)数据版本控制工具。除非您打算使用(非常)大数据,否则我猜,使用相同的数据是有意义的git
,您将其用于源代码版本控制。基础设施已经存在。即使您的文件是二进制且很大,此建议也可能会有所帮助:https ://stackoverflow.com/questions/540535/managing-large-binary-files-with-git 。
2)用于管理 RR 工作流程和实验的工具。据我所知,这是该类别中最受欢迎的工具列表(按受欢迎程度的降序排列):
Taverna 工作流管理系统( http://www.taverna.org.uk ) - 非常可靠的工具集,如果有点过于复杂的话。主要工具是基于Java 的桌面软件。但是,它与在线工作流存储库门户myExperiment ( http://www.myexperiment.org ) 兼容,用户可以在其中存储和共享他们的 RR 工作流。与Taverna完全兼容的基于 Web 的 RR 门户称为Taverna Online,但它由俄罗斯完全不同的组织开发和维护(在此称为OnlineHPC:http ://onlinehpc.com )。
开普勒项目( https://kepler-project.org )
VisTrails ( http://vistrails.org )
马达加斯加( http://www.reproducibility.org )
示例。这是一篇关于科学工作流的有趣文章,其中包含基于使用Kepler和myExperiment项目的真实工作流设计和数据分析示例: http ://f1000research.com/articles/3-110/v1 。
有许多实现文学编程LaTeX
范式的 RR 工具,以软件系列为例。有助于报告生成和演示的工具也是一个很大的类别,其中Sweave
并且knitr
可能是最知名的工具。Sweave
是一个专注于 R 的工具,但它可以与基于 Python 的项目集成,尽管需要付出一些额外的努力(https://stackoverflow.com/questions/2161152/sweave-for-python)。我认为这knitr
可能是一个更好的选择,因为它很现代,得到了流行工具(例如RStudio
)的广泛支持,并且与语言无关(http://yihui.name/knitr/demo/engines)。
3)协议和建议的目录结构。如果我正确理解了您使用术语协议(工作流)所暗示的含义,通常我认为标准 RR 数据分析工作流由以下顺序阶段组成:数据收集=>数据准备(清理、转换、合并、采样)=>数据分析=>展示结果(生成报告和/或展示)。然而,每个工作流都是特定于项目的,因此,某些特定任务可能需要添加额外的步骤。
对于示例目录结构,您可以查看 R 包ProjectTemplate
( http://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 ),rake
(https://github.com/ruby/rake) , Makepp
( http://makepp.sourceforge.net)。有关此类工具的完整列表,请参阅 Wikipedia:http ://en.wikipedia.org/wiki/List_of_build_automation_software 。
自从我开始在学术界做研究以来,我一直在寻找令人满意的工作流程。我想我终于找到了令我满意的东西:
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
有关详细信息,请参阅此处的文档。
最好的重现性工具是记录您的操作,如下所示:
experiment/input ; expected ; observation/output ; current hypothesis and if supported or rejected
exp1 ; expected1 ; obs1 ; some fancy hypothesis, supported
这可以写在纸上,但是,如果您的实验适合计算框架,您可以使用计算工具部分或完全自动化该日志记录过程(特别是通过帮助您跟踪可能很大的输入数据集和输出数据)。
学习曲线低的 Python 的一个很好的可重复性工具当然是IPython/Jupyter Notebook(不要忘记%logon 和 %logstart魔法)。提示:为确保您的笔记本可重现,请重新启动内核并尝试从上到下运行所有单元(按钮运行所有单元):如果可以,则将所有内容保存在存档文件中(“冻结”),否则,特别是如果您需要以非线性、非顺序和不明显的方式运行单元格以避免错误,则需要进行一些返工。
最近(2015 年)的另一个很棒的工具是recipy,它非常像苏门答腊(见下文),但专门为 Python 制作。我不知道它是否适用于 Jupyter Notebooks,但我知道作者经常使用它们,所以我猜如果它目前不支持,将来会支持。
Git也很棒,而且它不依赖于 Python。它不仅可以帮助您保留所有实验、代码、数据集、数据等的历史记录,还可以为您提供维护 ( git pickaxe )、协作 ( blame ) 和调试 ( git - bisect ) 的工具,使用科学的调试方法(称为delta 调试)。这是一个虚构的研究人员试图制作自己的实验记录系统的故事,直到它最终成为 Git 的复制品。
另一个使用任何语言(在pypi上使用 Python API )的通用工具是Sumatra,它专门用于帮助您进行可复制研究(可复制旨在在完全相同的代码和软件的情况下产生相同的结果,而可再现性旨在产生给定任何介质的相同结果,这要困难得多、耗时且不可自动化)。
以下是 Sumatra 的工作原理:对于您通过 Sumatra 进行的每个实验,该软件的行为类似于电子游戏中常见的“保存游戏状态”。更准确地说,它将节省:
然后它将为您的每个实验构建一个包含时间戳和其他元数据的数据库,您以后可以使用 webGUI 抓取该数据库。由于 Sumatra 在某个特定时间点为特定实验保存了应用程序的完整状态,因此您可以随时恢复产生特定结果的代码,因此您可以以低成本进行可复制研究(如果存储除外,如果您处理庞大的数据集,但如果您不想每次都保存所有内容,则可以配置例外)。
另一个很棒的工具是GNOME 的 Zeitgeist(以前用 Python 编码,但现在移植到 Vala),一个全方位的行动日志系统,它记录你所做的一切,它可以使用机器学习来总结你想要基于项目之间的关系的时间段关于相似性和使用模式,例如回答诸如“去年一个月我从事项目 X 时,什么与我最相关?”之类的问题。. 有趣的是,Zim Desktop Wiki是一款类似于 Evernote 的笔记应用,有一个插件可以与 Zeitgeist 配合使用。
最后,您可以使用 Git 或 Sumatra 或您想要的任何其他软件,它们将为您提供大致相同的可复制能力,但 Sumatra 是专门为科学研究量身定制的,因此它提供了一些花哨的工具,例如用于抓取的 Web GUI你的结果,虽然 Git 更适合代码维护(但它有调试工具,如 git-bisect,所以如果你的实验涉及代码,它实际上可能会更好)。或者当然你可以同时使用!
/EDIT: dsign在这里触及了一个非常重要的点:设置的可复制性与应用程序的可复制性一样重要。换句话说,您至少应该提供您使用的库和编译器的完整列表,以及它们的确切版本和平台的详细信息。
就个人而言,在使用 Python 进行科学计算时,我发现将应用程序与库一起打包太痛苦了,因此我现在只使用一体化的科学 Python 包,例如Anaconda(带有出色的包管理器conda),并且只是建议用户使用相同的包。另一种解决方案可能是提供一个脚本来自动生成virtualenv ,或者使用 dsign或开源Vagrant引用的商业 Docker 应用程序打包所有内容(例如pylearn2-in-a-box,它使用 Vagrant 生成一个易于再分发的虚拟环境包)。
最后,为了真正确保您每次需要时都有一个完整的工作环境,您可以制作一个虚拟机(请参阅 VirtualBox),您甚至可以保存机器的状态(快照),并准备好在其中运行您的实验。然后,您可以共享此虚拟机及其包含的所有内容,以便任何人都可以使用您的确切设置复制您的实验。这可能是复制基于软件的实验的最佳方式。容器可能是一个更轻量级的替代方案,但它们不包括整个环境,因此复制保真度将不那么健壮。
/ EDIT2:这是一个很棒的视频总结(用于调试,但这也可以应用于研究)进行可重复研究的基础:记录您的实验和科学方法的其他步骤,一种“显式实验”。
一定要检查docker!总的来说,软件工程几十年来为确保隔离和可复制性而创造的所有其他好东西。
我想强调的是,仅仅拥有可重现的工作流程是不够的,还要易于重现工作流程。让我表明我的意思。假设您的项目使用 Python、数据库 X 和 Scipy。你肯定会使用一个特定的库从 Python 连接到你的数据库,而 Scipy 将反过来使用一些稀疏的代数例程。这绝对是一个非常简单的设置,但设置起来并不完全简单,双关语。如果有人想执行您的脚本,她将不得不安装所有依赖项。或者更糟的是,她可能已经安装了不兼容的版本。解决这些问题需要时间。如果您在某些时候需要将计算移动到集群、不同的集群或某些云服务器,这也需要时间。
这是我发现 docker 有用的地方。Docker 是一种形式化和编译二进制环境配方的方法。您可以在 dockerfile 中编写以下内容(我在这里使用纯英语而不是 Dockerfile 语法):
有些行将使用 pip 在 Python 中安装东西,因为 pip 可以在选择特定的包版本方面做得非常干净。也来看看吧!
就是这样。如果在您创建 Dockerfile 之后可以构建它,那么任何人都可以在任何地方构建它(前提是他们也可以访问您的项目特定文件,例如因为您将它们放在从 Dockerfile 引用的公共 url 中)。最好的是,您可以将生成的环境(称为“图像”)上传到公共或私有服务器(称为“注册”)以供其他人使用。因此,当您发布您的工作流程时,您既拥有 Dockerfile 形式的完全可重现的配方,也为您或其他人提供了一种简单的方法来重现您所做的事情:
docker run dockerregistery.thewheezylab.org/nowyouwillbelieveme
或者,如果他们想在您的脚本中四处寻找,等等:
docker run -i -t dockerregistery.thewheezylab.org/nowyouwillbelieveme /bin/bash