笔记本元分析:Jupyter 作为实验跟踪器的零基础设施替代品

286 阅读7分钟

当我们有Jupyter笔记本的时候,谁还需要实验跟踪器?

现有的实验跟踪器的设置成本很高。为了让它工作,你通常必须启动一个数据库并运行一个网络应用程序。在尝试了多种选择之后,我认为使用Jupyter笔记本可能是一个很好的选择,可以存储实验结果并检索它们进行比较。这篇文章解释了我如何使用.ipynb文件来跟踪实验,而不需要任何额外的基础设施。

什么是实验追踪器?

机器学习是一个高度迭代的过程:你事先不知道模型、特征和超参数的哪种组合最有效,所以你需要稍作调整并评估性能。实验跟踪器帮助你记录和管理所有的实验。

然而,它们中的大多数都有相当大的维护成本:它们通常需要额外的基础设施,如数据库和网络应用程序来检索和比较实验。

虽然支付这个费用会给你带来很多好处,但我发现我很少使用一个实验跟踪器的最先进的功能。此外,我只需要比较我最近的几个实验,很少关心几天前的实验,所以我开始使用.ipynb文件来记录和比较实验,大大简化了我的工作流程。

笔记本文件的剖析

Jupyter笔记本(.ipynb)是JSON文件。一个空的笔记本看起来像这样。

medium.com/media/083df…

这种预定义的结构允许Jupyter在一个文件中存储代码、输出和元数据。对于我们的用例,让我们专注于 "单元格 "部分。

medium.com/media/709bf…

"单元格 "包含一个字典列表(每个单元格一个),其中每个元素都有一个类型(笔记本支持不同类型的单元格,如代码或标记)和其他字段,取决于其类型。例如,代码单元包含源代码("source")和相关的输出,如果该单元已经执行。

medium.com/media/a0f1b…

为了简洁起见,我省略了关于格式的具体细节。然而,如果你感到好奇,可以查看nbformat包,它定义了Jupyter笔记本的JSON模式。

加载.ipynb文件

由于Jupyter笔记本有一个预定义的结构,我们可以解析它们来提取数据。例如,假设你已经训练了一个随机森林和一个神经网络 ( random_forest.ipynb 和 nn.ipynb) 来预测一个连续值,并且你要在其中一个单元格中打印均方误差。

medium.com/media/faec0…medium.com/media/f3a7e…

你可以在一个新的笔记本中加载这两个文件,并提取数值进行比较。

medium.com/media/ae71b…

通过索引号访问单元格不是很好;最好是用一些有意义的名字来索引它们。幸运的是,Jupyter笔记本单元格支持标签。例如,在JupyterLab 3.0+中为单元格添加一个标签(关于在早期版本的JupyterLab或Jupyter笔记本应用程序上为单元格添加标签的细节,请点击这里)。

给Jupyter笔记本的单元格添加标签。图片由作者提供。

这将转化为一个.ipynb文件,看起来像这样。

medium.com/media/0e264…

我们可以通过引用mse标签,用更多的解析逻辑来访问我们的准确度指标,但正如我们将在接下来的章节中看到的,有一个库已经实现了这一点。

解析表格和图表

提取输出为纯文本的单元格是很直接的,但它有局限性,因为我们可能想比较输出为数据框或图表的单元格。.ipynb文件将表格存储为HTML字符串,将图像存储为base64字符串。sklearn-evaluation包实现了一个笔记本分析器来提取和比较多种类型的输出,我们所要做的就是给我们的单元格打上标签。

medium.com/media/3e134…

我们还可以同时加载多个笔记本。

medium.com/media/9b3bb…

sklearn-evaluation会根据单元格的输出自动生成比较视图。例如,如果它是一个字典。

sklearn-evaluation字典的比较视图。图片由作者提供。

一个表格。

sklearn-evaluation表的对比视图。图片由作者提供。

还有一个图表。

sklearn-评价图表比较视图。图片由作者提供。

使用单元格标签来识别输出使实验跟踪变得简单:不需要写任何额外的代码。相反,只需打印要检索的结果,并标记单元格。对于一个完整的例子,请点击这里

sklearn-evaluation不是唯一的选择。Scrapbook开创了分析.ipynb文件的想法,它们之间的主要区别是sklearn-evaluation使用单元格标签,而scrapbook使用代码来存储数据。

medium.com/media/a0689…

并检索数据。

medium.com/media/41045…

用papermill对笔记本进行参数化处理

我们演示了如何解析笔记本以检索其输出。现在让我们来讨论如何生成这样的笔记本。由于我们想比较多个实验,重复使用相同的代码并只改变其输入参数是有意义的。papermill允许我们这样做:我们可以创建一个_笔记本模板_,并以不同的设置执行它。

例如,假设你有一个train.ipynb笔记本,看起来像这样。

medium.com/media/d2fc1…

默认情况下,前面的片段会训练一个随机森林。然而,我们可以改变model_name和model_params来切换到一个不同的模型。我们甚至可以定义其他参数(例如,选择一个特征子集、行子集等)来进一步定制我们的训练笔记本。当使用papermill时,我们可以很容易地添加一个新的单元来覆盖默认值。

medium.com/media/ea902…

笔记本参数化允许我们用不同的值使用我们的模板,并使用相同的代码生成多个笔记本文件。下面的片段显示了如何运行我们的实验。

medium.com/media/50685…

当执行完成后,我们会有。

  1. random_forest.ipynb
  2. neural_network.ipynb

然后我们就可以用sklearn-evaluationscrapbook来分析结果了。

用Ploomber将笔记本参数化

另外,我们可以使用Ploomber,它允许我们通过写一个pipeline.yaml文件来创建管道。 papermill的例子在Ploomber中看起来是这样的。

medium.com/media/4e6a3…

为了运行所有的实验,我们在终端执行以下内容。

medium.com/media/6b265…

使用Ploomber有很多好处:它可以并行运行笔记本;它允许我们使用脚本作为输入格式(即来源:train.py),为我们执行转换和执行到.ipynb;甚至在云中运行笔记本

生成模型比较报告

我正在做一个项目,我们经常对一个正在生产的模型进行改进。虽然我们的测试套件会自动检查候选模型的性能,但我们仍然手动审查指标,因为我们可能会发现测试套件中尚未实现的错误。每当我们有了一个候选模型,我们就把它与生产中的模型的指标进行比较。由于每个模型实验都会产生一个格式相同的.ipynb文件,我们加载这两个文件(比如候选.ipynb,和生产.ipynb),并使用另一个笔记本模板生成一个评估报告。代码看起来像这样。

medium.com/media/27dd3…

模型比较报告允许我们快速对比参数、表格和图表;我们可以很容易地发现自动测试难以发现的性能差异。例如,这个报告曾经使我们免于部署一个在损坏的数据上训练的模型。

结束语

实验跟踪器有很大的设置成本:安装一个单独的软件包,启动一个数据库,并运行一个网络应用程序。虽然它们提供了很多功能,但我发现,为每个实验生成.ipynb文件,然后比较它们的输出就足够了。

这种方法不需要任何额外的基础设施;此外,它允许我快速分享我的发现,并且不需要额外的代码来记录实验,使其成为比较机器学习实验的一种直接而强大的方法。

如果你喜欢我的工作,请考虑在GitHub上用一颗星来表示你的支持。另外,如果你有任何问题,欢迎加入我们的社区并与我们分享。

原文发表于 ploomber.io


笔记本元分析。Jupyter作为实验跟踪器的零基础设施替代品最初发表于Towards Data Scienceon Medium,人们通过强调和回应这个故事来继续对话。