当我们有Jupyter笔记本的时候,谁还需要实验跟踪器?
现有的实验跟踪器的设置成本很高。为了让它工作,你通常必须启动一个数据库并运行一个网络应用程序。在尝试了多种选择之后,我认为使用Jupyter笔记本可能是一个很好的选择,可以存储实验结果并检索它们进行比较。这篇文章解释了我如何使用.ipynb文件来跟踪实验,而不需要任何额外的基础设施。
什么是实验追踪器?
机器学习是一个高度迭代的过程:你事先不知道模型、特征和超参数的哪种组合最有效,所以你需要稍作调整并评估性能。实验跟踪器帮助你记录和管理所有的实验。
然而,它们中的大多数都有相当大的维护成本:它们通常需要额外的基础设施,如数据库和网络应用程序来检索和比较实验。
虽然支付这个费用会给你带来很多好处,但我发现我很少使用一个实验跟踪器的最先进的功能。此外,我只需要比较我最近的几个实验,很少关心几天前的实验,所以我开始使用.ipynb文件来记录和比较实验,大大简化了我的工作流程。
笔记本文件的剖析
Jupyter笔记本(.ipynb)是JSON文件。一个空的笔记本看起来像这样。
这种预定义的结构允许Jupyter在一个文件中存储代码、输出和元数据。对于我们的用例,让我们专注于 "单元格 "部分。
"单元格 "包含一个字典列表(每个单元格一个),其中每个元素都有一个类型(笔记本支持不同类型的单元格,如代码或标记)和其他字段,取决于其类型。例如,代码单元包含源代码("source")和相关的输出,如果该单元已经执行。
为了简洁起见,我省略了关于格式的具体细节。然而,如果你感到好奇,可以查看nbformat包,它定义了Jupyter笔记本的JSON模式。
加载.ipynb文件
由于Jupyter笔记本有一个预定义的结构,我们可以解析它们来提取数据。例如,假设你已经训练了一个随机森林和一个神经网络 ( random_forest.ipynb 和 nn.ipynb) 来预测一个连续值,并且你要在其中一个单元格中打印均方误差。
medium.com/media/faec0…medium.com/media/f3a7e…
你可以在一个新的笔记本中加载这两个文件,并提取数值进行比较。
通过索引号访问单元格不是很好;最好是用一些有意义的名字来索引它们。幸运的是,Jupyter笔记本单元格支持标签。例如,在JupyterLab 3.0+中为单元格添加一个标签(关于在早期版本的JupyterLab或Jupyter笔记本应用程序上为单元格添加标签的细节,请点击这里)。
给Jupyter笔记本的单元格添加标签。图片由作者提供。
这将转化为一个.ipynb文件,看起来像这样。
我们可以通过引用mse标签,用更多的解析逻辑来访问我们的准确度指标,但正如我们将在接下来的章节中看到的,有一个库已经实现了这一点。
解析表格和图表
提取输出为纯文本的单元格是很直接的,但它有局限性,因为我们可能想比较输出为数据框或图表的单元格。.ipynb文件将表格存储为HTML字符串,将图像存储为base64字符串。sklearn-evaluation包实现了一个笔记本分析器来提取和比较多种类型的输出,我们所要做的就是给我们的单元格打上标签。
我们还可以同时加载多个笔记本。
sklearn-evaluation会根据单元格的输出自动生成比较视图。例如,如果它是一个字典。
sklearn-evaluation字典的比较视图。图片由作者提供。
一个表格。
sklearn-evaluation表的对比视图。图片由作者提供。
还有一个图表。
sklearn-评价图表比较视图。图片由作者提供。
使用单元格标签来识别输出使实验跟踪变得简单:不需要写任何额外的代码。相反,只需打印要检索的结果,并标记单元格。对于一个完整的例子,请点击这里。
sklearn-evaluation不是唯一的选择。Scrapbook开创了分析.ipynb文件的想法,它们之间的主要区别是sklearn-evaluation使用单元格标签,而scrapbook使用代码来存储数据。
并检索数据。
用papermill对笔记本进行参数化处理
我们演示了如何解析笔记本以检索其输出。现在让我们来讨论如何生成这样的笔记本。由于我们想比较多个实验,重复使用相同的代码并只改变其输入参数是有意义的。papermill允许我们这样做:我们可以创建一个_笔记本模板_,并以不同的设置执行它。
例如,假设你有一个train.ipynb笔记本,看起来像这样。
默认情况下,前面的片段会训练一个随机森林。然而,我们可以改变model_name和model_params来切换到一个不同的模型。我们甚至可以定义其他参数(例如,选择一个特征子集、行子集等)来进一步定制我们的训练笔记本。当使用papermill时,我们可以很容易地添加一个新的单元来覆盖默认值。
笔记本参数化允许我们用不同的值使用我们的模板,并使用相同的代码生成多个笔记本文件。下面的片段显示了如何运行我们的实验。
当执行完成后,我们会有。
- random_forest.ipynb
- neural_network.ipynb
然后我们就可以用sklearn-evaluation或scrapbook来分析结果了。
用Ploomber将笔记本参数化
另外,我们可以使用Ploomber,它允许我们通过写一个pipeline.yaml文件来创建管道。 papermill的例子在Ploomber中看起来是这样的。
为了运行所有的实验,我们在终端执行以下内容。
使用Ploomber有很多好处:它可以并行运行笔记本;它允许我们使用脚本作为输入格式(即来源:train.py),为我们执行转换和执行到.ipynb;甚至在云中运行笔记本
生成模型比较报告
我正在做一个项目,我们经常对一个正在生产的模型进行改进。虽然我们的测试套件会自动检查候选模型的性能,但我们仍然手动审查指标,因为我们可能会发现测试套件中尚未实现的错误。每当我们有了一个候选模型,我们就把它与生产中的模型的指标进行比较。由于每个模型实验都会产生一个格式相同的.ipynb文件,我们加载这两个文件(比如候选.ipynb,和生产.ipynb),并使用另一个笔记本模板生成一个评估报告。代码看起来像这样。
模型比较报告允许我们快速对比参数、表格和图表;我们可以很容易地发现自动测试难以发现的性能差异。例如,这个报告曾经使我们免于部署一个在损坏的数据上训练的模型。
结束语
实验跟踪器有很大的设置成本:安装一个单独的软件包,启动一个数据库,并运行一个网络应用程序。虽然它们提供了很多功能,但我发现,为每个实验生成.ipynb文件,然后比较它们的输出就足够了。
这种方法不需要任何额外的基础设施;此外,它允许我快速分享我的发现,并且不需要额外的代码来记录实验,使其成为比较机器学习实验的一种直接而强大的方法。
如果你喜欢我的工作,请考虑在GitHub上用一颗星来表示你的支持。另外,如果你有任何问题,欢迎加入我们的社区并与我们分享。
原文发表于 ploomber.io
笔记本元分析。Jupyter作为实验跟踪器的零基础设施替代品最初发表于Towards Data Scienceon Medium,人们通过强调和回应这个故事来继续对话。