最近几年Data Science/Machine Learning在北美火红,许多原本在学术界
的理工博士生或博士后,在决定放弃学术研究的时候都选择了转行到业界当
data scientist.这篇心得分享我会以非CS领域理工博士毕业生的角度去写
,但是如果妳/你只有master degree也不需要直接End,这篇提到的东西我相
信大部分应该还是有用的.
很多人都在问,要当DS是不是要有PhD才可以?我只能说,有PhD当然会有优
势,但它不是必要条件,这几年美国DS中master degree的比例其实越来越高,
有兴趣的人可以去找The Burtch Works Study: Salaries of Data Scientists
May 2017这笔资料,2017年的时后,美国的early-career DS有64%是master
degree,PhD则是25%
先讲一下自己的背景和历程:
NTU: Bachelor and Master in Physics
University of Hawaii at Manoa: PhD in Astronomy
我大概在唸博士的倒数第二年开始犹豫之后是否要继续做天文研究,到了
最后一个学期才完全确定要转行.2017年3月才第一次在Coursera上
Andrew Ng的Machine Leaning课程,8月的时候博士论文口试,9月搬来湾
区找工作(秋季班毕业,OPT 2018年开始),结果这一找就是10个月...
我总共申请了超过350个工作(海投+内推),有得到回应(phone screen,
data challenge, OA等等)的公司总共19家(不包含没钱的实习机会),去了
8次onsite,最后在6月底拿到一个offer.我申请了100个工作后(2018年初)
才拿到人生中的第一次面试,2月的时找到了SF的一家只有6人的初期start-up
做没有钱的DS intern,到了3月中,凭著履历上面有个实习经历,加上自己
又另外做了不少Machine Learning Projects,我再度开始海投,从这个时
候开始我大概每投10~20家公司可以拿到一个面试.
以下分享我的心得
<心态>
首先,要有一个觉悟,现在有太多的aspiring data scientists,但是公司
普遍都想要有经验的人,导致竞争很激烈.现在的情况已经和4~5年前不一样
,在当时可能有个理工博士就会很抢手,但是现在,你必须向雇主证明你花
了很多时间做了他们有兴趣的Projects,你已经job ready,人家才会愿意给
你机会.千万不能抱持着一种"我才刚毕业而已没有业界经验,他们应该会谅
解,让我进去后学吧?"的心态.记住,外面有那么多人想要进来,你要凭什
么让雇主看上你?
Q:要有什么样的经历,公司才会愿意给面试?
最有用的经历当然还是实习.如果你离毕业还有一段时间,然后又已经确定毕
业后想转业界,赶快想办法找个暑期实习来做.如果没有时间这么做而且又无
法在毕业前找到工作的话,可以像我一样尝试找找小startup做自愿的实习(如
果经济上允许),AngelList上面有很多这样的小公司,对他们来说,缺人但是
没有钱,对你来说,缺的是相关的业界经验,所以算是一种互惠.但是在找的
时候一定要好好谈,确定这是你想要做的事,避免他们只是找你去打打杂,做
一些和DS不相关的东西.开始做以后还是可以继续申请全职工作,反正他们没
有付你钱,找到工作的话想走随时可以走.
另外一件可以吸引recruiter目光的事,就是自己去找数据来做project,并且
放进Github,LinkedIn,以及你的Resume里面.选择project的时候,是有针对
性的,仔细去想想什么样的产业你有兴趣,而那个产业都会怎么应用ML.举个
例,现在金融科技(Fintech)正夯,很多公司都会用ML来预测客户借了贷款是否
会还账,信用卡花费是否会定期缴清等等,如果你对这方面有兴趣,就应该去
找个这方面的数据来做个project,以贷款的问题来说,可以估狗LendingClub
dataset,就可以找到数据玩.若你对推荐系统(recommender system)有兴趣,
网络上也有各式各样的电影,餐厅,或著E-commerce的数据(推荐系统有分很多
种类型,就看你对什么有兴趣).又或是你对security领域有兴趣,那就想办法
去做一个anomaly/fraud detection的project.这边列举几个可以找到dataset
的地方:
Kaggle datasets: https://www.kaggle.com/datasets
UCI ML Repository: https://archive.ics.uci.edu/ml/index.php
当你做过了很多有针对性的projects之后,就可以依照申请的工作调整你
的履历,放一些比较相关的projects,我自己是在履历里面有一个部份叫
"Selected Data Science Projects",底下会放四个projects,并且附上
Githib的超连结,排列的顺序就按照和工作的相关性.如果有相关的公司
找你phone screen,这个时候就可以好好喇叭你是对他们这个产业多有兴
趣,所以你才会选择去做XXX
另外值得一提的是,很多公司在工作中都需要用分布式系统,像是Hadoop和
Spark,如果有时间可以上个网络课程学一下,然后再做个相关的project,
在找工作的时候会有加分效果,像我就有一个project是用Pyspark中的ML和
MLlib来做推荐系统.
Q:我应该去比Kaggle竞赛吗?
如果你很有时间而且又很强的话,去比个竞赛刷个奖牌我相信是有加分的.
也就是说,我个人觉得你若是不符合上述条件的话,我倒是建议不要太花时
间在竞赛上,因为比了也拿不太到好成绩.再来,真实工作跟竞赛其实是很
不一样的.比赛中往往accuracy差个0.001名次就改变了很多,比赛中为了让
预测更准,通常选手都会需要把很多models stack在一起.但是工作中通常
就比较少去计较这些,更重要的往往是如何从data中得到一些insight,以便
帮助决策或产品设计等等.
Q:Deep Learning好夯啊,LinkedIn上面看到一堆工作都要做Deep Learning,
我是否该多往这个方向去准备?
我个人是觉得多学无害,我自己也把Andrew Ng在Coursera上面的Deep Learning
课都上了.不过就是需要想清楚你想要的是什么类型的工作?Deep Learning通
常是应用在image recognition,voice recognition那些,重点在于算法而
不是analytics,所以这些工作通常需要的是真的有这方面背景的人来做,属于
硬底子的缺.你如果跟我一样,是属于非CS的理工硕博士,应该在这方面没有
太多经验,相反的,你的优势在于对问题的解决能力,对data的灵敏度和分析
能力.尽量集中火力去申请那些偏向传统ML和analytics的工作,可能才是一条
比较容易的路.
Q:申请的公司给了Data Challenge,做的时候要注意什么?
如果你已经有自己做过一些ML projects的经验,这个关卡应该是属于容易的
部分,通常data challenge都是用jupyter notebook来做,把code写干净,
文字说明写清楚,整个project把各段落分清楚,像是data exploration,
data cleaning/processing, feature engineering, model tuning, results,
conclusions...等等.然后公司对于给你的challenge一定会明列他们的要求,
交出去之前确保各项要求都有达到,通常就不会有太大问题.有一个电子书叫
A collection of data science take-home challenges,里面有一些不错的资
源,大家可以参考看看.但是缺点就是有点贵,然后里面的范例是用R写的不是
python (no offense to R users XD)
Q:该如何准备面试?
DS的面试不像software engineer那样比较有固定的方向去准备,因为不同的
公司对data scientist的定义都不同,你如果问我面试都在问些什么,我只
能说depends on the company,也因为如此,找DS工作的人有一堆东西要唸,
但是大致上就是分成几类:
(1) Machine Learning
(2) Statistics and Probability
(3) Coding
(4) Non-technical questions
Machine Learning
个人觉得单纯的Machine Learning问题算比较好准备的,考的通常是基础概念
和你实作的经验,不会有人要你在白板上推导公式.不过一种很常见的考法是
case studies,考的是你的应用能力,这个部分就比较难准备,而且也很难猜
题,能做的就是到网络上去找各式各样的题目来多想,去面试之前,一定也要
去想,这家公司需要解决什么问题.往往case studies的题目就是他们的DS
team在工作中常面对的问题.
Statistics and Probability
各种基本的统计概念一定要熟练,个人很推荐PennState的online statistics
课程资源: https://newonlinecourses.science.psu.edu/statprogram/
每一个课程都有Online Notes可以看,是很好的参考资料.另外我也非常推荐
这个youtube频道: https://www.youtube.com/user/jbstatistics/playlists
这个作者的口齿非常清晰而且各种观念都解释得很清楚
就如同Machine Learning的考法一样,统计的题目除了考基本观念外也很长考
case studies.机率的问题的话就比较像是脑筋急转弯,最好的练习方法就是
在网络上找probability interview questions,多练习多想.
Coding
很多人都有类似的疑问:申请DS的工作到底需不需要像software engineer那样
刷题? 我的答案是:面试会不会考algorithm,还是那句老话,depends on
the company.很多公司会考,但也还是有公司不考.身为一个求职者,你当然
还是需要准备,不准备的话等于是放弃掉很多机会.但DS的coding题并没有像
SDE那么难,基本上就是刷Leetcode的easy和medium就可以了,而且一些特殊数
据结构像是Linked List和Tree也不太会考,最爱考的就是array和string的应
用,这就包含了binary search, sorting, queue, stack, two pointers, hash
table, recursion…等等算法.dynamic programming和greedy则是没听说过会考.
然后我也碰过重点放在object-oriented programming的coding test,也就是考
你会不会写class,不过用到的算法其实也是上面提到的那些.
至于SQL,在我面试的所有公司中只有在一个OA和Google的video interview中碰
过,会在面试中考SQL的通常是Google,FB这种大公司,因为这些大公司的工作通
常分得很细,他们的DS职缺可能比较偏data analysis,会需要你常常做一些复杂
的SQL queries.而一般公司的DS通常就是直接考你python coding,不是说工作
中用不到SQL,是因为他们觉得你如果coding能力都没有问题的话,SQL应该只是
小case而已.平常练习SQL的时候,一定要练习用window functions:
https://dev.mysql.com/doc/refman/8.0/en/window-functions.html
原因是很好用,很多复杂的queries用了window functions后就变得非常简单.
Non-technical questions
电话面试会问的non-technical问题基本上都大同小异,准备的方式就是事先编
好你的故事.故事的内容是真是假都没关系(但是不会的东西不要假装你会),反
正面试官也无法查证.最常问的就是:
(1) 请你简单介绍一下自己
(2) 为什么想(离开学术界)当data scientist/machine learning engineer?
(3) 对我们公司了解吗?为什么有兴趣申请这个职位?
有少数的一些公司还是会问比较老派的制式化情境题,例如:
- What is your ideal workplace?
- What is one challenge you've had to overcome in your current role?
- Give me some examples of your experience in a team.
- What was a conflict with co-workers that you had to overcome and
how did you do it?
- What was your biggest success in your current role?
.
.
etc
虽然有这么多不同的情境题,但是你会发现它们都可以归类成几个大类,像是
工作环境,团队合作/同侪相处,解决问题或面对挑战,成功或失败经验等等.
每一个类别都可以想好一个故事或是例子,接到问题后再适当地把答案导向你事
先想好的故事就可以了.
一定要对公司做足研究,去了解他们的产品或服务,在onsite面试的时候要表
现出一种"我对你们很有研究,因为我非常有兴趣"的态度,当你做过研究以后,
面试官如果问你为什么有兴趣来我们公司,你才有办法言之有物,并且问出一些
有深度的问题.我认为在面试中问问题是很重要的一环,不管在phone, video或
是onsite interview之前,都一定要先准备好一些问题在面试的时候发问,除了
一些技术性或公司运作方面的问题外,也可以多问一些让面试官发表他们想法的
问题,例如:What do you enjoy about working at XXX? What is your
expectation for a new data scientist to this company? What is the
project you are currently working on? 等等.
People love to talk about themselves! 你让面试官讲得爽,你被录取的机率
也会提高一点点.面试之前如果有拿到面试官的名单的话,每个人都要去LinkedIn
看一下他们的背景(LinkedIn帐号记得设定隐身XD),面试交谈的时候,偶尔可以
看似不经意地说一些话,让他们觉得你跟他们有共同点(哪怕是一点点也好),不
过要注意不要太刻意太假就是了.
Insight Data Science Fellows Program (非博士可以略过这段)
这个program是一个只收博士学位的boot camp,应该有不少唸博士的人知道,
因为这几年太多博士想要变成data scientist,加入Insight的门槛也变得越
来越高,申请者已经不能抱持着去学习的心态,你必须让他们觉得你已经有
实做ML/DS的经验,或是至少要让他们觉得你已经花了很多时间去学习和了解,
而且不是只有技术层面,你对于产业界是否了解也是面试中的一大重点.我去
年申请2017年9月的session失败,所以后来只好靠自己找工作.虽然我自己没
有申请成功,但是靠着我的求职经验还有我对这个program面试型态的了解,我
最近成功帮助了3位朋友进入今年9月的session (帮忙看履历,指引做project
的方向,以及帮忙mock interview),如果有人之后也想申请的话欢迎站内信
问我问题.
以上
希望我的心得对大家有帮助,祝各位都能拿到满意的offer!