数据科学(或机器学习)工作常被认为是令人向往的职业,激发着许多人投身其中。然而,现实往往与理想有差距,数据科学工作并非一帆风顺,反而可能让人感到枯燥乏味。一旦陷入枯燥的境地,人们很容易产生焦虑,导致离职率居高不下。

本文作者将分享自己如何应对数据科学中那些枯燥的工作,帮助读者对数据科学有一个正确的认识,并在决定走上这条道路时能尽情享受这场漫长的游戏。

第一课:Shawn的经历

我的表弟Shawn是一位年轻英俊的小伙,最近他来到加拿大攻读计算机硕士学位。和许多学生一样,他对机器学习充满热情。他希望在两年后毕业时,能够成为一名数据科学家或其他与机器学习相关的工作。

作为Shawn的表哥,我关心他的未来发展。《哈佛商业评论》杂志曾将数据科学称为“21世纪最性感的工作”,但它和其他职业一样会让人觉得枯燥,甚至使人心力交瘁,你还会屡屡受挫。即便这些话会让Shawn感到失望,我还是有义务把事实告诉他,让他对自己选择的职业道路有充分的了解。更重要的是,我不希望凌晨3点会接到我妈和叔叔的电话,告诉我作为家庭一员,有义务花耐心去好好指导晚辈。

Shawn非常聪明、积极进取且富有好奇心,他让我详细地给他说说,数据科学到底多枯燥。因此,我写了这篇帖子,希望能对他有所启发。

一些背景说明:

首先,为了便于理解本文,我先介绍一下自己是如何进入数据科学行业的(具体可以看我的领英)。作为一名数据科学经理,我不仅负责领导团队为财富100企业部署机器学习系统,还要管理客户关系,自己也会承担一部分的技术工作。

更重要的是:机器学习系统应是用于解决特定业务领域问题的一整套方案,除去机器学习组件,还要处理其他与人或系统相关事情。部署系统意味着解决方案对实际业务运营有效。举例来说,搭建实验环境用于训练和验证机器学习模型称不上是部署,但如果搭建一个每月邮件发送产品服务的推荐引擎可以算是部署。相比较构建一个好的机器学习模型,部署机器学习系统需要攻克更多的难题。若是感兴趣,可以点击此处详细了解。

所以,我不会介绍如何在谷歌或其他高科技公司,从一名初级开发人员成长为技术经理。虽然这些公司在机器学习颇有成就,但他们只能代表“前1%”的公司。因为其他财富100企业在技术成熟度、技术采用的速度以及投资工具和工程人才储备方面都相对滞后。

AI学术:让我们仔细看看

许多年轻的数据科学家都会花费大量时间思考如何构建完美的机器学习模型,或者采用丰富多彩的可视化手段向大家展示具有突破性的商业洞察。当然,这些确实是他们工作的一部分。然而,随着数据科学被越来越广泛地应用,企业更关注其实际的应用价值。企业想要部署越来越多的机器学习系统,但他们不关注系统使用了多少新的模型或者酷炫的仪表板。因此,数据科学家需要处理一堆与机器学习无关的工作,这使得他们的工作变得枯燥起来。

那么,数据科学到底有多枯燥呢?看看我周一到周五的工作内容就知道了。接下来,我将把日常工作进行分类阐述,从期望和现实两方面对比说明,并分享我的应对策略。下面列举的案例都源自过往实验和团队项目,我将以“我们”的口吻来叙述。虽然这些案例可能并不详尽,但也足以论证我的观点。

设计(占5-10%时间)

在设计阶段,我们会发挥各自最“高”智慧来解决问题和提出卓越的想法。这些想法可以包括新的模型体系结构、数据特性和系统设计等。但很快,我们就陷入低谷,受时间因素或受其他重要事情影响,我们只能采用最简单(通常也是最无聊)的解决方案。

期望:

我们的想法将被收录于著名的机器学习杂志,如NIPS、谷歌AI项目(Google AI Research)等,还幻想赢得下一届诺贝尔奖。

现实:

部署后一切正常运行。不错的白板绘图会拍照记录下来,作为参考框架。

应对策略:

1)不断与外行朋友谈论我们疯狂的想法,他们会十分诚实(甚至是粗鲁)地劝我打消那些疯狂、愚蠢的念头;

2)把看似疯狂的好想法作为附带项目;

3)结果发现,大部分疯狂的想法不起作用,或者只是比简单方法稍微好一点点。

所以,遵循简单原则(KISS,Keep-It-Simple-Stupid),让我如释重负。

编程(占20-70%时间,取决于你的开发角色)

