如何成为一名顶级战斗力的数据分析师?

翻译 | AI科技大本营(rgznai100)
参与 | reason_W


不知道你们之前听没据说过“10x Developer”这个词,若是你连听都还没据说过,那可真是时候考虑放弃本身的程序猿事业了。就像传说同样,一些程序猿的战斗力能达到同行的10倍,也就是说一个10x程序猿可以替换一个10人的开发团队。程序员


本篇文章咱们就针对数据科学,来谈一谈如何才能成为一名传说中的10x老司机。本文做者主要从事数据挖掘及处理方面的开发工做,是西雅图女性程序员俱乐部PyLadies创始人,曾在PyData Seattle 2015上作过关于经过天然语言处理和机器学习调查用户体验的主题演讲。数据库


如下正文~~编程

最近我在PyData Seattle(https://pydata.org/seattle2017/)发表了一个关于如何经过借鉴开发社区的提示和窍门来提升数据科学技能的主题演讲。这些建议将帮助开发者成为一名很是受团队成员和其余人欢迎的数据科学方面的老司机。缓存

这篇文章分为五部分,其中包括:安全

  • 10x开发者的历史和争议数据结构

  • 项目设计app

  • 代码设计机器学习

  • 工做工具编程语言

  • 生产模式ide

固然,若是你想观看原始演讲的视频,能够点击这里(https://www.youtube.com/watch?v=nFVjLSvK5po)

10x开发人员,顾名思义,就是比普通开发人员生产力高出10倍的人。

一个10x的开发人员,不仅是能在必定时间内比普通开发人员生产更多代码,还能像boss同样调试bug,代码里的bug也更少。由于他们会测试代码,指导初级开发人员,编写本身的文档,而且拥有不少其余技能来让本身超越仅仅知道如何写代码的境界。

H. Sackman,W. J. Erikson和E. E. Grant在1968年进行了一个叫作“比较在线和离线编程性能的探索性实验研究”的实验,发现程序员在完成写代码的任务上有很大的时间差别。

虽然该实验选取的被研究人员平均开发经验已经达到了七年之久,但相互之间的时间差别却能达到惊人的20倍。

虽然该实验的设计存在必定的缺陷,例如将使用低级语言的程序员和使用高级语言的程序员混合到了一块儿,但以后愈来愈多的研究都发现了相似的结果。

虽然关于到底存不存在10x开发人员仍有着普遍的争论,但本文重点关注的不是这些,而是关注开发人员,如何经过从那些经验丰富而且被认为开发速度更快的人那里获得的提示和窍门,成为一名更有生产效率的数据科学家。

你得真正了解业务

无论你是为教育、生物技术仍是金融公司工做,都应该至少对解决问题的业务有一个比较深刻的了解。

为了有效地沟通数据分析背后的故事,你应该了解是什么在驱动业务,而且了解业务目标。

例如,若是你负责优化食品卡车的位置,那么你就须要了解客流量,竞争,该地区发生的事件,甚至天气。你须要想了解公司为何要优化位置。多是由于公司要增长现有卡车的销售量,或者是想要增长卡车数量。

哪怕你多是今天在搜索网站工做,明天就到了金融公司去当数据科学家,你也应该为了使你的分析与利益相关者相关知道是什么让业务成为可能。

你还应该了解你所在项目的业务流程,例如知道谁须要签署最终结果,一旦你负责的部分完成,数据模型被传递给谁,以及预期的时间表是如何安排的。

最后,你应该确保你知道这个项目的利益相关者是谁,而且可以向不懂技术的利益相关者讲明白这个项目实际的效果。就像是成为教育工做者同样,并可以向不懂技术的利益相关者讲明白为何达成目标可能须要比他们预期的更多时间或资源。

当你了解了利益相关方的目标,并可以确保你沟通技术,专业知识和创建解决方案所需的时间,那么你在大家公司的价值必定会变得更大。

你得真正了解数据

了解业务很重要,了解数据更重要。你须要知道数据该怎样提取,什么时候提取,谁负责质量控制,为何数据会可能存在差距(例如供应商的变化或提取方法的变化),什么可能会丢失,而且哪些其余数据源能够被添加进来以建立一个更准确的模型。

这真的须要你去和不一样的团队交谈,而且不断地提出问题。不要惧怕问他们正在作哪些工做,也不要惧怕跟他们讨论你正在作哪些工做,由于你永远不知道你们是否是在作重复的工做,或者他们是否有一个更干净的版本的数据,而这偏偏是你须要数据。这样能够节省你大量查询数据库的时间,例如对SiteCatalyst进行多个API调用。

为何在项目设计过程当中多花费一些时间和精力可让你成为10x数据科学家?

  • 你只须要作那些须要完成的工做(在写代码以前已经思考过),这样就能够快速完成项目,由于你会减小工做量!

  • 经过在客户/用户认为他们须要的东西和他们真正须要的东西之间发现不一样,你就能把本身定位成这个领域的专家和共识的制定者。

  • 你会巩固本身对问题的理解,从而减少犯那些重大错误的概率。

你得懂得代码设计

虽然在设计代码时有不少很是好的实践,但其中有一些很是突出的细节将大大增长你的生产效率。

我第一次听到关于清晰度或清晰度赛过聪明才智的论述是在大学写做课。 被本身一时的聪明想法抓住,并使用今天刚想到的最新词汇来表述想法是很容易的一件事,可是像编程同样,你这样作不只可能会混淆本身,还会混淆别人。(小编注:好比不按变量命名规则,每次都是a,b,c。。。真的在往后看代码的时候很崩溃)

在上面的Scala示例中,第一行显示了使用简写语法的sortBy方法。虽然简明扼要,但很难想象下划线表明什么。虽然这是许多人在匿名函数中表示参数名称的常见模式,但对于不过高级的开发人员(或者当你过了一段时间再看你的代码)时,搞明白代码到底表明什么的作法就变得很头痛了。

在第二个例子中,咱们起码使用了一个参数名称,加上它还显示了赋值,咱们能够看到它是经过序列x中的最后一个元素排序的。

当代码不怎么抽象的时候,以后的调试才会更容易,因此在第三个例子中,我明确命名了个人参数,以便它表示数据。

当你的大脑必需要经历每一步,或者查找或回想代码的简写表明什么的时候,调试会须要更长的时间,添加新函数也会须要更长的时间,所以即便使用上述示例的简写能够简洁而快速地输入,从长远来看,明确命名参数对你和他人都会是有利的,从而避免大家耍小聪明犯下的错。

虽然咱们不会检查缓存,但咱们将介绍命名的重要性。想象一下,你正在查看一些旧的代码,你会看到序列按Scala示例进行排序:

.sortBy(x => -x._2)

使用单个字母来命名序列根本提供不了有用的信息,由于当你可能从API,数据库或Spark中的数据流中提取数据时,你必须运行代码才能看到”x”到底表明什么。

因此保持与以前Scala的示例的代码应该是:

sortBy(clothesCount => -clothesCount._2)

这样你就能够知道咱们正在对什么进行排序,甚至不用运行代码。

可是,有时使用X做为变量名称却很好。例如,X一般用于机器学习库,其中X表示观察到的数据,而y是试图预测的变量。在这种状况下,使用这个领域约定俗成的表示,如“模型”,“拟合”,“预测”和“x”和“y”等字段是最好不过的。

除了数据科学方面的要求,你还要遵循你所使用的语言的编程语言惯例。例如,我建议你去检查一下文档,如PEP for Python,来了解最佳作法。

经过规范你的命名约定,并经过清晰而不是耍小聪明的代码,它将使重构和调试更容易和更快。按照这两个代码设计的窍门,你将走上成为10x数据科学家的道路。

保持代码样式一致,与刚刚咱们说的保持命名约定同样重要。要得到一些基本的风格点,你应该坚持一种状况,不要在同一个脚本中混合使用驼峰式大小写和snake的命名规范,不然的话,你的代码很快就会变得难以阅读和浏览。另外一种你应该保持一致的方法是同一种任务要坚持使用相同方法。例如,要从字典中删除重复项,而且须要在代码的好几个位置处执行此操做,那么就不要仅仅由于在Stack Overflow网站上看到过就使用其余创造性的方法来执行操做。使用最清晰和最不聪明的方法来让你的代码和脚本保持一致。而且,我还要再次强调,一致性的目的是为了不让你本身和其余人混淆,这将有助于你更快地进行调试!(请注意,咱们这段话的核心是调试)。

还记住咱们刚刚谈到的,必须在代码中的多个地方删除字典中的重复项吗?使用函数,你就不须要屡次重写代码。固然,即便你不重用代码,把代码封装在函数中也是相当重要的最佳作法。你的函数应该很小,小到只能作一件事情,以即可以重复调用。

当你不使用函数时,常常会有有全局变量致使命名冲突,代码不可测试和代码的不断重复。

经过使用函数,你的代码就能够自由组合,更易于编写测试单元。

可是不要仅仅止步于写一些只作一件事情的小函数,请务必抽象你的函数,以便从新使用它们 - 这样有助于下降代码冗余度,并能加快你的开发时间,这样作下去至少让你成为一个2x 程序猿。

尽管不太常见,但代码设计中很重要的一点是使用桩代码。桩代码是简单的mock类以及函数,能够显示输入,输出和注释,并为代码提供一个大纲。在你开始实际编写代码以前,使用桩代码会让你先考虑代码,并能够帮助你避免怪异的意大利面条式的代码。你会注意到你在编写代码以前有哪些重复的代码,而且会考虑最合适的数据结构。

上面的代码示例给咱们展现了注释和文档。要真正成为一个被同事喜欢的程序猿,并提升本身做为一名数据科学家的效率,就要会写有用的简明扼要的注释。这不只应该包括关于代码段的注释,还包括其输入和输出。

此外,关于docstrings可能最酷的是,它们能够经过大多数语言的库转换为文档。例如Python有一个名为Sphinx的库,可让你将docstrings转换成完整的文档。

你如今可能知道你的代码是什么,但当你尝试调试或添加函数时,你和其余人将很是开心有注释。

不管你使用什么语言编写代码,请记得使用异常处理,并为你本身,同事和最终用户留下有用的错误信息。上面的代码显示了一个中止函数,可以传递来自正在调用的API的错误消息。

若是数据不是API须要的,那么它就会引起一个有用的错误消息。在你本身的代码中,你能够在中止函数中写一个消息,帮助用户:

stop(paste0(“Make sure all your inputs are strings: ”, e))


以上示例来自“Hitchhikers Guide to Python”,它使用Python测试库Pytest。

尽管编写测试单元对于开发人员来讲至关广泛,但这在数据科学领域却不多使用。固然,你可使用交叉验证,混淆矩阵和其余方法来验证你的模型。 可是,你是否测试了正在为你获取数据的查询? 你使用的各类方法是如何清理和转换数据的,你的模型须要它们吗? 这些方面对于安全防范“Garbage in, garbage out”(小编注:这两个单词的意思是,若是将错误的、无心义的数据输入计算机系统,计算机天然也必定会输出错误、无心义的结果。)相当重要。 当你测试代码时,不只这两个将来的证据能够反映可能引入错误的变化,并且当你有能力本身给本身检查代码时,每一个人都会认为你就像一个摇滚明星同样耀眼,由于一旦代码被用于实际生产就会发现bug很是少。

为你的项目使用版本控制是成为10x数据科学家的重要一步。这最明显的好处是保存模型的不一样版本,既能够轻松地进行团队工做,也能够经过在存储库中使用版本控制进行备份,防止在笔记本电脑被盗或硬盘驱动器坠毁的状况下丢失工做。

在beta版中,有一个名为Data Version Control的开源数据版本控制项目,对于数据科学工做流程来讲看着颇有但愿。 它依靠Git,并容许经过构建数据依赖图来跨团队重现项目。你的数据会与你的模型分开保存,它与其余版本控件同样工做,容许你回滚到之前保存的备份。

10x开发人员知道使用正确的工具来完成工做,不管是使用库来节省时间,切换语言以实现性能,仍是使用API,而不是本身从头构建解决方案。

比方说你如今有一些Twitter或其余社交数据要用来进行情绪分析。一个选择是本身标注数据,训练本身的模型,另外一个则是使用预先训练的模型。不去本身创建每一个数据模型来从新造轮子是很薄的。使用最适合工做的工具,即便这意味着使用你没有构建过的工具。

咱们都写过一个与Cron工做配对的Bash脚原本自动化一些报告,可是,在你花费一些时间尝试调试由Cron自动执行的其余人撰写的报告时,你甚至不知道它在哪里运行,你会意识到必须有更好的方法才行。经过使用自动化工具,如Puppet,Chef,Ansible或任何其余流行的自动化工具,你就能够从集中的位置运行你的工做,所以调试他人(或你本身)的工做就能快不少。

有时你可能找不到一个团队来负责你设计的模型,这个时候就须要知道如何本身部署本身的模型。


虽然上面那副图中的提供商之间有不少差别,但它们包含了从难以置信的易用性到你须要的更多的设置和知识。本节的内容其实能够单独成为一个话题。若是你想了解有关模型托管的更多细节,能够查看咱们的其余几个不一样的报告,分别介绍部署模型(https://blog.algorithmia.com/building-intelligent-applications/ )以及部署和扩展你的深度学习模型(https://blog.algorithmia.com/deploying-deep-learning-cloud-services/)。

多是致命伤的事情:

  • 易用性

  • 成本(包括附加组件和隐藏成本,如托管数据)

  • 投标人锁定

  • 语言可用性

经过了解如何部署模型,你才有能力经过数据来说述故事,轻松地与团队成员共享(无论使用哪一种语言)或将其部署到生产环境中,从而与数千用户共享。这将帮助你成为10x-er,由于一旦了解了这一点,你就能够建立更多性能更高的模型,使用户开心。当用户开心时,企业主就会开心。

成为10x数据科学家的技巧

为了让这篇文章圆满,这里有一些关于如何成为10x数据科学家的最受欢迎的技巧:

  • 模式匹配。这来自于之前遇到相似问题并意识到能够重用或修改当前问题解决方案的经验。

  • 了解如何解释你的代码 - 给本身和其余人。 这意味着你能够在白板上,作/获得代码甚至协同编程。要习惯于谈论你的代码和思考过程。

  • 了解如何/什么时候退出并从新开始。若是你意识到有一个更好的方法来解决问题,那就不要惧怕从新开始。最好就是从新开始,作一个更好的方法来完成,而不是放出一些不是最佳或高性能的东西。

  • 建立你本身的Gists库,或经过GitHub或其余托管服务的存储库组织代码片断。

最后,回顾整篇帖子,如何成为一个10x的数据科学家和如何调试实际上是相同的主题。 每一个10x的开发人员均可以想象成一个主调试器,由于这个规则就是不管你的代码多长,你均可以将它乘以10,并获得你须要调试的时间。 成为一个很好的调试器的一个窍门就是使用异常处理,你能够在IDE中使用调试器,你能够经过代码查找逻辑中的错误,并检查涉及错误的库的源代码,以确保你正在传递代码须要的内容。

即便你从这个帖子只获得了几点收获,恭喜你,你已走上了成为10x数据科学家的道路。

固然,能不能抵达道路的尽头,就看你本身咯。


做者 | Stephanie Kim

https://twitter.com/StephLKim 

相关文章
相关标签/搜索