在科学上,再现的定义是"当一个实验重复时所获得的一致结果的程度"。数据是可以更改的,特别是数据库中保存的数据。此外,数据科学很大程度上是基于随机抽样、概率和实验的。因此,在这个领域中,模型的结果和输出可以由同事或你自己在将来的某个时间点复制,生成分析和构建这种模型是非常具有挑战性的。
尽管获取数据比较困难,但是有很多原因可以解释为什么再现性对于好的数据科学来说是至关重要的。
- 再现性支持合作。数据科学项目很少是单独进行的。在大多数情况下,数据科学家与其他数据科学家和其他团队一起工作,查看项目的全过程,并将其集成到业务流程中。为了有效地协作,其他人能够重复、构建和维护你的工作是很重要的。
- 再现性也支持效率。为了能够最有效地工作,你和你的同事能够在你所完成的工作的基础上继续努力是很重要的。如果结果或过程不能精确地重复,那么就很难在现有工作的基础上进行开发,相反,你将发现必须重新开始一个项目。
- 再现性构建信任。如前所述,数据科学是一门建立在概率和实验基础上的学科。在这个领域中,对结果的信任是非常重要的,这样才能开发项目的买进,并与其他团队有效地合作。
在下一篇文章中,我将分享5个工具,以促进数据科学的再现性。这些工具提供的函数,以解决特定的挑战,创建可复制的数据科学项目,这些包括:
- 记录项目中使用的工具、库和版本。
- 为数据科学项目创建自包含的、一致的环境。
- 开发一致的、易于阅读的文件结构。
- 为代码编写测试。
- 使用版本控制。
Watermark
Watermark是一个IPython神奇的扩展,它可以在任何IPython Shell或Jupyter笔记本会话中打印有关软件版本、硬件、日期和时间的信息。
Watermark提供了一种非常快速和简单的方法来跟踪项目中涉及的工具、库、版本、作者和日期。它特别适用于临时或一次性的工作,而不是只在笔记本上进行的大型项目。这意味着,如果一个同事想要重复一项工作,他们就会对需要安装的工具和库有一个很好的概念,知道谁创建了这项工作,以及何时将它放在一起。
要安装Watermark运行下列在你的终端。
pip install watermark
要在Jupyter笔记本或IPython shell中使用扩展,请运行以下命令。
% load_extWatermark
你可以通过指定许多标志来选择打印的信息。可用标志的完整列表在文档中列出。但是下面的代码打印了当前日期、我使用的python和IPython的版本、我安装和导入的库的版本以及关于我使用的硬件的信息。输出如下面的代码所示。
%watermark -d -m -v -p numpy,matplotlib,sklearn,seaborn,pandas
Pipenv
在数据科学中,项目创建的环境(即安装的工具、库和版本)对复制相同的结果有很大的影响,而且在许多情况下可以在另一台计算机上运行代码。
虚拟环境是为单个项目提供包含环境的工具。这些环境包含一个通常称为需求文件的文件,该文件列出了项目的依赖项(工具、库和版本)。创建虚拟环境时,可以选择从该文件中安装所有依赖项,从而重现项目最初创建时所在的环境。
创建虚拟环境的工具有很多,但是如果你使用python,那么pipenv是最好的工具之一。
要安装pipenv,请运行以下步骤。
$ brew install pipenv
使用特定版本的python创建新环境。创建一个新目录,然后从新目录运行以下命令。
mkdir pip-test
cd pip-test
pipenv --python 3.7
要激活运行pipenv-shell的环境,你现在将处于一个名为"pip-test"的新环境中。
如果我们检查目录的内容,我们将看到pipenv创建了一个名为Pipfile的新文件。这是pipenv等效的需求文件。
ls
让我们检查一下这个文件的内容。如有必要,将"Sublime Text"作为你首选的文本编辑器。
open -a "Sublime Text" Pipfile
新文件包含以下内容。
我们目前没有在环境中安装任何包,但如果我们安装了,我们会在这个文件中看到它们。让我们安装panda来测试这个。
pipenv install pandas
如果我们再次打开该文件,我们可以看到panda现在已经被添加到Pipfile中。
现在让我们假设一位同事想在另一台计算机上完成你的项目。如果他们从Github克隆你的repo, Pipfile会包含在其中。然后,它们可以简单地通过运行以下命令重新创建你一直使用的环境。
pipenv install --dev
pipenv shell
这将在你工作的目录中创建一个pipenv环境,并从pip文件安装所有依赖项。
如果你想在一个Jupyter笔记本会话中使用这个环境,那么你需要运行这段代码。你可以更改名称并将其显示为对你的环境有意义的名称。当你开始一个木星笔记本会话时,它现在会作为一个图标出现在启动屏幕上(如下面的代码所示)。使用该内核创建的任何新笔记本都将包含pipenv环境中的所有依赖项。
python -m ipykernel install --user --name myenv --display-name "Python (pipenv test)"
Cookiecutter
为数据科学定义一致的项目结构可以使协作、共享和构建项目变得更加容易。数据科学是一种工具,它在一行代码中创建一个标准的项目框架结构。
要安装,请运行以下命令。
pip install cookiecutter
要创建一个新项目,只需运行即可。
cookiecutter https://github.com/drivendata/cookiecutter-data-science
该工具将提示你输入许多详细信息,其中许多是可选的。
现在已经创建了下面的项目结构,这对于大多数数据科学项目来说已经足够了。
Pytest
Pytest是对python代码进行单元测试的工具。单元测试是一种可重复的操作,你可以将其添加到代码中,以检查各个代码单元是否按预期工作。单元测试是向编写的代码添加信任的良好实践。
Pytest可以安装和导入,如下所示。
pipenv install pytest
import pytest
一个简单的测试可能是检查导入的数据是否没有更改。
import pandas as pd
from sklearn.datasets import load_boston
boston = load_boston()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
len(boston_df)
assert len(boston_df) == 506
你可以向语句中添加一个有用的错误消息,以便更容易地调试代码。
assert len(boston_df) == 506, "Len(df) should be 506"
如果我们随后更改数据,则会显示错误消息。
import pandas as pd
from sklearn.datasets import load_wine
boston = load_wine()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
len(boston_df)
assert len(boston_df) == 506, "len(df) should be 506"
Github
版本控制是开发可重复项目、共享工作和促进协作的重要工具。维护项目的远程和本地版本允许其他人访问和开发他们自己的本地版本,回滚和监视代码更改,并安全地合并更改和新特性。
Github是版本控制中最著名和使用最广泛的平台之一。Github使用一个名为Git的应用程序来对代码进行版本控制。项目的文件存储在称为存储库的中央远程位置。每次你在本地机器上进行更改并推送到Github时,你的远程版本都会更新,并记录提交的存储。如果你想在提交之前回滚到项目的前一个版本,那么这个记录允许你这样做。
此外,由于项目文件是远程存储的,任何具有访问权限的人都可以下载repo并对项目进行更改。分支的概念,本质上意味着你创建一个完全独立的项目的临时副本,意味着你可以先在那里进行更改而不用担心破坏任何东西。
与传统的软件开发不同,目前在数据科学项目中只有很少的标准实践。然而,上面描述的工具在创建标准实践方面走了很长的路,这些标准实践反过来将导致更多可再现的数据科学项目。