假设作为数据科学家的您正在与其他几个人(可能是数据科学家、软件工程师等)一起开发一个项目。 您如何处理修改相同的代码文件? 测试新功能或建模技术开发得怎么样? 跟踪这些实验或恢复更改的最佳方法是什么? 很多时候,数据科学家会使用 Jupyter Notebook(一种用于在单一集成环境中编写代码并查看其结果的软件工具)等工具。 由于 Jupyter Notebook 允许轻松查看代码结果(例如显示图表或其它视觉效果),因此它是数据科学家的流行工具。
即使您对软件工程工作的直接参与有限,应用软件工程原理,例如减少冗余、使代码更具可读性或使用面向对象编程(我们将在稍后介绍的主题),也可以极大地改善您的工作流程。 这些原则使您的代码更易于维护和理解(特别是如果您在编写代码后过了很长时间后再查看它)。
此外,当涉及到让其他人使用您的代码或模型时,能够将您的代码传递给其他人(例如其它软件工程师,甚至其他数据科学家)可能非常重要。 混乱的代码分布在 Jupyter Notebook 文件中,或者分散在多种编程语言或工具中,使得将代码库转移给其他人会更加痛苦和令人沮丧。 为了将数据科学家的代码重写为更具可读性、可维护性并且能够投入生产的代码,还可能花费更多的时间和资源。 拥有像软件工程师一样思考的更强能力可以极大地帮助数据科学家最大限度地减少这些挫折。
图1中的图表显示了一个代码库示例,其中数据科学家的代码可能分散在多个Notebook中,并且可能采用多种语言。 缺乏内聚的结构使得将代码(例如模型)集成到另一个代码库中变得更加困难。
如图 1所示,对于数据科学家来说,他们的代码库的状态通常是分散的文件集合。 这些可能跨多种语言,例如 Python 或 R。每个文件中的代码也可能没有什么结构,形成通常所说的意大利面条代码。
接下来,让我们深入探讨数据科学家需要了解的软件工程知识。
关于软件工程,数据科学家需要了解什么?
在我们进一步讨论之前,简要定义“软件工程”可能会有所帮助。 软件工程是应用工程原理来开发软件应用程序。 就像土木工程师帮助确保桥梁或其他结构的可靠性和有效性一样,软件工程师开发可靠、可扩展且高效的应用程序。 应用于数据科学的软件工程的一些关键原则如下:
接下来让我们简要讨论一下数据科学和软件工程的交叉点。
Josh Wills(Slack 前数据工程总监)曾经说过,要成为一名数据科学家,你需要比软件工程师更擅长统计,比统计学家更擅长软件工程。 有一点是肯定的——多年来,数据科学家应具备的技能已经大大提高。 随着技术和业务需求的发展,需要这种更强大的技能。 例如,如果没有互联网,就无法向用户推荐帖子或视频。 Facebook、TikTok、Spotify 等平台也受益于现代先进的技术和硬件,使它们能够在相对较短的时间内处理和训练海量数据集的模型。 如今,预测客户流失或潜在欺诈等模型更加普遍,因为收集的数据越来越多,越来越多的公司希望数据科学家为这些问题提供解决方案。
此外,如果您现在正在面试数据科学家职位,您很可能会遇到有关编程、部署模型和模型监控的问题。 除了对更传统的统计和机器学习问题进行测试之外,还进行了这些测试。 这使得面试过程更具挑战性,但也为那些精通数据科学和软件工程的人创造了更多机会。 数据科学家在日常工作中需要对软件工程的多个领域有扎实的了解。 例如,软件工程发挥作用的一个关键领域是近似(around). 到目前为止,我们提到的实施示例模型,例如推荐系统、客户流失预测或欺诈模型,都需要投入生产才能提供价值。 否则,这些模型只是存在于数据科学家的代码文件中,永远不会对新数据进行预测。
接下来,让我们看一下数据科学家工作中常见问题的几个例子,软件工程可以在这些问题上提供帮助!
让我们来看看数据科学家的一些现实生活场景。 这些场景将突出数据科学家在工作中面临的几个关键问题。 解决这些问题的动机是为了说明整合软件工程知识的有用性,我们将在本章中进一步介绍这些知识。
更好的结构化代码我们在本章前面已经介绍过这一点,因此我们将简单地重申一下,改进代码结构可以在几个关键方面发挥很大作用,包括与其他人共享代码以及将代码集成到其他应用程序中。
改善编码协作
扩展之前的场景,与其他人在同一代码库上进行协作对于几乎所有数据科学组织或团队都至关重要。 通过应用软件工程原理,您可以跟踪代码更改、恢复到以前的代码文件版本、源代码控制,并且(重要的是)允许多人轻松更改相同的代码文件,而不会担心丢失其他人的更改。 即使您单独处理一个项目,源代码控制的这些好处也很有用,因为它可以更轻松地跟踪您可能尝试过的更改或实验。
如图 2所示, 协作是许多公司编码的重要组成部分。 数据科学家、数据工程师和软件工程师是三个常见的角色,他们经常相互交互,并相互共享代码。
扩展代码以有效地处理更多数据
另一个常见场景涉及扩展。 涉及从内存角度和效率角度提高代码扩展处理大量数据的能力。 缩放可以出现在许多不同的场景中。 例如,当您的计算资源有限时,即使读取大文件也可能会花费宝贵的时间。 数据处理和清理,例如将数据集合并在一起、转换变量等,也可能占用大量时间和潜在的内存。 幸运的是,有许多技术可以大规模地处理这些问题。
数据科学代码最初编写效率低下是很常见的。 同样,这通常是因为数据科学家花费大量时间探索数据并通过实验尝试新功能、模型等。通过应用可用的软件工程概念和工具,您可以将代码转换为在更强大的基础上运行,扩展到大量数据的观察中时的效率更高。
将模型投入生产以供其他人使用
开发模型后,您需要将其投入使用,以便为您的团队或公司提供价值。 这就是让你的模型发挥作用的地方,正如上面提到的生产,本质上意味着安排你的模型定期(或可能实时)进行预测。 将代码投入生产长期以来一直是一项软件工程任务。 它是许多不同公司软件工程工作的核心。 例如,软件工程师大量参与创建手机上的应用程序并将其投入生产,这使您可以首先使用这些应用程序。 这样做背后的相同原理也可以应用于数据科学,以便将模型投入生产,使其可供其他人使用,根据应用场景,在从少量用户到数十亿用户的任何地方运行(例如预测信用卡欺诈) 。
有效测试代码以减少未来的问题
所以你已经创建了一个模型,它很快就会做出新的预测。 也许这是一个预测下个月哪些客户会流失的模型。 也许它正在预测新的保险索赔将花费多少费用。 不管是什么,您如何知道模型将继续充分发挥作用? 甚至在此之前,如何确保提取、处理数据并将数据输入模型的代码库不会在某个时刻失败? 或者如何减轻代码库失败的后果? 软件工程师在编写代码时经常面临这些问题的各种变化。 例如,为您的手机开发新应用程序的工程师将关心确保该应用程序经过严格测试,以确保其性能符合预期。 同样,通过以软件工程师的身份思考,您可以为数据科学代码开发测试,以确保其有效运行并能够处理潜在的错误。
在图 3 中,展示了将特征输入到客户流失预测模型中的示例。 在这里,我们可以添加测试以确保模型的输入(例如客户年龄或过去 30 天内的交易数量)是预定义范围内的有效值。
图 3 此快照显示了部署客户流失模型时可以执行的测试示例。 例如,如果模型有两个输入 - 客户年龄和过去 30 天内的交易数量,我们可以在输入模型之前执行检查以确保这些输入值在设定范围内。
原因如下:
(一)在公司中数据科学家需要参与建筑软件
(二)在实际工作中数据科学家可以对公司的贡献
(三)数据科学家可以为产品定义做出贡献