数据科学家被称为21世纪最性感的工作。大多数公司在他们的流程和核心任务中采用了一些数据科学的方式自动或手动分析他们的客户群。另一方面数据科学家是一群非常多样化的人,有些人有统计学背景,有些人有机械工程背景,有些人有物理学背景。实际的数据科学硕士项目对劳动力的产出肯定会有所帮助,但大多数人仍然是自学成才的(包括我)。
现在的瓶颈似乎不再是数据,而是如何将项目投入生产中。也就是说让软件工程师和数据科学家使用相同的语言来完成这个工作。
数据科学家通常非常擅长获取数据、对数据进行整理、制作可视化、一些初始模型和notebook。但是在生产阶段,将模型提供给最终用户并将其集成到现有工具中时,数据科学家需要将工作传递给软件工程师。不幸的是,对于软件工程师来说,这些notebook和凌乱的脚本就像劣质原型设计,将其转化为能够在生产环境稳定运行的东西还需要很多时间。那么如何弥补这一问题呢?
按照上面的流程图进行工作也许可以帮到你。
进行代码管理
版本控制系统,记录一个文件或一组文件随时间的变化的每一个节点,以便以后可以查看特定节点的内容。像 Github、Bitbucket 和其他服务可以很容易地查看多人在一个代码库上工作的情况。这样可以避免无意的覆盖和其他错误。
除了在多人开发时需要版本控制外,推荐单独工作时也要使用,将代码将存储在项目库中,不仅可以规范代码操作,在需要共享给其他项目成员时可以方便进行访问,如果在某人的笔记本电脑上不仅共享麻烦,还很有可能会丢失。
另外还有一个好处就是,当知道有人会阅读你的代码时,你肯定会将它写得更好(至少我是这么认为的)。
可复制的notebook
jupyter notebook可以称作是数据科学家的宝典;对于数据科学的探索提供了简单高效的环境,并且也有许多在线版本可以使用,例如Kaggle 、Sagemaker、Google Colab 等等。notebook还提供了相当多的自由,例如可以按照想要的任何顺序运行代码。可以支持多个环境,创建不同 python版本。这种方式对于科学探索是非常方便的,但是对于生产部署就是一个灾难。
针对这个问题我们可以对运行环境进行容器化,将整个运行环境打包成容器,部署的时候将部署完整的虚拟化环境,例如本篇文章的作者Valohai 公司的Jupyhai可以将本地 Jupyter notebook运行在Valohai 云服务中。并且要求从上到下顺序执行每一个操作,这样迫使数据科学家保持代码清洁和有序。
模块化工作
当需要滚动notebook查找代码时就应该开始思考模块化了。将工作分解为形成模块化的步骤虽然需要一些额外的工作,但从长远来看是值得的。
一次只能运行一个部分,能过够方便的排查错误、找到错误的位置和找到执行的性能瓶颈。我们甚至还可以编写一些单元测试来测试我们的模块(这个可能对于数据科学家要求有点高,但是多了解一些知识总是好的)。模块化的代码还有助于代码可维护性。
“完成”的定义
我们的项目已经转向的了生产,下一个等待我们的将是永无止尽的循环,总有东西需要迭代、改进和优化,因此对于“完成”的定义非常模糊。
我们可以再次从敏捷开发等框架中学习。虽然这里并不是所有的部分都适用于数据科学,但是尝试规划sprint,对每个sprint进行优先排序,使用可交付成果和时间线清楚地定义任务,并使用demo和总结会让你觉得自己的确完成了一些事情,并且有很好的成果。使用这种方式与开发人员的沟通也会变得更加直接。
最后但并最重要的一点:同理心
我们接触到的人都来自不同的背景, 有着不同的想法,并且做事方式也不一样。所以我们要站在对方的角度思考。
例如对于开发人员并没有试图通过引入他们工作的工具和框架来让你的工作变得复杂。同理数据科学家并不是故意编写难以理解的代码来增加开发人员的工作量。尝试理解他人并向他人学习,尝试了解他人的观点,即具有同理心,可以让你完成比自己独立完成的工作更令人难以置信的事情!
总结
在工作中实现以上5点其实并不简单,所以我们可以 一次解决一个工作流程障碍,这样才能够更好的的高效的完成我们的工作。