做者 | William Koehrsen
翻译 | Mika
本文为 CDA 数据分析师原创做品,转载需受权面试
若是现代工做面试教会了咱们什么,那就是关于“你最大的弱点是什么?”这个问题,正确答案是“我工做太努力了。”显然,说出本身的弱点是很好笑的。虽然在我的简历中列出弱点不太好,可是若是不认可本身的不足,咱们就没法采起措施改善它们。编程
作出改进的方法很简单:安全
明确如今的位置:找出弱点网络
想变成什么样:制定实现的计划框架
执行计划:一步步改进机器学习
咱们不多能跨越第一步,特别是对于在技术领域工做的人群。咱们埋头苦干,不断工做,使用已掌握的技能,而不是得到哪些能让咱们工做更轻松或能带来新机会的新技能。自我检讨,客观地评估本身,这彷佛是一个陌生的概念。但若可以退后一步,弄清咱们哪些方面能作得更好,从而在该领域取得进步,这是相当重要的。函数
考虑到这一点,我试着客观地评价本身,并总结了目前本身的三个弱点,改善如下这几点能让我成为更好的数据科学家:工具
软件工程单元测试
扩展数据科学学习
深度学习
本文中我列出这些弱点主要的目的在于:首先,我很是想提升本身的能力,经过列出本身的不足以及如何解决它们,但愿可以激励本身继续学习,完成目标。
其次,我但愿鼓励其余人思考本身有哪些没掌握的技能,以及该如何获取这些技能。
最后,我想告诉你,成为出色的数据科学并不须要作到无所不知。关于数据科学和机器学习的知识是无线的,你可以掌握的是有限的。我经常听到初学者抱怨,要掌握的知识太多了,我给出的建议就是:从基础开始,你并不须要掌握全部内容。
对于每一个弱点,我都列出了具体的问题,以及我目前在作什么进行改进。发现本身的不足很重要,但制定改进计划也一样重要。学习一项新技能须要时间,但计划好一步步的具体步骤会大大增长你成功的概率。
1. 软件工程
在大学时进行个人第一个数据科学项目后,我开始试着避免一些数据科学方法中的坏习惯。其中包括编写仅运行一次的代码,缺乏文档,没有一致性且难阅读的代码,硬编码特定值等。这些都是写论文所带来的,为了写一篇论文,开发针对特定数据集且只能运行一次的解决方案。
其中一个典型的例子是,咱们有个项目使用建筑能源数据,最初每隔15分钟获取一次数据。当咱们把时间增长为20分钟时,数据管道彻底崩溃了,由于许多地方已明确将时间编为15分钟。咱们不能进行简单的查找和替换,由于该参数被设定为多个名称,如electricity_interval
timeBetweenMeasurements
还有dataFreq
。咱们当中没有人想过让代码更易阅读或可以灵活改变输入。
相比之下,从软件工程的角度来看,代码必须使用大量不一样的输入进行测试,在现有框架内工做,并遵照编程标准,以便其余开发人员可以理解。尽管个人初衷是好的,但我偶尔会像数据科学家那样写代码,而不是像软件工程师那样。如今我正在训练本身像计算机科学家同样思考。
我在作什么
学习技能没有比练习更好的方法。幸运的是,在我目前的工做中,我可以为内部工具和开源库(Featuretools)作出贡献。这迫使我学习了不少技能,包括:
编写单元测试
遵循编码风格
编写接受更改参数的函数
完全记录代码
让他人检查代码
重构代码,使其更简单、更易于阅读
对于还未工做的数据科学家,你也能够经过参与开源项目得到这些经验。除此以外,你还能够经过查看GitHub上流行库的源代码。
像软件工程师同样思考须要改变思惟模式,但作到这一点并不难。例如,每当我发现本身在Jupyter Notebook中复制和粘贴代码并更改一些值时,我就会停下来,并意识到从长远的角度看用函数会更高效。
我还想研究计算机科学的许多其余方面,例如编写有效的实现,而不是用蛮力方法(例如使用矢量化而不是循环)。同时要注意想一会儿所有改变是不显示的,这也是我为何专一于一些实践,并将其融入到个人工做流程中。
虽然数据科学自成一体,但从业者仍能够经过借鉴软件工程等领域的最佳实践从中受益。
2. 扩展数据科学
虽然你能够自学数据科学中的全部内容,但要将其应用到实践中仍是存在一些限制。一个是难以将分析或预测模型扩展到大型数据集。咱们中大多数人没法访问计算集群,也不想为一台我的超级计算机掏钱。这意味着当咱们学习新方法时,咱们倾向于将它们应用于小型且表现良好的数据集。
然而在现实状况中,数据集并不符合必定的大小或干净程度,你须要用不一样的方法来解决问题。首先,你可能须要打破我的计算机的安全限制,使用远程实例(例如经过AWS EC2)甚至多台计算机。
在学习数据科学时,我尝试在EC2机器上练习,这有助于让我熟悉命令行,可是,我仍然没有解决当数据集大于机器的内存状况。最近,我意识到这一点限制了个人前进,是时候学习如何处理更大数据集的了。
我在作什么
即便不在计算资源上花费大量金钱,就能够实践超出内存限制的数据集的处理方法。其中包括每次迭代数据集的一部分,将大型数据集分红较小的数据集,或者使用Dask这样的工具来处理大数据。
我目前采用的方法是将数据集分为多个子集,开发可以处理每一个部分的管道,而后使用Dask或Spark,与PySpark并行地运行管道中的子集。这种方法不须要用到超级计算机或集群,你能够在我的计算机上并行操做。
此外,因为像Kaggle等数据存储库,我可以找到一些大型的数据集,并查看其余数据科学家的处理它们的方法。我已经学到了不少有用的技巧,例如经过更改数据框中的数据类型来减小内存消耗。这些方法有助于更有效地处理任何大小的数据集。
虽然我还没处理过TB级的数据集,但这些方法帮助我学习了处理大数据的基本方法。对于最近的一些项目,我可以运用目前学到的技能对在AWS上运行的集群进行分析。但愿在以后的几个月,我能逐步提升处理数据集的大小。
3. 深度学习
虽然人工智能在繁荣和萧条中更迭,可是它最近在计算机视觉、天然语言处理、深度强化学习等领域的成功应用让我确信基于神经网络的深度学习不是昙花一现。
与软件工程或扩展数据科学不一样,我目前的职位不须要用到深度学习,例如随机森林等传统的机器学习技术已经可以解决全部问题。可是,我认识到并不是每一个数据集都是结构整齐的,而神经网络是目前处理文本或图像项目的最佳选择。
在深度学习中有许多不一样的子领域,很难弄清楚哪些方法最终会胜出。尽管如此,我认为熟悉该领域可以让人们可以处理更普遍的问题。
我在作什么
我学习深度学习的方法与成为数据科学家的方法相同:
阅读着重部署应用的书籍和教程
在实际项目中练习技术和方法
经过写做分享和解释个人项目
在学习一项技术时,最有效的方法是边作边学。对我来讲,这意味着不是从基础的基础理论开始,而是经过找出如何实现解决问题的方法。这种自上而下的方法意味着我更重视关于动手的书籍,即当中包括许多代码例子。
对于深度学习,我主要看了如下三本书:
Deep Learning Cookbook,做者:Douwe Osinga
Deep Learning with Python,做者: Francois Chollet
Deep Learning,做者:Ian Goodfellow、Yoshua Bengio、Aaron Courville
前两本重点是用神经网络构建实际解决方案,而第三本重点是深刻理论。当阅读有关技术主题的书籍时,你须要更主动参与其中,尽量试着书中的代码。像前两本提供代码例子的书籍很棒,我常常会在Jupyter Notebook中逐行输入代码,弄清当中的原理。
此外,我不只试着复制这些代码,还会将它们用于本身的项目。这方面的一个应用是我最近构建的图书推荐系统,该系统是根据Deep Learning Cookbook的相似代码改编的。从头开始建立本身的项目可能会使人生畏,但这也是提高本身最好的方法。
最后,学习技术最有效方法之一是教别人。只有当我试着用简单的术语向其余人解释时,我才能我彻底理解这个概念。随着学习深度学习的每一个知识,我将写下了,分享当中的技术实现细节和概念性解释。
教学是最好的学习方式之一,我打算将其做为学习深度学习的一个重要组成部分。
结语
罗列本身的弱点可能会有点奇怪,但这能让我成为更好的数据科学家。并且,我发现不少人,包括雇主们,会对你坦诚本身的弱点并探讨如何解决它们留下深入印象。
缺少某些技能并非缺点——真正的缺点是伪装你什么都懂,并且没有想改进的意思。
经过发现我在数据科学方面的弱点:软件工程,扩展分析/建模,深度学习,个人目标是提升本身,鼓励其余人思考本身的弱点。要成为成功的数据科学家,你并不须要什么都懂。虽然反思本身的弱点多是痛苦的,但学习是愉快的:最有成就感的事情莫过于,通过一段时间的持续学习后,你会发现本身比刚开始时已经懂了不少。