acm-header
登录

ACM通信

BLOG@CACM

数据科学工作流程:概述与挑战


在我的博士学位期间,我创造了编写程序的人从数据中获得洞察力的工具.数以百万计的科学、工程、商业、金融、公共政策和新闻等领域的专业人士,以及无数的学生和计算机爱好者,每天都在执行这类编程。

在我2012年写完论文后不久,这个学期数据科学开始出现无处不在。一些业内权威人士称数据科学为“21世纪最性感的工作大学正在投入大量资金进行新的研究数据科学研究院

我现在意识到数据科学家是我在整个博士阶段所创造的工具的主要目标受众之一。然而,在我读研究生的时候,这个职位的头衔并不那么突出,所以我没有在我的论文中明确提到它。

数据科学家在工作中做什么,他们面临什么挑战?

本文提供了现代数据科学工作流程的概述,改编自我的博士论文第二章,促进研究程序设计的软件工具

数据科学工作流程

下图显示了典型数据科学工作流中涉及的步骤。有四个主要阶段,如虚线框所示:准备的数据,交替运行分析而且反射解释输出,最后传播以书面报告和/或可执行代码的形式显示结果。

准备阶段

在进行任何分析之前,程序员(数据科学家)必须首先获取数据,然后将其重新格式化为易于计算的形式。

获取数据显而易见,任何数据科学工作流程的第一步都是获取要分析的数据。数据可以从多种来源获得。例如,:

  • 数据文件可以从在线资料库下载,如公共网站(如美国人口普查数据集)。
  • 数据可以通过API从在线来源按需传输(例如,彭博金融数据流)。
  • 数据可以由物理设备自动生成,例如与计算机相连的科学实验室设备。
  • 数据可以由计算机软件生成,例如来自网络服务器的日志或由机器学习算法产生的分类。
  • 数据可以人工输入到电子表格或文本文件中。

程序员在获取数据时面临的主要问题是跟踪出处,即每段数据来自何处,以及是否仍为最新数据。准确地追踪来源是很重要的,因为数据经常需要在未来重新获得,以运行更新的实验。当原始数据源得到更新或研究人员想要测试替代假设时,都会发生重新获取数据的情况。此外,来源可以使下游分析错误追溯到原始数据源。

数据管理是一个相关的问题:程序员必须为他们创建或下载的数据文件指定名称,然后将这些文件组织到目录中。当他们创建或下载这些文件的新版本时,他们必须确保为所有版本分配适当的文件名,并跟踪它们的差异。例如,科学实验室设备可以生成数百或数千个数据文件,科学家在对这些文件进行计算分析之前必须对它们进行命名和组织。

数据采集的第二个问题是存储:有时数据太多,单个硬盘无法容纳,因此必须将其存储在远程服务器上。然而,坊间传闻和实证研究表明,大量的数据分析仍然是在台式计算机上进行的,其数据集适合现代硬盘驱动器(即小于1tb)。

重新格式化和清理数据对于程序员来说,原始数据可能不是一个方便的格式来运行特定的分析,通常是因为它是被其他人格式化的,而没有考虑到程序员的分析。一个相关的问题是,原始数据经常包含语义错误、缺少条目或格式不一致,因此需要在分析之前对其进行“清理”。

程序员可以通过编写脚本或手工编辑数据(比如电子表格)来重新格式化和清理数据。我在论文工作中采访的许多科学家抱怨说,这些任务是他们工作流程中最乏味、最耗时的部分,因为它们是无法避免的琐事,不能产生新的见解。然而,数据重新格式化和清理的繁琐工作可以帮助我们深入了解对数据做出什么样的假设是安全的,收集过程中存在什么样的特性,以及什么样的模型和分析适合应用。

数据集成是这个阶段的一个相关挑战。例如,基督教的鸟他从各种。csv和XML文件中获取原始数据,查询软件版本控制系统和bug数据库,并从电子邮件语料库中解析特性。他将所有这些数据源集成到一个中央MySQL关系数据库中,该数据库作为他的分析的主数据源。

在结束时,下面是本书导言的节选用于计算科学的Python脚本总结数据准备工作的程度:

科学计算不仅仅是数字运算当前位置许多计算科学家从事他们自己的数值软件开发工作,并意识到大部分工作不仅仅是编写计算密集型的数字运算循环。编程通常是关于在不同的工具中变换数据,将一种数据格式转换为另一种数据格式,从文本中提取数值数据,以及管理涉及大量数据文件和目录的数值实验。用Python这样的语言完成这些任务要比用Fortran、C、c++、c#或Java快得多。

总之,在进行实际的实质性分析之前,必须克服数据处理和组织是人类生产力的瓶颈。

分析阶段

数据科学的核心活动是分析阶段:编写、执行和精炼计算机程序,以分析数据并从中获得见解。我将把这类项目称为数据分析脚本因为数据科学家通常更喜欢使用解释的“脚本”语言,如Python、Perl、R和MATLAB。然而,他们也在适当的时候使用编译语言,如C、c++和Fortran。

