数据科学家通常被认为拥有一份超级酷和令人兴奋的工作,但事实上它并不像看起来那样迷人。但这不一定是坏事,我只是发现新晋的数据科学家没有意识到他们正在进入什么领域。
翻译 & 整理 | 杨阳
出品|AI科技大本营最近,我遇到了很多有兴趣转行到数据科学领域的人。他们总是问我的第一件事是:“典型的一天是什么样的?”。我看过很多概述数据科学家应用技能和工具的文章,但我看不到很多展现日常工作的真实案例。虽然每一天都不一样,但这些任务代表了我作为一家大型金融机构的高级数据科学家的典型的一天。
每日一览
8:30–9:00 — 开始我的一天
9:00–10:00 — 结对编程
10:00–10:30 — 敏捷开发
10:30–11:00 — 准备演示
11:30–12:00 — 与经理一对一复盘
12:00–13:00 — 从首席数据科学家那里获得反馈
13:00–16:30 — 编码!
开始我的一天我通常在8:20起床,十分钟后,在8:30左右开始工作。我从2020年3月开始远程工作,相较于在公司办公,“游戏规则”突然改变了。我喜欢居家办公的宁静祥和,可以穿着睡衣工作,而且可以在等待代码运行的时候洗几件衣服。在我一天待办的事项列表中,首先是查看前一天可能错过的电子邮件和团队聊天信息。在我每天收到的邮件中,包括团队产出的机器学习模型的发开情况。我需要确保模型本身和数据加载到数据仓库的过程中没有发生错误。
如果没有错误,我会检查并回复各种类消息和请求。然后打开jira(项目/任务跟踪工具),处理接下来三周内的工单状态。在敏捷开发软件的世界中,称此为“冲刺”。从这里开始,我会优先考虑当天的任务。
结对编程过去五年,我作为数据科学家感受到了工作类型的变化。最初几年我专注于完成自己的工作,现在则将大部分时间花在帮助和教育经验不足的团队成员上。
我会每周与团队中的初级数据科学家会面一次,进行结对编程。在敏捷开发中,结对编程是指由两个开发人员一起完成同一任务,他们要么坐在同一台计算机面前,要么共享屏幕,在运行的任务中一起编程。我承认,几年前如果一位高级数据科学家给我建议结对编程,我会持怀疑态度,认为两个人完成同一项任务完全是浪费时间。而且,我会怕不知道如何编写代码会显得很笨。直到我发现结对编程是向其他开发人员学习的好方法。事实上,当我与初级开发人员一起工作时,从他们那里总是可以学到新东西。在上午九点到十点的结对编程会议中,我们从我遇到的问题开始,学习一种新的图形数据库工具。和我结对的初级数据科学家表示,他安装的一个插件可以帮助他更轻松地加载数据。但不幸的是,我却无法安装它。通过结对编程,我们发现IT 部门在没有访问互联网的情况下安装了我的工具版本。初级数据科学家向我展示了他的设置后,我就可以安装插件了!接下来,我们回顾了我编写的用于在图表中创建节点和关系的脚本。初级数据科学家给了我一些遵循最佳实践的建议,例如使用全部大写来识别关系。我太过专注于让我的脚本发挥作用,而忽略了让其他人更易读的想法。在帮助我解决问题后,我们转而讨论他面临的挑战,他需要编写一个SQL查询来计算多个业务线的过去和现在的指标。
他向我展示了在Excel中最终输出的模型,以帮助我更好地理解问题。从Excel转移到SQL Server后,我建议通过编写简单的查询来分解问题,以返回到单个指标和单个业务线的当前结果。在成功完成检索之后,我们讨论了如何编写多个小查询,并将结果合并在一起,从而更接近最终的输出。
敏捷开发上午 10:00 左右,是我们团队的每日 Scrum 时间。正常情况下,主持会议的 Scrum Master会问每人三个问题,包括:
你昨天做了什么?
你今天会做什么?
有什么阻碍吗?
我发现进行状态更新没有太大价值,所以我会推动团队采用不同的方法来强化学习。与其说明昨天做了什么,我们更倾向于直接展示。假设昨天我编写了Python代码来确定我的数据集中某个日期的前一天是否是“节假日”。我不会口头提供更新,而是共享我的屏幕,让大家一起浏览代码。
我们发现这样做有几个好处。当我分享时,团队中的其他人会想到更好、更快或更简单的方法来解决问题。虽然这些问题可能会在代码审查中被发现,但只有当编写了5行而不是100行代码时,更容易发现它们。其他时候,当团队中的某位成员正在做非常相似的事情时,通常可以通过之前完成的代码,而不是重复造轮子来浪费时间。最后,实话说,每天看到团队一点点的进步,而不仅仅是完成的最终产品,这件事真的很酷。
准备演示
Scrum之后,距离我下次会议还有大约30分钟的时间。我发现通常没有足够的时间深入研究真正的“数据科学”任务,如清洗数据或建模。所以,我会使用少量时间来回复全天中收到的电子邮件,或者是准备任何即将到来的演示。作为一名数据科学家,我的重要职责之一还包括通过演示文稿来教育大家什么是数据科学,以及什么不是这个范畴。很多高管当听到人工智能和机器学习这两个流行词时很容易说:“我们应该这样做!”但事实是,机器学习并不总是答案。通常,基本的报告或简单的自动化就能解决团队所面临的大部分问题,我们仅仅因为想要做机器学习就将问题过于复杂化。除了教育演示,我也可以向业务相关方展示初始模型得出的结果。在成为数据科学家的第一年,我沉迷于在演示中包含尽可能多的行话,主要因为想让自己听起来很聪明,但这是一个巨大的错误!
我的业务相关方都没有数学学位,也不会理解或关心我的模型中的F1分数到底是多少。随着时间推移,我了解到用通俗易懂的语言表达的重要性。现在,当我讨论模型性能时,即使我谈论的是F1分数,也将其称为“准确性”。这才是更精准的表达,不是吗?业务相关方对准确度的理解比准确率和召回率之间取调和平均值更好。
与经理的一对一复盘在我完成演示文稿的编辑后,将与经理进行一对一的复盘。如果您是商界的新手,这些会议将是与经理讨论职业目标,最近取得的成绩,或者可能面临的任何挑战的机会。今天会议的议程是“解决团队开发环境中设置工具的挑战”。在与另一个团队一起花几周时间浏览权限后走我们到了这一步,但大家都不知道该如何正确配置工具的安全设置。因为经理在组织中拥有比我更广泛的网络,当我们别无选择时,他能够提供一些能够给予我们帮助的人的建议。从首席数据科学家那里获得反馈
接下来,我将与团队中的首席数据科学家进行会面,以获得我一直在进行的概念验证的相关反馈。在过去的一个月里,我一直在使用结对编程部分中提到的图形数据库工具来探索业务领域中的数据集。
在做这个项目前,我作为数据科学家的大部分经验主要基于自然语言处理,所以,现在我不得不对图形数据库进行大量研究,并学习新的工具。作为一名数据科学家,学习新工具和技术是我最喜欢的事情之一,况且这是一个有趣的项目。
我已经为这个项目工作了大约一个月,需要从头开始,向首席数据科学家展示数据样本及其在网络图中的呈现。接下来,我介绍了自己编写的一些基本查询,例如确定哪个节点具有最多的关系。之后,我讨论了一些已经尝试过的内置算法,比如确定网络中两个节点之间的相似性。在讨论内置算法时,我注意到很多算法没有办法实现,因为我的图形在两种类型的节点(二分图)之间存在关系,但这些算法仅适用于具有一个节点的图型。他建议我重新构建图表,以便测试其他的算法可行性,然后我们介绍了新数据模型的样式。虽然我为自己没有想到这一点而略感尴尬,但这也是从他人那里获得反馈的一大好处!有时你会在解决一个问题上陷入困境,而获得全新的视角会非常有帮助。此次会议在集思广益中结束,接下来将是业务领域的展示。编码!最后,我的一天是在编写代码中结束的—耶!我最终从网络图切换到正在为另一个业务领域工作的文档分类项目。事实上,我的团队有点类似承包商,为多个业务领域供应各种项目。这样我喜欢的一点是工作具有多样性,当我对一个项目感到疲倦或者是沮丧,就可以切换到另一个项目中,这样也可以让我的大脑感到放松。当然,最大的挑战是我需要不断学习新的业务和适应新的流程。对于这个项目(目前正在进行的),我们没有标记数据,主要在尝试一种被称为主动式学习的新技术,它本质上允许使用更少的标记数据来创建更好的机器学习模型。我们给公司内部的五个人选择了一份文件样本进行标记,我今天的任务是审查所有标记者的标注并确定是否一致。
在查看标注之前,我需要将五个单独的Excel文件中的数据加载到一个数据框中并对其进行转换,以便为每个标记器的结果创建一个列。在获得正确格式的数据后(这总是比我预期要长),我会思考如何将标注者的意见进行统一。对于某些文档,所有五个标注者都有一致的标注,这让我的决定变得容易。但对于其他文档,只有五分之三或更少的人统一,甚至有一些五个标注者都选择了不同的答案!我决定从简单开始,采取多数决定的方法。如果三个或更多标注者选择了相同的答案,则该答案将用作最终答案,并最终用于训练我们的模型。完成这项任务花费了我一些时间来编写代码,因为我很想知道是否存在三个人彼此同意但另外两个人都同意另外一个答案的情况。我一天的工作结束于记下当天的决定和明天的一些任务。