某上市公司 Machine Learning Engineer的 Data Scientist跳槽总结
准备方向
lz现在大厂搬砖,title是Data Scientist,统计小硕,小于五年工作经验。想要做ML/modeling相关的工作,没有考虑analytics职位。前期准备是为了最大化拿offer的概率:
- 刷题:leetcode刷了大部分的easy,小部分的medium
- 统计概率:基本功,master level的数理统计和概率要熟练掌握
- ML/modeling: 看书复习
- SQL:刷了leetcode里面的easy和medium,还好申的职位都没有考SQL,lz并不会写花式sql
- A/B Testing: Udacity那门课,看paper和blog,听课
- Product Sense:公司的blog,paper,tech talk, 试用公司产品,以及听课
- 面经:glassdoor和地里能找到的都看了
- Behavior: 常见的问题自己准备了份答案,要面公司的mission什么的,以及亚麻的 leadership principles 有几条很好用
面试体会以下都是前辈和朋友们教给我的:
- (纯感慨) 乔帮主2005年在斯坦福毕业典礼上讲过这样一段话:"You can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something – your gut, destiny, life, karma, whatever.” 好几年前lz纯粹因为好玩去学了一门外语,最近几年还在每天学习一点点,防止完全忘光。这次面试,这门外语居然帮助我回答了好几个不同的问题,一些行为问题,和PM聊他的工作,和hiring manager聊team match。和这门外语的native speaker 同事聊到面试经历的时候,我想到了乔帮主的这段话。
学习资料
声明:评价基于个人感受,每个人背景不同,适合我的不一定就一定适合你
免费
书
付费
- Andrew Ng DL specialization on coursera(当时只有前三课)讲的浅显易懂,感觉偏基础。DL这块lz都是在自学,所以这个系列还比较适合lz,面试中也用学到的一些基本概念扯扯淡。
- Leetcode subscription: 公司tag很有用
时间管理
Goal: 尽量在同一时间拿到所有offer,方便讲价
- 考虑跳槽的时间。多和小伙伴们打听各家的流程及速度。如果哪家出了名的慢,要先申请。接下来是假定各家公司进度正常。
- 制定学习计划
- 在准备差不多 2/3 的时候,投简历。最好能找人内推,一般会在一个星期内之内被recruiter联系
- 跟recruiter问清楚流程,计划好接下来的时间
- 看情况该拖延就拖延,一切为同一时间拿offer为主
- data chanllege 不少会给48小时,最好安排两个整天做这个。早上收邮件,这样子最后时间不够,还可以选择熬夜。
- 如果前面安排合理,收到onsite通知会在差不多的时间。拿到第一家onsite,就可以催下别家
- onsite也是要尽量安排在一周或者两周之内,但是也会有某家安排特别慢或者临近假期,非常难安排的状况,最好错开大家都去休假的时段。onsite安排的远一点是可以的,跳槽的人直接请一周假会不那么可疑。之前在medium上看到一篇五天面五家的帖子,万分佩服。onsite之后可能会非常累,也要考虑自己脑力能不能承受密集的面试。
- onsite之后通知结果,recruiter非常喜欢打电话说。安排通话时间也是可以拖几天的。同样,可以拿第一家offer催别家。
- recruiter会问你别家给了什么数,如果是在同一时间出结果,你可以坦诚的说还在等。一定要让对方先给数字,information is power
战线不宜拖得过长,人会过于疲惫。这里面运气成分也不少,人算不如天算
讨价还价
[面试经验] Data Challenge
data challenge 我听说过的,有 analytics,modeling,ab testing 三个大类的(如有遗漏,欢迎补充)。Analytics的职位我没有投过,没有经验讲。AB testing 这个实际应用水比较深,还是挺看经验的,也不在讨论范围。此文着重 modeling
前期准备
- 可以通过看别人的经验贴,某本电子书,翻以前ML project相关作业的report,和朋友请教经验等等方式了解这个东西大体应该怎么搞
- 常用的code可以提前准备了好,例如 LaTeX 写报告的模板,写报告常用语句,EDA 相关code,常用模型的code
- cheatsheet手边待用
- 想好modeling的大体思路,先检查data,画各种图,选定evaluation metric,train一到两个model,检查结果,写结论
时间安排
- 大部分 data challenge 会给 24 或 48 小时,可以和recruiter商量好时间接收。我当时是第一天早上十点接受,保证收到立马开始进入工作状态,时间不够用的时候还能熬夜赶工。
- 为了几家公司进度差不多一致,我九天之内做了三个(累觉不爱):一个周末两天,周中请假两天,接下来的周末两天。
- train model的时候需要考虑train的时间。我碰到有个数据量比较大,R跑起来特别慢,中途换了python。
几点注意
- 解释你的选择:为什么数据这么清理,为什么feature这么搞,为什么用 model A,而不是 model B,为什么用这个metric,为什么做这个假设
- 不是特别常见的 model 可以简单解释下原理,毕竟批卷子的人也不可能什么都懂。当时直接调别人一个现成的包,用了不太常见的一个model,reference按规矩写好
- 个人偏好加一个future work,说一下如果时间充足,你还打算做什么,以示考虑充分
- Summary/Conclusion 这个前面帖子lz已经强调过了,是一定要写的。通过你的模型,发现了什么。最好能给出 actionable insights (是的,这词很俗。换位思考,公司出 data challenge 是想考察你解决问题的能力,而不是调包的能力。
[面试经验] Data Challenge套路
大多数招DS的公司都有这个环节,我也是从去年找实习的时候做一个takehome跪一个到现在基本都能拿到onsite,来分享一下经验也给自己攒点运气。因为很多公司都不能share data,所以就不说具体的问题了,但是其实data challenge都大同小异,给一个或者几个data和几个business problem,让建模来解决。有的公司让提交report和代码,也有的公司是提交ipython notebook或者r markdown。我以前都不太能抓住重点,觉得takehome给的时间不长data也不算太大,所以总是想做点fancy的其他人想不到的东西,于是很多时间都花在并不熟悉的模型然后fit数据急急忙忙给个结果,report也并没有写的很详细,每次挂了OA都没有feedback所以也一直不知道是哪里做的不对。后来给machine learning当TA,判学生project的时候看了很多栗子才开始思考怎样才算很好的处理数据和展示结果,就总结了一些我现在用的套路希望可以帮到大家。
我一般会把report分成几个部分:
-
Problem Overview 用自己的话复述问题介绍一下给的数据,最好能讲一下这个问题可以给公司带来哪些opportunity。
-
然后就是数据处理阶段了,数据处理应该占绝大部分的时间。列出来都有哪些variable,他们的类型,给出descriptive statistics summary,然后看分布找outlier看看每个variable的missing value比例,也要做multivariate study,看feature之间的联系,是不是高度相关可以互相代替,然后也要看看每一个feature和response variable的关系,哪些在data exploration阶段就可以看出来非常significant,哪些看起来像是noise。这一部分可以画很多图来给出直观的展示。
-
接下来就是建模了,其实在第二阶段impute完missing value去掉outlier做好这些preprocessing之后建模阶段很简单,先挑一个简单易懂的当做baseline model,然后定义好拿什么当evaluation metric看一下baseline performance,然后就可以套各种常规的或者fancy的model挨个看performance,选top的几个model继续parameter tuning,然后可以继续处理feature,比如说去掉correlated或者纯noise的feature,也可以自己加一些interaction term,比如建一个新的variable,X1*X2。这种就是interaction term看看能不能提高model performance。最后选模型的时候能给出合理理由就可以了,比如evaluation metric特别高,运行速度最快,模型比较好解释,在各种情形下非常robust。基本上没有正确答案的,解释的能让人信服就可以了。
-
最后不要忘了conclusion。夸一下final model的优点,如何可以解决现有问题,最好可以结合公司业务讲一下business value,再给一下未来可以继续做的问题。
Becoming a Machine Learning Practitioner
上图来自Google 2015的论文,图片里面很小的黑色矩形是ML算法,其他部分是围绕算法的很多其他成分。
业界做ML,当然有算法的成分,有些公司也有很高深的算法(比如Google),但是工程的成分其实经常会远远,远远的多于算法,在一个激灵想出来的算法能真正落地给业务产生impact之前,有大量的工程方面的设计和考虑。好的大公司也在纷纷构建自家的机器学习平台让ML的投产变得更容易。
但是这些需求在学校ML课程里面很少被提及,给人的印象就是,做ML就是“调包,调参”。但是实际工作里面调包和调参的时间比例可能也就10-20%…
为什么发这篇帖子,也是来自于之前一直在DS领域总结学习,希望持续分享自己学习的历程,求讨论
Why this post
It’s an opinionated list of core skills that I found useful in the daily work of a machine learning practitioner, in the tech industry. I am not a researcher and am not interested in becoming one, so the list does not go in depth into any active research domain.
需要强调的是,我不是做ML科研的,也不想做科研,所以本文就是于业界做ML的大家交流讨论,并不打算深入任何科研领域,请做科研的大牛轻拍。
另外这篇内容也并不会多完备。机器学习领域大牛很多,领域很广,应用更是广阔到难以尽数,所以不求尽善尽美,只是抛砖引玉,求交流学习。
本文适合什么人
0. Who is this for
This is a practitioner’s approach. Researchers: This post is not for you. 不是给ML方向做研究的人;牛人路过就好,不喜勿进。
-
Data analyst: you don’t need this.
-
Data scientist who’s more junior in modeling or focuses on causal inference: 3, some of 4.
-
Machine learning scientist: 2, 3, expert knowledge of 4,
-
Machine learning engineer: 1, 2, some 3, good knowledge of 4, 5, some knowledge of 6
-
Machine learning systems engineer: 1, 2, maybe 3, some knowledge of 4, expert knowledge of 5 and 6
1. CS Fundamentals 计算机基础
论坛这些资料也有人分享,比如 分享九章大数据,九章Python视频课程资料
Operating System (Book: Modern Operating Systems)
2. Programming languages 编程语言
为什么与上一节计算机基础分开来说:因为老是遇到同学说我会numpy啊为什么你说我基础不行。。。。实际上是可以在不太懂基础的情况下楞刷题,或者写些基本能用的代码的。但是稍微深一点的地方会感觉基础知识的缺乏会让人难以在ML道路上上升到一定高度。
Must have :Python, Java
必须一门Python(因为ML好多framework就是python),和一门compiled language.
仅仅只会python,作为scientist是够了,作为engineer就会有显著差距。
Good to have: C++ 不一定是必须的。但是如果做的工作对速度有比较强的要求,那还是需要会C++的
Will likely encounter at work: scala/go/js 这些看每家tech stack不一样,会有不同涉及。遇到了再学即可。
Will likely encounter in academic settings: Matlab/Octave, R, Julia 这些是学校里面用的多,我至今(2018年底)没看见公司里面用julia的。
3. Math Fundamentals 数学和统计基础
Linear algebra 线性代数,必须的
Calculus 这个大家应该都上过
Optimization 优化:必须的
Statistics 基础统计(不是概率论 which is also good to have,这里是特指统计)
(real analysis and functional analysis might be useful, but is not required)
有空的话学实分析和泛函也可以,但是不是必须的
4. Machine Learning, from intro to advanced
这部分稍微区分一下从入门到进阶
4a. Intro 入门
4b. Advanced 进阶
- 前面几门主要还是supervised learning,下面这门稍微宽广一点,并不完全是ML,但是也是因此感觉对知识面和 落地 有帮助
Data mining & other topics: Mining Massive Data Sets http://web.stanford.edu/class/cs246/
经典不必多说,CS角度 Pattern Recognition and Machine Learning