Clément Walter作者Nurhachu Null 张倩编译

Jupyter可能并非理想的Notebook

Jupyter 是一款免费、开源的交互式 web 工具,在数据科学家中备受欢迎。但本文作者却对这一工具存在很多不满,认为其不是理想的 Notebook。

据报道,Jupyter notebook 是数据科学家首选的实战工具。本文展示了从 EDA(探索性数据分析)到API 的快节奏,并没有Jupyter。

Jupyter的主要特点是:

  • 行内代码执行

  • 简单的构思结构

  • 对图片和数据帧的良好展示

与更加质朴的 iPython 命令行相比,这种整体的灵活性让它成为了一款首选工具。但是,值得记住的是,这不过是一款 REPL(读取-求值-输出-循环),你可以在整个历史记录中有效地导航。因此,这并不是一款生产工具。

但是,很多机器学习开发者在生产中都经历过把一个深度学习 notebook 重构成一个实际算法时深深的痛苦(reddit 和 Stack Overflow 上也有类似的讨论)。

保持精益生产的思想,我们应该努力减少浪费。

简介

在 Sicara,我们为客户构建基于机器学习的产品。

  • 机器学习:客户带来了业务需求,我们必须尽快提供令人满意的算法;

  • 我们构建的产品:我们需要以一种生产就绪的思想来开发产品。算法被部署在云端,以 API 等多种形式进行服务和更新。

首先,你肯定需要一个版本控制工具,这对 Jupyter 来说是一种痛苦(在 Reddit 和 quora 上也有相关讨论)。不仅仅是针对你的代码,还有你的实验。你需要有十足的把握能够重新运行目前得到的所有结果。结果无法复现对于数据科学家来说多么常见?

此外,使用 notebook 的人往往容易混淆下面三种用途:

  1. 开发:定义一些实用的方法和工具;

  2. 调试/应用:用真实的数据运行一段代码,看看会发生什么;

  3. 可视化:以一种整洁、可复现的输出来呈现结果。

为了减少浪费,应该明确地定义和分离这些步骤,以便可以在改变一个步骤的时候不会改变其他步骤,反之亦然。我得到的结论是:

  • 为了产生高质量的测试代码,应该使用一流的 IDE

  • 为了调试代码,应该使用可视调试工具

  • 为了写报告,我对表达性标记语言更为满意(如 markdown、reST 及 LaTeX)

幸运的是,一个配置得当的IDE可以完成所有的事情。例如,如果你来自于R社区的话,你肯定会使用RStudio,它允许你进行这些工作:

  • 本机代码完成、自动修复等等。

  • 直接的可视调试

  • 使用 Rmarkdown/knitr/Sweave 来生成好看的动态报告。

开发出生产就绪的代码

只要你想做一个实验,也就是说,写一个可以在你的数据上有所作为的方法,你就应该思考一下用法、极限案例等等。在一个单独的文件、文档和单元测试中来做。这样可以确保:

  • 使用你的方法可以达到你的目的;

  • 你的代码可以安全地用在项目中的其他地方。

因为你必须组织你的工具,所以这会让你思考流程的结构、你所需要的东西、你最可能改变的东西等等。Python 和 R 都支持这种快速测试。最好花十分钟时间写一下那些需要十小时调试错误输出的极限案例。

为了清楚起见,单元测试绝不能与定义方法的文件存在于同一个文件夹中。但是使用Jupyter 的话,这点就无法避免了。

调试和显示

在这一步,你有了全新的功能代码。是时候在实际的数据上试一试了!这是notebook非常方便的所在了,因其存在单元格机制(cell mechanism)。但这显然是一次工具切换。你为什么要放弃具有所有快捷键和舒适度的IED,去在web浏览器上运行代码呢?你所需要的是将你的代码直接在 IDE 中行内执行( inline execution)。

像pycharm这样的工具就有对这个功能的原生支持:使用一个键盘快捷键就能够执行选定的代码或脚本(在控制台中选择执行或者执行块)。此外,它的控制台中运行着iPython,还具有很好的变量工具窗口。在科学模式下,你还可以在IDE中显示和改变图像、数据/数组。或者你还可以使用像VSCode或者Atom with Hydrogen这些具备这种功能的工具。

汇报和分享

这里你应该已经在项目路径下有了测试代码,并在数据上运行一个纯Python文件。

|-- project
     |-- notebooks
           |-- data_analysis.py
     |-- tests
           |-- do_something_test.py
     |-- utils
           |-- do_something.py

你已经将代码在你的IDE中内联地运行了并检查了结果,非常棒!你的工作基本已经完成了:现在需要向团队做汇报了,以证明将你的算法移植到新的版本中的合理性,或者也许你将要写一篇论文投稿到下一届的NeurIPS会议上。

你需要解释你的逻辑,并逐步证明你的结果。当然你不想在另一个文件中重新输入所有的内容,这太无聊了。

这就是存在用于文学式编程(literate programming)的工具的原因了。像Sphinx这类文档工具就是以这种思路构建的:将你的代码和文档写进同一个文件中,并从中生成一个可读版本。

对于你的 Python notebook,我建议你使用 Pweave。这是我发现的目前为止最好用的 knitr 搬运包。也是一个完全支持 Python cell(或者Python和R的混合)的Rmarkdown。

在任何情况下,我发现使用 Pweave 的 pypublish 命令是最有效的。仅仅需要在你的脚本上写下注释并运行:

pypublish data_analysis.py

从中生成一个清晰的可分享HTML。每一个注释行都是markdown解释的,每个cell(或者代码块)都可以被显示或者被隐藏。

例如,用这个notebook运行 pypublish(注意特殊的注释标记#'、#+以及# %%)。

# %% # This is the title of the notebook
#+ setup, echo=False
import pandas as pd
df = pd.DataFrame({'a': list(range(4))})
#' Let us see what a plot looks like
#+ plot_df, echo=False
df.plot.bar()
#' Let us make now some visible computation
#+ echo=True
a = 1
print(a)
#' Also it is possible to use variable in context: a is <% a %>
#+ echo=True
a = 2
#' a is now <% a %>

生成如下报告:

我推荐在PyCharm中设置一个外部工具来一键发布notebook,配置如下(如有必要,请注意添加环境变量的技巧):
Pweave作为外部工具配置

结论

这不是另一篇《为啥Jupyter notebook糟糕极了》(Why Jupyter notebooks suck )的文章。我对这个流行工具并无任何个人偏见,只是希望分享一些我在使用过程中的个人体验。尤其是身处一个生产驱动的环境中,我已经进入了另一个工作流程。你怎么看呢?

工程Jupyter NotebookJupyter
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

数据分析技术

数据分析是一类统计方法,其主要特点是多维性和描述性。有些几何方法有助于揭示不同的数据之间存在的关系,并绘制出统计信息图,以更简洁的解释这些数据中包含的主要信息。其他一些用于收集数据,以便弄清哪些是同质的,从而更好地了解数据。 数据分析可以处理大量数据,并确定这些数据最有用的部分。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

重构技术

代码重构(英语:Code refactoring)指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

Jupyter技术

Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等 。

推荐文章
暂无评论
暂无评论~