我正在使用Python进行数据科学项目。该项目分为几个阶段。每个阶段包括使用Python脚本获取数据集,辅助数据,配置和参数,以及创建另一个数据集。我将代码存储在git中,以便覆盖该部分。我想听听:
- 数据版本控制工具。
- 能够重现阶段和实验的工具。
- 此类项目的协议和建议的目录结构。
- 自动化的构建/运行工具。
我正在使用Python进行数据科学项目。该项目分为几个阶段。每个阶段包括使用Python脚本获取数据集,辅助数据,配置和参数,以及创建另一个数据集。我将代码存储在git中,以便覆盖该部分。我想听听:
Answers:
的主题重复性研究(RR)是非常流行的今天,因此,是巨大的,但我希望我的回答将是不够全面的答案,将用于提供足够的信息进一步的研究,你应该决定这样做。
尽管确实存在针对RR的特定于Python的工具,但我认为专注于更通用的工具更有意义(您永远无法确定将来将使用哪种编程语言和计算环境)。话虽如此,让我们看一下每个列表中可用的工具。
1)数据版本控制工具。我猜除非您打算使用(非常)大数据,否则git
使用用于源代码版本控制的same会很有意义。基础结构已经存在。即使您的文件是二进制文件又很大,此建议也可能会有所帮助: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)
例子。这是一篇有关科学工作流的有趣文章,其中以使用Kepler和myExperiment项目为基础,提供了实际工作流设计和数据分析的示例:http : //f1000research.com/articles/3-110/v1。
有许多RR工具可以实现识字编程范例,以LaTeX
软件系列为例。工具在生成报告和演示帮助也是一个大的类别,其中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
这可以写在纸上,但是,如果您的实验适合计算框架,则可以使用计算工具来部分或完全自动化该日志记录过程(特别是通过帮助您跟踪可能庞大的输入数据集和输出)图)。
当然,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:这是一个很棒的视频摘要(用于调试,但也可以用于研究),这是进行可重复研究的基础:记录实验以及科学方法的其他步骤,这是一种“显式实验”。
一定要签出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
不幸的是,我没有足够的声誉积分来回答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
尽管我主要致力于使计算机系统的研究具有可重复性,但是我与来自其他领域的同事进行了有趣的聊天,似乎他们遇到了非常相似的问题。因此,如果我们的框架可以为其他社区提供任何帮助,我将非常高兴!如果您有任何疑问或建议,请随时与我们联系!
有整个课程致力于可重复的研究。 https://www.coursera.org/learn/reproducible-research 该课程基于R,但是可以学习基础思想。
一种简单的方法是拥有一个Ipython笔记本,并保存您所做的所有脏活,无论是清理数据,探索性分析还是构建模型。
我最近遇到了以下工具-http://github.com/ctuning/ck。它已经用Python编写,似乎包含了您所需要的东西(我的同事正在试验项目中使用它来自动进行图像识别)。
优点:
缺点:
我已经创建并最近发布了一个开源工具http://dvc.org或DVC,它完全可以实现您想要达到的目的:
dvc repro data/scores.csv
重现了有关DAG的所有必需步骤。data
默认情况下),您应该在其中存储所有数据文件。但是,DVC透明地将实际内容移动到.cache
目录并创建符号链接(是的,我也使它在Windows上也可以使用)。该.cache
目录未同步到Git,但可以通过命令通过云(S3或GCP)dvc sync data/scores.csv
同步(它从缓存同步相应的数据文件,例如.cache/scores.csv_29de545
)DVC教程是一个很好的起点- “数据版本控制:迭代式机器学习”。
免责声明:我在Datmo公司工作,该公司创建了一个开源工具来实现这一目标。
再现性的最佳做法如下:
1)首先,通过创建Dockerfile并确保该文件包含所有依赖项,将您的环境容器化为Docker环境。我发现此资源是最好的(https://arxiv.org/pdf/1410.0846.pdf)
2)一旦有了,便要决定在哪里可以跟踪所有性能指标和配置(以便您可以重新访问以进行将来的实验)
3)最后,编写一些文档,以便新的实验人员/开发人员能够重新访问您的代码,将其与环境一起复制,并查看将配置和性能指标保留在何处。