“大多数数据科学课程不教的8个事项(但你应该知道)— 第1部分”

8 things most data science courses don't teach (but you should know) - Part 1

数据科学 101

MIT 称之为“你计算机科学教育中缺失的学期”

使用 Midjourney 创建

也许你之前听说过或者经历过数据科学的 80/20 法则:

数据科学家只有 20% 的时间用于分析,而大部分时间 — 80% 的时间 — 则用于数据准备。

我觉得在我的工作中,实际上可能是 90/10 的比例。这就是我的工作现实 — 我们处理一些非常复杂的数据集。

然而,大多数数据科学项目、训练营和课程并没有为此做好准备。

你可能已经学会了如何使用复杂的预测模型、对非结构化数据进行聚类和分析时间序列。没有这些知识,你就不是一名数据科学家。

但是你将不会将 80% 的时间用于使用这些技术。相反,你将会收集、移动和清理数据,建立数据库,管理远程计算环境,以及处理许多其他非分析性的任务。

问题在于不知道有哪些工具可以解决这些任务,会对你的工作效率和项目结果造成很大的影响。事实上,这是一个普遍存在的问题,MIT 专门开设了一门课程来填补这个空白 — 这门课程恰如其分地称为“你计算机科学教育中缺失的学期”。(这是一门很棒的课程,启发了我对这里涉及的一些主题的思考方式。)

本文是系列文章的开头,讨论我在 80% 时间段内学到的一些实用经验(大部分是在工作中学到的)。目标是探索存在的工具来处理这些任务,并分享一些我在职业生涯中学到的良好实践。

以下是我们将要涵盖的内容:

第一部分(本文):

  1. 熟练使用 Linux
  2. 能够有效使用远程计算系统
  3. 为每个项目使用单独的 Python 环境
  4. 了解如何调试和分析你的代码

第二部分(即将推出):

  1. 关注可重现性,帮助未来的自己
  2. 包括数据和模型在内的一切都进行版本管理
  3. 使用机器学习实验跟踪工具组织你的实验
  4. 测试和文档化你的代码

在以后的文章中,我将深入探讨每个主题。

1. 熟练使用 Linux

即使你的首选操作系统是 Windows,了解 Linux 的基本使用方法仍然非常有用。

像 AWS 和 GCP 这样的共享计算环境通常运行在 Linux 上。Linux 还带有 shell,这是一个强大的工具,可以帮助你用几个简单的命令解决许多任务。

以下是 Software Carpentry 关于 Linux 的基础知识的介绍,他们的工作坊通常从 shell 基础课程开始:

“Unix shell 已经存在的时间比大多数用户的年龄还要长。它之所以能够存活下来,是因为它是一个强大的工具,可以让用户执行复杂而强大的任务,通常只需要几个按键或几行代码。它可以帮助用户自动执行重复的任务,并将较小的任务轻松组合成更大、更强大的工作流程。使用 shell 对于各种高级计算任务至关重要,包括高性能计算。”

下面是一些基本的知识,这些都是我每天使用的工具,它们将帮助你成为一名高效的 Linux 用户。

  • 了解和遍历文件系统 —— 概念包括目录结构、主目录、文件和目录权限以及文件链接。
  • $PATH 变量和环境变量。
  • 如何列出正在运行的进程,并停止或终止一个进程。
  • 用于处理文件和目录的基本 shell 命令,如 cdlscatlessmkdirmvrmgrepfind
  • 将命令串联在一起并重定向命令输出。
  • 知道如何使用文本编辑器(如 nanovim)在终端中编辑文件。
  • 创建基本的 shell 脚本,以便你可以保存你的命令并轻松重新运行它们。

这可能看起来是一个要记住的长列表,但一旦你开始定期使用这些工具,它们将变得如同呼吸一般自然。

2. 能够有效地使用远程计算系统

像AWS、GCP和Azure这样的远程计算环境有两个主要的用途:它们为您提供了更多的计算资源,这些资源可能在本地不可用,并且它们允许您运行长时间的进程(如训练模型),而无需担心始终保持计算机的开启状态。

使用远程计算系统的一个流行、快速、简单的方法是在远程机器上运行Jupyter Notebook服务器。这种解决方案的缺点是Jupyter Notebook并不适用于运行长时间的进程。

如果你曾经因为暂时失去网络连接而丢失了一些结果,你就知道我在说什么。

幸运的是,Linux提供了一套用于运行长时间进程的工具。如果您已经在使用或计划使用远程计算系统,熟悉这些工具可以帮助您避免一些大麻烦。