此处不必多讲,想象你戴上耳机,喝一个口咖啡,拉伸你的手指,坐在在电脑屏幕前,敲打出一行行漂亮的代码后,坐等奇迹发生。我们的代码分为5部分(此处用代码行数占比说明):数据管道(50-70%),系统和集成(10-20%),机器学习模型(5-10%),调试和演示支持(5-10%)。其他同行基本也是这么认为的,这里有一幅大图可以说明此:编写模型的代码占比(图),此处有一篇来自谷歌团队论述机器学习的隐性技术债的文章。

如你所见,我们大部分时间都在处理与机器学习无关的事务。虽然机器学习组件非常重要,流行的框架和编程语言(如Keras、XGBoost、Python的sklearn等)已经帮助我们减轻了许多繁琐的工作。为了达到目标,我们不需要拥有庞大的代码库,工作流程已经是标准化和相对完善的。尽管在底层优化方面有所不同,但其影响也仅占1%。

期望:

我们希望大部分时间能够专注于开发和重塑机器学习组件,而其他人则关注其他剩余部分。

现实:

然而,没有人愿意做以下三件事情:

1) 做自己不想做的事情;

2) 把所有事情都留给自己做;

3) 花费大量不成比例的时间去优化已经足够完善的工作流程。

应对策略:

我们根据各自的专业特长来制定设计决策,在完成自己的开发工作的同时,还会支持其他团队成员。例如,可以贡献想法、亲自编写代码或者进行质量评估。通过互相学习,我们的团队整体水平得到提升。更重要的是,这样的分工可以缓解机器学习领域带来的“性感工作”焦虑。

质量评估、调试和修复问题(至少占65%的时间)

在我看来,这是所有技术工作中最无聊、最痛苦的部分。部署机器学习系统也不例外。

一个机器学习系统有两类常见的bug:不好的结果和常见软件问题。不好的结果可能是模型得分太低(例如:准确性和精度)或难以解释的预测结果(例如:基于业务经验的预测概率呈现偏态分布)。代码没有问题,只是结果不具有解释性或者不够好。常见软件问题则是诸如代码无法运行,系统配置等。

期望:

我们希望通过更聪明的方法构建一个优化的模型来解决结果不佳的问题。这个过程需要一些智慧,如果想法有效,那将是非常令人欣慰的。

现实:

在质量评估、调试和处理缺陷的过程中,我们大约有70-90%的时间在处理常见软件问题。通常情况下,我们在构建端到端的训练和验证管道后,可以很快得到良好的结果。然而,实际上我们更关注系统问题,模型次之。

应对策略:

我使用GitHub的issue功能创建了一个游戏化的“奖杯板”。每次关闭问题卡片时,我都会感到非常兴奋。看到我们“征服”的问题,我会感到十分自豪。当然,如果我点击“启动”,一切都能奇迹般地正常运行时,我会更加自豪。虽然这种情景只在大学提交编程作业时出现过。我一生都记得那一刻的感觉。如果现实生活中再次发生类似的情况,那可能意味着某个地方出了问题。

GitHub问题板截图

救火(占10-50%的时间)

再周全的时间计划,总会遇到一些让你偏离正轨的意外。这不仅是数据科学领域的问题,对于任何交付团队经理来说,这都是一场噩梦。具体来说,意外可以分为三类:

在数据科学工作中,我们可能会遇到许多挑战,这些挑战可以分为三类:

a) 外部因素,如范围变更、上游系统依赖和客户抱怨;

b) 内部团队问题,如恼人的bug需要更多的时间解决、团队成员离职但没有做好交接、人力不足、个人冲突等;

c) 以及自己的无知,包含一切五花八门的“其他”事情。

期望是,从头到尾巡检一遍,搞定后,迎接客户、领导、团队的击掌庆祝和拥抱。然而,现实情况往往并非如此。意料之外的事情总是在最不合时宜的时候发生。意外可能有一些规律可循,但没有解决问题的万能良方,这让人感到非常沮丧。

为了应对这些挑战,我们可以尝试以下策略:

1) 遇到高技术问题或跨团队协作时,最好将时间周期延长至2到2.5倍,预留足够的空间;

2) 在团队内部设立激进的里程碑;

3) 在心里大骂以平衡情绪,有时候也可以口头表达发泄;

4) 深呼吸、保持微笑、学会倾听;

5) 与团队一起探索所有可能的方案,依据可行性、所需投入、难易程度确定方案优先级;

6) 如果以上策略都不起作用,不要再等待了,寻找帮助!

7) 继续推进。以上策略虽然不能算是银弹,但在实际操作过程中可以发挥一定作用。

综上所述,本文主要探讨了在数据科学工作中可能遇到的困难。对于有志于从事机器学习工作的人来说,除了构建模型之外,还需要了解实际上还有很多其他方面的工作需要去做。与其他工作一样,你最终都会感到枯燥、受挫。当然,这很正常。但更重要的是,你应该建立一套自己的应对策略,这样你就可以长期在这个领域中发展,享受沿途的小成就,并最终取得胜利。