编者按:William Koehrsen是一位入职还不满一年的数据科学家。虽然刚步入社会,但他已经树立起危机意识,开始寻找自身缺点不断改进。正是因为这种自省精神,他的这篇文章引起了大批资深数据科学家的关注。
不认识到自己的弱点,就永远无法克服它们。
如果说现代工作面试教会了我们什么,那就是在回答“你最大的缺点是什么?”的时候,正确答案是告诉面试官:“我工作起来太拼命了。”这听起来有点像段子,但如果你真的把自己从头到脚批判一番,你也未免太滑稽了。面对求职就业,有谁愿意去谈论自己不会的东西呢?然而,虽然各大招聘网站在完善求职者信息时不会要求用户披露自己的缺点,如果我们从不承认自己的缺陷,我们就不能采取措施来解决它们。
努力让自己变得更好其实很简单:
找准自己现在的位置:找出缺点
弄清楚你的目标方向:制定相应计划
执行计划:一小步一小步慢慢积累
可惜的是,很多人连第一步都做不好:尤其是在技术领域,我们只会利用已经习得的技能埋头苦干,却不善于学习新的东西,让自己有机会去拥有一份更轻松的工作,或是抓住崭新的人生机遇。我们需要自我反思,所以有时候后退一步,去审视自己擅长什么、做什么更高效,对在任何领域提升自我都至关重要。
以我个人为例,我会在这篇文章中从3方面介绍自己曾经的弱点,并解释它们是怎么让我成为更好的数据科学家的:
软件工程
大规模数据科学
这篇文章的写作目的有三个。首先,我真的希望提升自己,所以我必须承认自己的弱点,找出它们的具体解决方法,让自己更有动力完成学习目标。
其次,我希望读者能受到鼓舞,开始去接触他们原先可能不了解的技能,并努力学习这些新知识。你不需要像我一样写文章梳理自己的缺点,但如果有机会能在新领域有所成就,在思考问题上花点时间绝对物有所值。
最后,我希望读者能明白,无所不知并不是成为成功数据科学家的必要条件。数据科学/机器学习领域的内容有很多,一个人不可能掌握其中的所有知识,可能有些公司会在岗位介绍里列上一大堆不切实际的要求,但如果你想成为一名实践数据科学家,其实你不需要完全掌握每种算法(甚至也请无视“5-10年工作经验”)。初学者往往会被这些“必须”学的东西压得不堪重负,对此,我的建议是:从基础开始,你不需要了解所有一切。
在数据科学领域,真正的“全科专家”屈指可数
1. 软件工程
当我还在大学读书的时候,我写了一篇关于数据科学和建筑能源审计的长论文,这是我第一个真正意义上的数据科学项目。从那时起,我就有开始意无意地纠正自己的一些编程坏习惯,比如编写只能跑一次的代码、缺少文档、代码混乱难以读懂、硬编码特定值……它们都是写论文的产物——那时我只想开发一个数据科学解决方案,而这个方案是一次性的。
举个典型的例子,这个项目用的是建筑能源数据,最初我把它的测量周期设为每隔15分钟进行一次。后来,我想把时间调到20分钟,再运行时管道就全崩了,因为有数百个地方已经把时间间隔明确定义成了15分钟。我也不能做简单的查找替换,因为我给这个参数设计了一大堆不同的名称:electricity_interval、timeBetweenMeasurements、dataFreq……在写代码前,我完全没考虑过会出现这种问题。
如果当时我有软件工程方面的技术常识,我就会知道要用不同输入对写好的代码进行广泛测试、要写文档、可以直接用已有框架、要遵守编码标准以便其他开发人员理解,上述问题就不会存在。所以我开始意识到,尽管我有最好的想法,但我有时并不能像软件工程师一样写代码,我需要让自己学会像计算机科学家一样思考。
解决方案
和学习其他东西一样,练习是掌握新知识的最佳途径。我很幸运,在为公司开发内部工具和为开源库做贡献的过程中,我有了很多实践机会:
编写单元测试
学习怎么遵循编码风格
编写能修改参数的函数
编写完整文档
让其他人审查我的代码
重构代码,使其更简单、更易于阅读
即便是那些还未进入社会的数据科学爱好者,他们也可以通过参加开源项目、阅读一些流行库的源代码(我爱Scikit-Learn)获取可靠的实践机会。此外,获得其他人的反馈也很重要,所以你最好能主动去社区找一些资深人士寻求建议。
像软件工程师一样思考意味着需要改变原有思维模式,如果你愿意静下心来慢慢思考,这其实并不难。举个例子,每当我在Jupyte notebook中复制粘贴代码并更改一些值时,我会停下来想一想:这里是否存在一种从长远来看更高效的方法?从结果上来看,虽然我的做法并不完美,但它们确实能让其他人更轻松地阅读我的代码,我在上面部署一些新东西也更方便。所以说,你读代码的次数应该比你写代码的次数多,因为在阅读过程中,你能以未来人的视角审视它的风格和文档。
当然,改变思维方式的好处不止如此。对很多数据科学家来说,编写数据分析的单元测试可能是件奇怪的事,但当你需要确保自己的代码能按预期运行时,你会发现这么做很实用。此外,许多linting工具也可以帮助我们检查代码是否遵循一致的编码风格。
我还想研究计算机科学的许多其他方面,例如编写有效的实现而不是蛮力解决。但是,我也深知自己不能同时改变所有东西,这一点很重要。这也是为什么我会专注于一些实践并把它们纳入我的工作流中。
虽然我们做的是数据科学领域的事,但学习软件工程等领域的最佳实践也能让我们受益颇多。
2. 大规模数据科学
虽然数据科学里的很多东西都可以通过自学付诸实践,但一旦涉及基于大型数据集建模,大多数普通人都负担不起那么高昂的硬件费用。这也就是说,我们在学习新技术时其实是有偏向性的,我们更倾向于把它们用于小型、表现良好的数据集。
不幸的是,现实世界中没有那么多实用的小数据集,更没有那么多整洁的数据集,我们得学会用不同方法来解决问题。首先,本地计算机肯定是不够用了,我们要学着使用远程机器,甚至是多台机器——这意味着我们要学会如何连接远程计算机并掌握命令行。
其次,即便解决了命令行问题,第二个问题是数据集大小很多时候会超过租用机器的内存,这在深度学习里更普遍,有时机器内存甚至都放不下一个样本,所以学会如何处理大型数据集非常重要。
解决方案
总而言之,钱不是解决内存问题的唯一方法。我们还有很多途径可以选择,比如一次只遍历数据集一个数据块、把大型数据集分成许多较小的数据集、用Dask之类的工具来处理大数据集等。
我现在在内部项目和开源项目上最常用的方法是把大型数据集分割成许多小的子集,开发可以处理一个分区的管道,然后用Dask/Spark/PySpark并行地运行子集。这种方法不需要超级计算机,也不需要集群——你甚至在个人计算机上多核心并行计算。之后,当我可以访问更多资源时,我就能用同样的方法进行扩展。
为了锻炼自己在处理大型数据集上的技巧,我也从像kaggle这样的平台上找到了不少非常大的数据集,与之相伴的还有一众数据科学家分享的精彩经验。通过阅读,现在我已经学到了很多有用的方法,帮助自己提高处理任何规模数据集的效率。
虽然现在我还没有很多处理TB级数据集的经验,但很多基础策略是通用的。可以肯定的是,未来的数据集都会只大不小,继续提高这方面的能力非常有必要。
美国国会图书馆的数据集大小“才”3PB哦
3. 深度学习
尽管人工智能在过去经历了繁荣期和萧条期,但近年来学界、工业界在计算机视觉、自然语言处理和深度强化学习等领域取得的成功让我深信——使用多层神经网络并不是一种炒作起来的“时尚”。
和软件工程、大规模数据科学不同,我现在的工作完全不涉及深度学习:传统的机器学习技术(比如随机森林)已经足够解决客户提出的所有问题。但是,我也发现,不是每个数据集都是整齐地以行和列呈现的,未来它们也可能是文本、图像,而神经网络是目前处理这些任务的最佳选择。我可以继续用已经掌握的技术解决问题,但是,特别是在我职业生涯的早期,适当做一些新的探索也很有练习价值。
强化学习的exploration/exploitation权衡也适用于生活
深度学习有很多子领域,现在我们还很难预测哪些算法、哪些库会最终胜出。尽管如此,我认为熟悉这个领域的操作可以让自己具备处理更广泛问题的能力。鉴于解决问题是驱使我学习数据科学的原因,在我的“技能栏”多加一项深度学习也会是值得的投资。
解决方案
我现在制定的深度学习学习计划和以前学数据科学时的差不多:
1. 阅读强调实践的书籍和教程
2. 在现实项目中练习技术和方法
3. 通过写作分享、解释自己做过的项目
对我来说,边做边学是学习新技术最有效的方法之一,也就是把学习基础理论先放一边,直接从找出如何实现解决问题的方法开始。因为我的学习方式是自上而下的,所以我找的学习资料也更侧重实践性,会包含很多代码。一旦我学会了这种技术该怎么用,我会再回归理论,以便更有效地理解和使用。
从实际情况来看,我应该算是个独立学习者,因为我没有能教我神经网络怎么用的同事,但在数据科学领域,由于具备丰富的开源资源和繁荣的社区,你永远不会真正孤单。对于深度学习,这三本书让我受益匪浅:
Douwe Osinga的《Deep Learning Cookbook》
Francois Chollet的《Deep Learning with Python》
Ian Goodfellow, Yoshua Bengio和Aaron Courville的《Deep Learning》
前两本书重点介绍了如何用神经网络构建实际解决方案,第三本书深入理论。阅读这类技术书的优点是可以把文字转变成生动的体验:只要有可能,你就可以随机用键盘码代码验证书里写的内容。
此外,我不单单是复制别人的代码,我也会做一些调整,使它们适合我自己的项目。比如最近我就在做一个推荐系统,它是根据深度学习书本里的练习代码改编的,虽然从头开始构建项目听起来有点令人生畏,但当你真正动手操作时,采用别人曾经做过的工作会方便很多。
最后,学习新技术的另一种有效方法是自己当老师,把它教给其他新手。根据我的经验,如果我不完全了解某个术语的概念,我是没法把它解释给别人听的。所以每当我在新学到了一些深度学习知识,我就喜欢写一篇文章,分享关于它的实现细节和概念性解释。
小结
我知道,袒露自己的缺点很奇怪,我在写这篇文章的时候也很不舒服,但我还是选择说出来,因为这能帮我成为一名更好的数据科学家。此外,我也发现如果你有自我意识来承认缺点并讨论如何解决这些问题,那么许多人,包括雇主在内,都会对你个人另眼相看。
缺乏技能并不是一个缺点——真正的缺点是假装自己知道一切,并觉得没有必要变得更好。
-
神经网络
+关注
关注
42文章
4765浏览量
100616 -
深度学习
+关注
关注
73文章
5495浏览量
121050 -
数据科学
+关注
关注
0文章
165浏览量
10048
原文标题:作为数据科学家,我有哪些弱点
文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论