下图显示,在分析阶段,程序员进行了重复的迭代周期编辑脚本,执行生成输出文件,检查输出文件以获得见解和发现错误,调试和重新编辑。

程序员完成每次迭代的速度越快,在单位时间内获得的信息就越多。经济放缓有三个主要原因:

  • 绝对的运行时间:脚本可能需要很长时间来终止,要么是因为正在处理大量的数据,要么是因为算法缓慢,这本身可能是由于渐近的“Big-O”缓慢和/或实现缓慢。
  • 增量运行时间:在迭代分析时,脚本可能需要很长时间在完成少量增量代码编辑后终止,这将浪费时间重新计算几乎与之前运行相同的结果。
  • 崩溃的错误:脚本可能会由于代码错误或数据集不一致而过早崩溃。程序员通常需要忍受几轮调试和修复一些平庸的错误,比如数据解析错误,然后他们的脚本才能终止并产生有用的结果。

文件和元数据管理是分析阶段的另一个挑战。在迭代实验时重复编辑和执行脚本会产生大量输出文件,例如中间数据、文本报告、表和图形可视化。例如下图

显示了一个来自计算生物学家机器的目录列表,其中包含数百个PNG输出图像文件,每个文件都有一个长长的、神秘的文件名。为了跟踪出处,数据科学家经常将元数据(如版本号、脚本参数值,甚至简短的注释)编码到输出文件名中。这种习惯很普遍,因为它是确保元数据附加到文件并保持高度可见性的最简单方法。但是,这样做会导致数据管理问题,因为文件太多,而且程序员后来经常会忘记自己的特别命名约定。下面这封来自一位生物信息学博士生的邮件片段总结了这些数据管理问题:

通常,您真的不知道什么会起作用,所以您尝试使用参数组合和输入文件组合的程序。因此,最终会产生大量的输出文件。您必须记住以不同的方式命名文件,或者每次都写出参数。另外,您会不断地调整程序,所以旧的运行甚至可能不会记录您以后输入的参数,以便更好地控制。回到我三个月前做的事情,我经常发现我完全不知道输出文件的意思,最后不得不重复它来弄清楚。

最后,数据科学家不会在真空中编写代码:当他们迭代他们的脚本时,他们经常查阅资源,如文档网站、API使用示例、在线论坛的示例代码片段、相关研究论文的PDF文档,以及从同事那里获得的相关代码。

反思阶段

数据科学家经常在分析而且反射它们工作时的阶段,如下图中两个阶段之间的箭头所示:

分析阶段涉及到编程,而反思阶段涉及到对分析输出的思考和交流。在检查了一组输出文件之后,数据科学家可能会执行以下类型的反射:

做笔记:人们在整个实验过程中以物理和数字两种形式做笔记。物理笔记通常写在实验笔记本、活页纸或白板上。数字笔记通常是用纯文本文件、“便签”桌面小工具、用于多媒体内容的Microsoft PowerPoint文档或专门的电子笔记应用程序(如Evernote或Microsoft OneNote)编写的。每种格式都有其优点:在纸上徒手画草图和方程通常更容易,而将编程命令和数字图像复制粘贴到电子笔记中则更容易。由于笔记是数据的一种形式,在记笔记时通常会出现数据管理问题,最显著的问题是如何组织笔记,并将它们与最初写笔记的上下文联系起来。

召开会议:人们与同事开会讨论结果,并计划下一步的分析。例如,一个计算科学博士生可能每周会见她的研究顾问,展示她的分析脚本生成的最新图表。会议的输入包括数据可视化和状态报告的打印输出,这些是讨论的基础。会议的输出是为与会者准备的新的待办事项列表。例如,在微软研究院暑期实习期间,我做了一项数据驱动的研究什么因素导致软件bug被修复,我每天都和我的主管开会,汤姆·齐默尔曼.在检查我每天分析生成的图表和表格后,他经常要求我调整我的脚本,或者让我的分析分支以探索多种替代假设(例如:“请针对每个国家分别重新运行分析,探讨员工所在位置对bug修复率的影响。”).

进行比较并探索其他选择与分析阶段联系最紧密的反射活动是在输出变量之间进行比较,然后通过调整脚本代码和/或执行参数来探索替代方案。数据科学家经常在他们的显示器上并排打开几个输出图形文件,以直观地比较和对比它们的特征。戴安娜·麦克莱恩观察到她在哈佛大学跟踪科学家时的以下行为:

很多分析过程都是试错:科学家会进行测试,绘制输出图,重新运行,绘制输出图,等等。科学家们严重依赖图表——他们绘制测试的输出和分布,他们将已测序的基因组与其他现有序列进行对比。

下图展示了来自社会网络分析研究的一组图表示例,其中在四个不同的输入数据集上测试了一个模型算法的四个变体:

这个例子是一篇发表的论文的最终结果博士论文;在运行分析的过程中,分析脚本会生成更多这种类型的图。数据科学家必须组织、管理和比较这些图表,以获得关于探索替代假设的见解和想法。