在使用远程计算系统时,您将执行两个关键操作:

  • 通过ssh连接并使用像scprsync这样的工具来传输数据(rsync是一个重要的工具,因为它可以使用-P选项恢复中断的传输,对于大文件来说,这非常方便)。
  • 使用像nohupscreentmux这样的工具来管理长时间运行的进程,以便在与远程机器断开连接时进程不会结束。

有了这些工具,您应该能够像亲自在远程机器上运行进程一样。

3. 为每个项目使用单独的Python环境

我认为这是一个非常简单的想法,但根据我的经验,实践中却很少见。

数据科学家常犯的一个错误是根本不使用虚拟环境,或者为所有项目使用一个共享环境。

关于为什么应该使用Python虚拟环境已经有很多文章了,但简而言之,如果根本不使用虚拟环境,那么您所需的任何第三方库将直接安装到Python的系统安装中。这可能会影响到依赖Python的任何系统任务,在最坏的情况下,可能会破坏您的操作系统。

请为每个项目使用Python虚拟环境(venvcondapipenv,或者您喜欢的任何虚拟环境管理器),不管项目有多小。

可能很多项目共享相同的依赖库,即典型的数据科学Python堆栈。在这种情况下,共享一个环境可能看起来是个好主意。毕竟,这样可以节省时间和空间,对吗?

有许多原因为什么您不应该这样做。以下是其中一些主要原因:

  • 您可能会遇到不同项目之间的库版本问题。听说过“依赖地狱”吗?这可能看起来像是一个边缘情况,但实际上比您想象的更常见。
  • 很难确定哪些库是哪个项目所需的。如果您正在进行一项合作项目并需要与团队的其他成员共享您的环境,这可能会带来问题。

为每个项目维护一个单独的环境可能看起来有些繁琐,但现在有许多工具可以简化和无缝管理虚拟环境(我最喜欢的两个工具是virtualenvwrapperpipenv)。我强烈建议尝试不同的工具,看看哪一种最适合您的工作流程。

4. 知道如何调试和分析您的代码

事实上,没有人写出完美的代码。

有时候你可能会花几个小时检查代码的逻辑,因为它不按照你的意愿工作,只有才发现你不小心交换了变量或忘记了调用model.eval()。这对于任何以编写代码为生的人来说都是一种令人沮丧的现实。

事实上,没有人写出完美的代码。

面对奇怪的错误时,一个自然的第一步是使用一系列的打印语句和迭代测试代码。通常,这足以找出问题所在,但这并不总是一种不费力的解决方案(在旧代码中找到一个忘记删除的调试打印语句,有过这样的经历吗?)。

进入调试工具。

调试器可以让您逐步执行代码,并检查代码中每个变量的状态。它们实际上做的是您的打印语句所做的事情,但以系统化的方式,并且只需点击一下按钮。

您可以尝试很多调试器——Python的pdb、PyCharm调试器、Visual Studio Code调试器(我最喜欢的),以及其他很多选择。如果您每天都写代码,学会使用调试器可能是一个非常有用的时间投资,可以在长期内为您节省很多麻烦。

计时和分析您的代码

也许您的代码按预期工作,但运行时间较长或使用的资源较多。在我的编码过程中,我经常首先专注于只是确保有一个可行的解决方案,然后再考虑优化代码(当然,优化部分并不总是发生,但我希望LLMs最终能为我解决这个问题)。

这就是计时和分析的用处。两者都可以帮助您发现代码中的瓶颈和低效之处,只是使用了不同的方法。

计时简单地测量代码中两个点之间经过的时间。您可以使用它来测量某个函数运行的时间(Python的timeit模块有一些有用的示例)。

有不同种类的分析器,但它们都可以帮助您做同样的事情——简单地说,它们帮助您测量每个函数调用花费的时间。Python有一个内置的分析器cProfile,还有许多第三方选项,如Palanteer和Yappi。

无论您决定使用哪种分析器,如果您重新编写和优化代码,都应考虑向Python工具箱中添加一个分析器。

关于调试的说明

传统的代码调试器无法调试学习算法。也许您的模型无法收敛,或者表现得太好或太差。虽然您可以在回归模型或聚类算法上使用调试器,但除非您自己实现了它们,否则算法本身很可能没问题,问题可能出在其他地方——选择不正确的学习算法、数据不足、超参数不适当等等。

调试数据科学算法需要同时理解您的数据、对算法的工作原理有一些直觉,并且了解错误分析等技术。Andrew Ng在这个精彩的讲座中介绍了调试学习算法的技巧。如果您对这个主题有兴趣,欢迎在评论中告诉我,我可以写一篇单独的文章来介绍。

如果您已经读到这里,非常感谢您的阅读!希望您喜欢这篇文章。如果您希望在我发布新文章时收到通知,请考虑在此处订阅电子邮件通知。