机器学习算法工程师的面试经验

发布于:2019-05-14   编辑:admin 浏览:

  先介绍一下自己,本人是国内读的数学本科,北美top统计系硕士毕业,之后在FLAG之一的总部核心部门做数据科学家。期间面试过20-30名candidate。

  数据挖掘类的工作近期无论是在国内还是北美,都非常炙手可热,对于候选人的要求也相应地水涨船高。以我司为例,基本只招统计博士,不过非常优秀的统计硕士或不相关专业的博士也有少部分,本科生不招,对硕士的要求已经越来越高。从公司的角度来说,工作内容其实并不需要掌握这么多统计或机器学习的知识点,往往是在一个比较小的分支进行深入钻研(例如广告组的数据科学家可能需要优化CTR预测模型的一小部分,但是需要对这一部分非常了解)。我了解的一些(包括其他公司)组的工作内容甚至不需要进行太多数学建模或编程,以data insight为主,用到最多的是Hive/SQL。之所以公司的简历和面试越来越严格,有很大一部分原因是供过于求。大量专业的毕业生都对数据挖掘类的工作非常感兴趣,而实际上数据挖掘相对比较容易上手,所以求职者的数量远远大于公司的opening。

  当然,作为一名job seeker,既然现实就是越来越严格的简历筛选和越来越难的面试,那么能做的就是想办法让自己能够从众多求职者中脱颖而出,尽可能地提升自己综合实力。一是要让自己的简历能够stand out, 二是面试中的表现。

  关于简历,最重要的一点就是在一页纸上展现你能为这个公司这个职位做贡献的最突出的technical skills。数据科学家的简历属于technical resume,与普通的简历不同,要更突出自己的technical skills。大家可以多和有工作经验的数据科学教聊一聊,这样能更快地了解到业界所需和自己的不足,也能将自己的简历润色得更加贴近业界要求。

  很多面试者在onsite面试中的每轮都没有太大的不足,该回答的问题都答了出来,却没有如期拿到offer。这样的面试者不为少数,也正因此无法impress面试官。例如我自己当时面试的时候,自认为有两轮都答得很一般,甚至有一些失误,但是在某一轮中,我有一道问题的反应极快,很明显感觉到面试官被impress了。当然,这样的机会可遇不可求,可以做的就是提高自己的实力,hope for the best。

  Behavior question一般比较随机,最常见也是最重要的behavior questions就是你的简历。比如,我见到过有些candidate在前一两年full time工作的时候频繁跳槽,有的做了几个月就跳下一家,如果在简历上看到这样的经历,我也会顺便问一下为什么,因为我的concern是你会不会来我这里做了几个月也跑了,如果有类似经历记得准备好如何回答。

  很多公司的评分体系要求对于候选人进行全方位的评估,例如对于统计水平、编程水平、口头交流能力、业界经验都需要给出评价。因此要注意避免以下误区:只注重理论水平,不进行实际编程和项目;只注重技术,不与人打交道;只知道书本上的内容,不去了解业界的情况。相信如果已经面试过几家公司,你会发现在你介绍自己的课程作业和项目,甚至是Kaggle项目的时候,面试官都会告诉你,我们公司里面真的做的时候,数据量远大于这些项目,而且会有很多Kaggle项目和课程作业中没有的data problem,例如大量数据缺失、特征如何选择,甚至很多时候需要自己写程序提取新的特征。当然作为毕业生,面试官不可能要求你有太多这方面的经验,但是跟有工作经验的学长学姐了解一下,会提高你对业界问题的理解,是个huge plus。

  另一个有效的了解业界项目的方法是寻找相关的实习机会。即使是只有两个月的相关实习,都会对面试乃至将来的工作非常有帮助。如果能找到一份相关的实习,除了对于简历有帮助,还能在面试中让面试官跟你有的可聊,并且可以让你的表现更上一层楼。我有的时候会遇到题目出得不太难或候选人较强,候选人提前做完了所有的题目。当然这是一个好的迹象,表明这轮面试比较顺利,但是此时面试官总得找点话题防止尬聊,比如我会选择深挖候选人的实习经历或者即兴问一些工作中会遇到的问题看看候选人的反应。有一些候选人的technical skill非常强,但是说不清楚实习经历甚至是让我感觉简历造假,这样就非常尴尬了。如果对于我的即兴问题对方支支吾吾,给我的感觉就是这位候选人是背答案型选手,并不一定真的理解数据挖掘或者有实际数据挖掘经验。大家都是过来人,知道候选人都刷题,我作为候选人面试别的公司的时候一位面试官对我印象不错,跟我说你应该能进,刷题刷得很好。不是说不要刷题,而是说不能只会刷题,也需要沟通和业务理解。当然还有一些personality方面的因素,例如是否自信、是否对数据挖掘领域有热情等等,经验丰富的面试官对于这些都能感觉得出来,也很难伪装。

  面试的时候遇到做过的题怎么办?我们建议如果是一看就很有名的题不妨大方承认自己见到过,例如见到two sum,然后假装冥思苦想就没意思了,反而让人觉得不够诚实。如果面试官听到你见过,可能有两种反应,一种是那我们换一道,另一种就是没关系,告诉我你怎么想。如果是第一种,固然承担了遇到不会做的难题的风险,但是至少能让面试官觉得你很诚实,是个好印象。如果是第二种,那么就是你表现的机会了,即使是做过的题目,能够很快地写出bug free code并且给出清晰的解释,就是很优秀的表现了。还有一种情况就是这道题不算特别常见,例如leetcode上周周赛刚好做到,那么就没必要承认了,不然如果你leetcode刷完了跑去面试每道题都说见过,那面试官心里就一万匹神兽在奔腾了。这时候需要演一下自己没见过,但是不能演过头。例如你不能苦思冥想10分钟什么话都不说,然后突然“真相只有一个”开始在白板上写。你需要和面试官交流,首先给出很快能想到的brute force解法,但是不需要写代码,然后逐步改进,遇到比较难的坎可以让面试官给点提示。

  面试千万不要闷头想问题,要和面试官进行交流。真的卡住的时候可以要提示,因为有提示下做出来好于做不出来。一般比较nice的面试官都是会给提示的。遇到完全不懂的领域,可以大方承认不太了解。我在面试的时候遇到过问我网络协议的,我就表示完全不懂这些,不过计划下学期选个课之类的,对方就换了一道题,最后也拿到了不错的offer。很多面试官的理念不是用面试来卡你,而是用面试来了解你,因此要扬长避短。

  我们分为机器学习、统计、优化、编程、业界经验、自我介绍五个部分介绍面试的准备工作。

  Coursera上Andrew Ng开的machine learning是最经典的机器学习入门,另外建议把斯坦福的CS229包括作业都做一下。这门课的编程是MatLab,但是在实现过程中需要想清楚机器学习算法的数学部分,因此是个很好的训练。斯坦福CS229的好处是非常系统化,如果能够理解这里面的全部内容不但对机器学习有个大概认识,对其中每一个小部分都能比较solid,面试中不会出现类似于”Logistic Regression我大概知道思路,但是不知道具体的损失函数是什么,梯度怎么推导”的情况。此外,建议进行一定的编程练习,最好熟练掌握Python的sklearn用法。

  需要回顾一下参数估计/点估计、置信区间、假设检验的知识点。对于没有系统性上过统计课的同学会比较challenging。建议找一本统计的教科书看一下。重点在于t检验、卡方检验等。

  可能会有人推荐斯坦福大学的凸优化课程。个人认为是overkill了,这门课内容较为全面,远超过了面试和工作需要了解的。一般来说,对于梯度下降的各种变体之间的tradeoff有所了解即可,最好熟悉一下牛顿迭代,简单了解拟牛顿法(如L-BFGS等)的原理和motivation。

  数据挖掘类工作的coding要求不同于software engineer类工作。Leetcode上的前150题足矣。建议从easy刷起,medium都要会,hard可以不刷或者直接看思路不写代码。语言的话用Python即可。另外SQL需要掌握,一般准备两三天就足够了。如果你熟悉R的话,那么Python可选,建议熟悉一下业界常用的dplyr库中的select, aggregate等操作。

  如果有实习经验,那么就应该已经对业界的实践有所了解。否则的话,可以多与身边已经工作的小伙伴进行不透露公司机密的交流。

  当然,不需要了解业界的所有部分,但是需要知道大厂的数据都是远远大于平时的作业和项目的。如果掌握Hadoop、Spark、Hive等会比较好,也是简历上的plus。对于A/B test要有基本的理解。

  另外,做一些Kaggle上的项目有诸多好处:首先能为你的简历添加一些内容;Kaggle竞赛往往需要对数据进行很多exploratory data analysis,并且深挖数据,是非常实用的技能;增加不少写代码的经验和对建模流程的了解;为了获得较高的ranking, 需要进行大量的调参和error analysis;讨论区有很多大牛分享的方法和代码可供学习;面试的时候多一个谈资。

  一般面试都会以Tell me about yourself或者Can you walk me through your resume开始,面试官希望你在半分钟到一分钟之内简短地突出自己的优点,也就是我们所说的Elevator pitches。一般的模板是我是谁-》我以前做过什么-》我有什么值得一提的成就和technical skills-》我为什么感兴趣这个职位以及为什么我能胜任这个职位。每个人都是独特的,要根据自身情况量身打造属于自己的自我介绍才能吸引面试官眼球。