传播阶段

数据科学的最后阶段是传播结果,最常见的形式是书面报告例如内部备忘录、幻灯片演示、商业/政策白皮书或学术研究出版物。这里的主要挑战是如何整合所有不同的笔记,手绘草图,电子邮件,脚本和输出数据文件,在整个实验中创建来帮助写作。

除了以书面形式展示结果,一些数据科学家也想这样做分配他们的软件这样同事们就可以重现他们的实验或者摆弄他们的原型系统。例如,计算机图形和用户界面研究人员目前在提交每篇论文的同时提交他们原型系统的视频演示,但如果论文审稿人能够实际执行他们的软件来“感受”每篇论文中展示的技术,那将是理想的。实际上,很难将研究代码以其他人可以在自己的计算机上轻松执行的形式分发出去。在同事能够执行代码之前(即使是在相同的操作系统上),他们必须首先获得、安装和配置相应软件的兼容版本及其无数依赖库,这通常是一个令人沮丧且容易出错的过程。如果一个依赖项的一个部分不能完成,那么原始代码将不能重新执行。

同样,也很难再现的结果自己的实验在未来的几个月或几年里,因为一个人自己的操作系统和软件不可避免地以某种不兼容的方式升级,以致原来的代码不再运行。例如,学术研究人员需要在未来提交论文审查后重现他们自己的结果,因为审查人员不可避免地会建议修改,要求重新进行实验。举个极端的例子,我的前同事克里斯蒂安·Cadar他曾经在提交了一篇重要的论文后,把硬盘从他的电脑中取出来存档他的实验,以确保他可以在几个月后重新插入硬盘,重现他的原始结果。

最后,数据科学家经常与同事协作通过发送部分结果来接收反馈和新鲜的想法。在以代码和数据共享为中心的协作中,出现了各种后勤和通信挑战。

要进一步阅读,请查看我的博士论文项目以解决本文中提到的挑战的原型工具为例。


评论


约翰Wandeto

你好菲利普
这是一项鼓舞人心的工作。我想知道你能否简单地比较一下数据科学和大数据。
谢谢


萨尔瓦多一度

菲利普伟大的工作。在数据获取方面,更具体地说,在来源方面,“每一份数据”来自哪里的重要性有多大?如果我们处理的是一个小数据集,我同意这种担忧,但如果我们处理的是真正的大数据集,那么每一个数据都不应该太重要。分析获取数据的工具应该依赖于我们从统计中借鉴的技术,所以缓冲数据和着眼于手段或对数据科学家应该更重要。你觉得呢?


约瑟夫·麦卡锡

我喜欢高水平的概述和编织在叙述中的关键细节之间的平衡。在这篇文章中强调的数据科学工作中的元数据(和元管理)问题在其他演讲中经常被忽视和低估。

在将其与CRISP-DM (https://en.wikipedia.org/wiki/Cross_Industry_Standard_Process_for_Data_Mining)模型进行比较时,我喜欢更广泛的传播类别(而不是更狭窄的部署),因为即使在业务上下文中,一些数据建模工作也只是作为可能全面部署的中间步骤来完成的。

我还喜欢Reflection阶段的显式标识(和命名)。尽管CRISP-DM模型中的“数据理解”阶段包含了其中的一些内容,而且该模型强调了几个阶段的迭代,但我经常发现,在数据准备、数据建模和评估阶段之后的反思,比在这些阶段之前的任何“数据理解”阶段产生了更深刻的见解。

也就是说,与CRISP-DM模型相比,我认为这个模型缺少两个要素,或者没有得到充分强调。

一个是评估:尽管“进行比较”是该模型的一部分,而且该模型还有其他方面与评估明显相关,但我发现,定义有意义的指标,应用它们,验证它们被正确应用,然后使用它们来评估有效性,这些都是许多数据科学工作中具有挑战性的重要方面。因此,将“评估”确定为明确的第一级阶段可能有助于引起对其重要性的更多注意。

另一个缺失的元素是“业务理解”阶段。即使在业务上下文之外,清楚地了解试图用数据解决的问题也是许多数据科学工作中的一个重要组成部分。虽然有一些偶然发现有趣见解的例子——大海捞针——这些通常是寻求解决特定问题的副作用。试图在没有定义良好的问题的情况下评估“解决方案”,会给已经很复杂的过程增加另一层复杂性。

尽管有这些保留,我确实发现这是一个清晰和深刻的介绍许多关键概念的数据科学,我特别高兴的是,它出现在收费墙之外,限制访问通过ACM共享的许多其他有价值的见解。


Stephen Osei-Akoto

谢谢菲利普,这篇文章很有见地。我是一名计算机科学专业人员,过去10年一直在电信行业工作。我有一个想法,去学术领域开始研究,然后获得博士学位。你能给数据科学和数据挖掘更多的启发吗?


显示所有4评论

Baidu
map