资深面试官眼中的数据科学案例分析面试
数据科学岗位的面试会涉及到编程算法, SQL, 案例分析(case study) 等不同内容, 其中大家普遍反映最难准备的就是案例分析这类面试题目. 这类问题涵盖的知识范围很广, 而且根据公司和具体应聘岗位(Data Analyst, Data Scientist, Machine Learning Engineer)的不同, 案例分析面试的考察点又有很大区别, 这导致很多求职者在有限的备考时间内很难抓住重点.
我 (汪淼Jason) 博士毕业后在业界工作了近十年, 在硅谷一线大厂做过Data scientist和Machine Learning Engineer, 以面试官和hiring manager的身份参加过近百场数据科学岗位面试, 最近几年我也帮忙辅导过很多朋友跳槽或转行进入数据科学领域. 我把这些经验总结成了这篇6千字长文分享给大家, 希望能对正在求职的朋友们有所帮助.
在这篇文章中, 我首先会从面试官角度解析数据科学案例分析面试的考点, 然后通过一道我自己编的包含11个followups的面试题给大家展示不同职位面试考察形式, 最后会给大家提一些备考建议.
如果你想跟我一起体验数据科学面试流程, 为你指导面试备考或者答题过程中的问题, 欢迎报名参加Techie备受好评的数据科学集训营以及数据科学模拟面试服务. 我会用60+课时的时间,结合90+道数据科学面试真题, 以最高效地方式帮大家梳理数据科学知识体系, 并结合工业界级别的项目训练, 全方位提高大家的综合应用能力以及面试实战技巧. 如果你在数据科学备考或学习过程中有任何问题, 也欢迎扫描下方的二维码或者搜索 TonyCoding20 添加我的微信, 期待和大家的沟通!
1. 案例分析面试考什么?
数据科学案例分析面试在不同公司的不同岗位招聘中考点区别很大, 有时候甚至面试名称都不一样:
- 在Data Analyst or Business Analyst岗位面试中,它通常被叫做case study interview,涉及的内容包括统计理论、A/B testing实验设计、SQL、product sense等。
- 在Data Scientist or Machine Learning Engineer面试中, 它会被叫做machine learning applications/system interview, machine learning theory interview等等, 涉及的内容包括机器学习模型知识, machine learning workflow design等, 有时也会包括一些类似于软件工程师面试中distributed system design的内容.
在面试过程中, 面试官会首先结合具体的产品应用场景提出一个问题, 比如
[Data Analyst] How to evaluate the business impact of a new feature in Instagram Stories?
[Data Scientist] How to design a user targeting system to improve email click rate?
随后求职者需要在30-40mins的时间内, 通过与面试官的沟通, 给出一套完整的解决方案. 在这个过程中, 面试官主要考察以下3点:
- 分析问题的能力 - systematic thinking. 在case study面试中, 我们第一步要做的事情就是transfer the abstract business question to a verifiable problem with quantitative approaches. 求职者需要通过与面试官的沟通来clarify questions and define metrics. 很可惜的是, 很多junior求职者会忽视这一点, 经常在面试前5分钟问题还没定义清楚的情况下就开始在白板上写公式, 这种行为大部分情况下都是red flag.
- 对基础知识点的深刻理解. Case study面试在很多情况下也包含理论知识考察的部分. 现在极少有公司会利用填空选择题来考察机器学习理论问题, 但是面试官会在case study问题讨论中, 结合你选取的分析方法来针对一两个知识点做deep dive. 这里考察的知识点一般都是经典的机器学习基础知识, 不会涉及到很复杂的概念或者最近几个月新发布的研究成果.
- 数据系统设计能力. 优秀的case study solution一定是建立在一套完整的分析框架基础上, 它保证了我们在分析问题的时候不漏掉任何一个关键环节, 这在实际工作中也是非常重要的. 对于data analysis problem, 这个框架可能是A/B testing experimental design framework. 对于machine learning modeling problem, 这个框架可能是model training workflow. 建议求职者在备考时把常见的解决问题框架总结好 (在后文的具体案例中我给出了2个例子), 面试时甚至可以把这个框架直接画在白板上, 然后有侧重点地进行讨论. 很多朋友反映在case study面试时"无话可说", 出现这种问题的主要原因是面试时脑中没有一个预先总结好的框架.
以上讲的内容比较抽象, 下面我结合一道经典的recommendation system case study面试题来做举例说明.
2. 一道实战面试题 - 广告推荐系统设计
Interview Question: How to design a recommendation system to optimize ads efficiency on Facebook Platform?
推荐系统问题是case study面试的常见内容. 类似的大部分问题主要是关注在推荐系统content relevance & personalization的方向. 而这道题中又引入了在线广告这个场景, 因此考察角度会更加多样化. 这道题目中包含的11个followups来自于我在工作和面试中的经验总结, 基本包含了数据科学不同岗位(Data Analyst, Data Scientist, Machine Learning Sngineer)面试中的常见考点, 希望能给大家在面试备考方向上提供一些参考.
Q1: How to define "ads efficiency"?
这一步就是我在前面提到的"clarify questions and define metrics". 它在任何数据科学岗位的case study面试中都是重要环节. 在很多情况下, 面试官甚至会故意在介绍面试题的时候不给出清晰的metric definition, 而是希望求职者主动与面试官沟通来clarifiy这些细节.
回到这个问题, 对于efficiency的定义, 首先可以从每个广告推荐商品对应的engagement metrics入手, 包括: impressions, clicks, conversions, conversions without cancellation等等.
进一步地, 我们可以把广告相关的cost引入到efficiency的定义, 包括: Cost per Click (CPC), Cost per Acquisition (CPA), Return on Investment (ROI) 等.
此外, 如果求职者在广告行业有一些domain knowledge的话, 还可以讨论一些advanced metrics, 比如ads incremental value, 即对比没有广告情况下organic traffic带来的revenue与有广告情况下整体revenue的增量差值. 其他可以提到的影响ads efficiency定义的因素还包括, ads attribution logic, user life time value (LTV) 等.
对这个问题的讨论可以算是Data Analyst面试最关键的环节, 它会与后续的实验设计等步骤相关联, 因此讨论得会比较细致. 而对于Machine Learning Engineer岗位的面试, 我们一般不会在这一步停留过长时间.
Q2: What data do you need?
这一步包括feature definition和table schema design. 在实际工作中, 很多情况下我们做数据分析或者建模工作所需要的数据并不是现成的. 我们需要自己定义table schema甚至自己在产品中添加log来收集数据. 这也是实际工作与 Kaggle competitions或course projects的区别之一.
Table schema design并不难, 我们需要注意结合数据内容的安全级别和数据量大小把信息分类存放,比如
- User profile table
- Product feature table
- User-item activities table
- Ads table
对于Data Scientist和ML engineer岗位的case study, 这一步也会涉及到label definition的讨论. 举一个简单的例子: 对于某一个用户, 如果我们optimize for ads click的话, 我们可以把candidate products中用户点击过的广告商品定义为positive label (1). 那么如何定义negative label (0)? 是不是要把其他全部商品定义为negative label? 一个值得讨论的处理方法是: 结合impression data, 只把viewed but not clicked商品定义为negative label.
Q3: How to design a rule-based recommendation system?
在case study面试中, 我们不一定非要给出model-based solution. 结合具体的应用场景和产品要求, rule-based solution在很多情况下效果并不差, 比如在计算实时性要求较高, 或者推荐系统中用户行为数据较少(比如cold-start problem)的情况下, 我们更倾向于先给出non personalized solution作为baseline.
在这一步中, 我们可以把商品推荐方法设定成: Always recommend the top 5 popular handbags among female users in the age range between 20 and 30 in United States. 很显然, 要想得到这个信息, 我们可以利用在Q2中设计的tables做SQL query. 这也就是case study面试中比较常见的SQL考法: 求职者根据优化目标, 自己设计table, 自己设计问题, 然后自己写出query来解决它.
Q4: How to design a personalized recommendation system?
以rule-based方法为baseline, 我们可以进一步利用supervised learning model来优化推荐系统的content relevance. 在这里需要注意的是, 不要直接进入model loss function细节的讨论, 而是最好先把整个machine learning workflow快速介绍一下, 如下图所示:
这就是我前面提到的解决问题框架之一, 看上去确实非常简单, 但里面每一个环节都可以进一步深挖. 比如:
Q4.1: How to deal with categorical features at feature transformation stage?
这里涉及到feature encoding的方法, 比如one-hot encoding, label encoding, target encoding等. 如果选择用one-hot encoding这种sparse representation方法的话, 后续也要考虑模型对sparse feature的处理能力, 很多情况下我们需要做降维处理. 除了Principal Component Analysis (PCA)方法外, Neural Network Embedding是很好用的降维方法. 而如果选用embedding方法的话, 又涉及到这个Neural Network训练使用的label与原推荐系统模型使用的label是否一致的问题.
Q4.2: When and why do we need to do feature normalization?
Feature transformation这一步涉及到很多内容, 前面的Q4.1算是feature representation的处理, 其他的操作还有feature normalization, missing value handling等等. 其中feature normalization就是scale all the numeric feature values, 它可以在机器学习模型参数求解的过程中可以帮助数值优化算法更快收敛到最优解. 但这个操作并不是必须的, 需要考虑feature的物理意义.
由于面试时间的限制, 肯定不可能对每一个环节都做面面俱到的讨论. 因此在这一步面试官会选择1-2个方向做deep dive.
Q5: How to design & optimize your recommendation model?
对于一部分data scientist岗位和大部分machine learning engineer岗位, model theory的考察是必不可少的. 就像我在上文提到的, 在这里面试官要考察的是对基础知识点的深刻理解. 两个关键词: "基础"和"深刻". 比如, 设计推荐系统模型时我们可以直接把它建模成一个logistic regression分类问题, 那么面试官可能会针对logisitic regression提出这样一个问题:
Q5.1. What’s the difference and correlation between ordinary linear regression and logistic regression?
这个问题回答的角度有很多, 算是一个开放式问题. 但是, 如果我们只回答"两者的Model assumption不同"或者"两种model对应的label type不同(continuous vs. categorical)", 那么一般很难令面试官满意. 我建议的回答角度是, 在Generalized Linear Model (GLM)的框架下对两个model的assumption进行比较. 当然完全没必要当场把GLM的复杂定义全写出来, 只要展示出两个这Model是在 g(E(Y|X)) = X*beta的框架下, 根据不同的assumption选用了对应的link function g(). 就可以了.
可能很多朋友对GLM很不屑, 觉得它很土. 那咱们还是回来讨论推荐系统模型: How to design your recommendation model?
首先, 推荐系统至少包括两部分: candidates generation 和 fine-tune scoring. 前面提到的logistic regression模型是在fine-tune scoring阶段的一种基本方法, 我们回过头来讨论candidates generation这一步. 我们从简单到复杂有多种不同的模型选择:
- K-nearest neighbor: 也就是collaborative filtering最简单的实现方法, 直接基于item-based or user-based方法找出用户可能喜欢的一组商品. 模型比较简单, 更新速度快.
- Matrix Factorization: 综合item & user全部信息进行推荐, 精度较高. 但每次计算比较耗时, 不便于实时更新.
- Neural Network: 可以整合更多user profile信息进入模型, 是比Matrix Factorization更加通用的方法, 计算精度更高. 但是模型更加复杂, 做实时预测时会有一些延时或者需要较多computation resource.
对模型理论知识点的准备, 不需要过分追求很新很难很高级的模型. 首先要把最基础的机器学习模型知识点掌握清楚, 其次要注意多对不同模型的特点做横向比较. 面试官希望你清楚为什么选用了这个模型, 它背后的intuition是什么? 你权衡了哪些不同的tradeoffs, e.g. accuracy, latency performance, etc?
Q6: How to evaluate your recommendation model?
在这一步我们主要讨论的是利用validation data set做offline evaluation的问题. 除了cross-validation的具体操作方法之外, 需要了解常见的evaluation metrics:
Regression problem: Mean Squared Error (MSE), Mean Absolute Error (MAE)
Classification problem: Accuracy, Precision, Recall, F1, AUC
其中classification problem的metrics相关问题是最常见的, 比如:
Q6.1. How to prioritize precision and recall metrics in different use cases?
Q6.2. How to explain AUC from a probability perspective?
这部分内容难度不大, 要求大家在面试时对相关知识点要足够熟悉.
Q7: How to evaluate business impact of this project?
这里主要涉及到的是online evaluation, 即A/B testing. 这是Data Analyst面试的绝对重点, 在一部分Data Scientist面试中也会考到. 要把相关问题答好, 首先要熟悉experimental design的基本框架, 这也是我前面提到的第二个需要总结的解决问题框架. 整个A/B testing experiment pipeline至少要包含以下5部分:
- Treatment definition (i.e. objective definition)
- Metrics definition and selection
- Set up experiment, including sample size, randomization
- Conduct hypothesis
- Interpret experiment result
这里针对任何一个步骤, 面试官都可以展开一些针对基础知识点的深刻理解的考察. 比如:
- What is p-value?
- How to determine sample size?
最后, 在实际应用场景下的A/B testing问题处理也是常见考点, 比如以下几个问题:
Q7.1: What if your experiment p-value is 0.051? How would you explain this result to your product manager?
Q7.2: Given the sample size request, how do you choose between running your experiment for 1 week with 20% traffic and running your experiment for 2 weeks with 10% traffic?
Q7.3: Although your experiment needs 2 weeks to collect the long term effect, you are only allowed to run your experiment for 3 days. What can you do for that?
注意, Q7.3 并不是一道Behavior Question题...而是广告领域非常常见的实验分析问题.
Q8: How to implement the basic k-nearest-neighbor algorithm?
模型实现问题在case study面试中出现的频率不高. 相关问题一般都是经典题目. 比如这道题, 理解KNN的实现方法后, 其实要解决的就是Find the top K smallest elements in an unsorted array (类似LC215). 数据科学岗位面试中的编程题备考是一个很大的topic, 在这篇文章中就不展开讲了. 唯一一点想提醒大家的是, 一定要注意对算法时间空间复杂度的讨论. 以这道题为例: 假设一共有n个数据点, 我们要找到top k smallest elements, 一共有4种实现算法:
- Sort the whole array: Time complexity is O(nlogn)
- MinHeap: Time complexity is O(n+klogn)
- MaxHeap: Time complexity is O(k+(n-k)logk)
- QuickSelect: Time complexity worst case O(n^2), on average O(n)
Q9: How to optimize your algorithm for real-time recommendation?
从上面Q8的讨论中我们可以看到, 我们在recommendation system candidate generation阶段, 即使是使用最简单的KNN算法, 我们也至少需要支持O(n)的时间复杂度. 在用户量非常庞大, 且产品实时性要求很高的广告推荐场景下, 这个算法可能无法满足我们的要求. 因此我们需要从算法或者系统的角度来进行优化.
这类面试题难度比较大, 一般只会出现在Machine Learning Engineer面试中. Q9的问题主要是关注在算法层面的优化, 我们可以考虑使用Approximate Nearest Neighbors Algorithms, 通过locality-sensitive hashing (LSH)来对部分信息进行预处理和缓存, 在有限地牺牲模型精度的情况下大幅优化运算效率.
Q10: How to optimize your system for a large-scale recommendation use case?
承接前面Q9的问题, 如果面试官要求我们从系统层面优化推荐系统的实时计算效率, 那么我们需要从distributed system design的角度进行讨论, 比如:
在数据预处理(data cleaning, feature transformation)阶段, 会涉及到海量数据场景下的data engineering工作. 对于类似TeraSort等数据处理任务, 可以使用MapReduce运算范式.
在large-scale推荐系统设计中, 为了权衡实时运算效率和推荐准确性, 我们大多把系统设计成candidates generation和fine-tune scoring两个步骤. 在Candidates generation阶段, 我们使用一部分features构造轻量级模型, 选出一组候选商品. 随后在scoring阶段引入更多的user & product features, 构造复杂的ranking model来对candidates做实时排序.
Q11: Except content relevance, are there any other factors we can optimize to improve the ads efficiency?
前面的10个问题都是专注在content relevance的角度来讨论如何优化广告推荐系统的efficiency. 在Data Analyst or Business Analyst的面试中, 经常会出现product sense类型题目, 用来考察求职者structural thinking能力和知识广度. 以这道题目为例, 最高效的ads delivery应该是做到: Send the right ads content to the right person at the right time with the right channel. 除了content relevance, 其他的讨论角度还包括audience targeting/segmentation, ads send time optimization等等.
以上我结合广告推荐系统设计这个例题和11个followups (加上分支题目一共19个问题)给大家介绍了数据科学不同岗位的面试特点. 由于面试时间的限制和各岗位能力要求的不同侧重, 不可能有一个面试会cover全部这些问题, 针对Data Analyst, Data Scientist, Machine Learning Engineer的面试要求, 这里简单归类一下:
- Data Analyst - 注重统计, 实验设计能力, product sense考察: Q1, 2, 3, 7, 11
- Data Scientist - 注重实验设计能力, 模型知识考察: Q1, 4, 5, 6, 7
- Machine Learning Engineer - 注重模型知识, 系统设计, 产品开发能力考察. Q1, 4, 5, 6, 8, 9, 10
3. 案例分析面试的备考建议
大家从上面的讨论中可以发现, 数据科学岗位的案例分析面试涉及的知识内容很多很杂, 网上相关的学习资源也非常多. 我觉得大家手中都有足够量的参考资料, 关键问题是很多朋友不了解如何能够在非常有限的时间内有针对性地备考. 我在这里给大家总结3点建议:
- 专注于基础知识点的深刻理解. 这是我在这篇文章中第4次提到这个事情, 真的非常重要. 上文中我举了几个具体例子, 随后我计划写几篇关于数据科学基础知识点总结的文章, 希望能给帮大家更好地梳理知识结构.
- 仔细研究job description, 明确面试要求. 数据科学岗位面试的一大特点就是: 不同岗位之间面试要求区别很大. 由于绝大多数公司在一段时间内只会给申请者一次面试机会, 因此大家已经要分清自己即将参加的面试的考察方向, 必要时可以请教一下朋友或者前辈. 注意: 很多情况下job title并不能说明问题. 我见过一些朋友本身是很优秀的Data Engineer, 目标是换到硅谷一线大厂的Data Scientist, 但是拿到的面试是偏analysis方向的DS职位, 面试时被问到很多统计和product sense的问题, 由于事先没有准备这方面内容, 错失了这个公司的全部申请机会.
- 通过模拟面试锻炼综合应用能力. 很多求职者在备考时有一个困惑: 虽然对大部分知识点都非常熟悉, 但是在面试时就是想不起来. 这个问题的核心原因是没有建立知识体系, 通过模拟面试可以很好地帮自己查漏补缺. 也非常欢迎感兴趣的同学报名参加Techie备受好评的数据科学模拟面试服务, 我会结合相应目标公司的出题特点和要求, 根据过去多年的工作/面试经验给同学做针对性辅导, 提供最真实的数据科学面试体验和最详尽的面试反馈。如果你在数据科学领域学习过程中有任何问题, 也欢迎扫描下方的二维码或者搜索 TonyCoding20 添加我的微信, 期待和大家的沟通!
希望这篇文章能给大家带来一些启发, 祝大家都能顺利通过面试, 拿到理想的offer!