资深面试官眼中的数据科学案例分析面试‐附DS面经题总结 - sophiekeke/casestudy GitHub Wiki
https://www.1point3acres.com/bbs/thread-799086-1-1.html
数据科学岗位的面试会涉及到编程、算法、SQL、案例分析 (case study) 等不同内容,其中大家普遍反映最难准备的就是案例分析这类面试题目。这类问题涵盖的知识范围很广,而且根据公司和具体应聘岗位 (Data Analyst, Data Scientist, Machine Learning Engineer) 的不同,案例分析面试的考察点又有很大区别。这导致很多求职者在有限的备考时间内很难抓住重点。
我博士毕业后在业界工作了近十年,在硅谷一线大厂做过 Data Scientist 和 Machine Learning Engineer,以面试官和 hiring manager 的身份参加过近百场数据科学岗位面试。最近几年我也帮忙辅导过很多朋友跳槽或转行进入数据科学领域。我把这些经验总结成了这篇 6 千字长文分享给大家,希望能对正在求职的朋友们有所帮助。
在这篇文章中,我首先会从面试官角度解析数据科学案例分析面试的考点,然后通过一道我自己编的包含 11 个 follow-ups 的面试题给大家展示不同职位面试考察形式,最后会给大家提一些备考建议。
案例分析面试考什么?
数据科学案例分析面试在不同公司的不同岗位招聘中考点区别很大,有时候甚至面试名称都不一样:
在 Data Analyst 或 Business Analyst 岗位面试中,它通常被叫做 case study interview,涉及的内容包括统计理论、A/B testing、实验设计、SQL、product sense 等。
在 Data Scientist 或 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-40 分钟的时间内通过与面试官的沟通给出一套完整的解决方案。在这个过程中,面试官主要考察以下三点:
1. 分析问题的能力 - 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。
2. 对基础知识点的深刻理解
Case study 面试在很多情况下也包含理论知识考察的部分。现在极少有公司会利用填空选择题来考察机器学习理论问题,但是面试官会在 case study 问题讨论中结合你选取的分析方法来针对一两个知识点做 deep dive。这里考察的知识点一般都是经典的机器学习基础知识,不会涉及到很复杂的概念或者最近几个月新发布的研究成果。
3. 数据系统设计能力
优秀的 case study solution 一定是建立在一套完整的分析框架基础上。它保证了我们在分析问题的时候不漏掉任何一个关键环节,这在实际工作中也是非常重要的。对于 data analysis problem,这个框架可能是 A/B testing experimental design framework;对于 machine learning modeling problem,这个框架可能是 model training workflow。建议求职者在备考时把常见的解决问题框架总结好(在后文的具体案例中我给出了两个例子)。面试时甚至可以把这个框架直接画在白板上,然后有侧重点地进行讨论。很多朋友反映在 case study 面试时"无话可说",出现这种问题的主要原因是面试时脑中没有一个预先总结好的框架。
以上讲的内容比较抽象,下面我结合一道经典的 recommendation system case study 面试题来做举例说明。
实战面试题 - 广告推荐系统设计
Interview Question: How to design a recommendation system to optimize ads efficiency on Facebook Platform?
推荐系统问题是 case study 面试的常见内容,类似的大部分问题主要是关注在推荐系统 content relevance & personalization 的方向。而这道题中又引入了在线广告这个场景,因此考察角度会更加多样化。
这道题目中包含的 11 个 follow-ups 来自于我在工作和面试中的经验总结,基本包含了数据科学不同岗位 (Data Analyst, Data Scientist, Machine Learning Engineer) 面试中的常见考点,希望能给大家在面试备考方向上提供一些参考。
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 lifetime 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 并不难,我们需要注意结合数据内容的安全级别和数据量大小把信息分类存放。
Table Schema Examples
-
User profile table
USER ID USER NAME NATIONALITY ACCOUNT CREATION TIME -
Product feature table
PRODUCT ID PRICE COLOR TEXTURE -
User-item activities table
USER ID PRODUCT ID IMPRESSION CLICK -
Ads table
CAMPAIGN ID AD ID PRODUCT LIST AUDIENCE GROUP
对于 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 the 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 分类问题。那么面试官可能会针对 logistic 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,比如 accuracy、latency、performance 等等?
Q6: How to evaluate your recommendation model?
在这一步我们主要讨论的是利用 validation dataset 做 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
- Setup experiment including sample size and randomization
- Conduct hypothesis test
- 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(n log n)
- Min Heap: Time complexity is O(n + k log n)
- Max Heap: Time complexity is O(k + (n - k) log k)
- Quick Select: 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 做实时排序。这类题目与软件工程师面试中 system design interview 的内容有些重叠,在数据科学方向只会出现在 Machine Learning Engineer 面试中。
Q11: Except content relevance, are there any other factors we can optimize to improve the ads efficiency?
前面的 10 个问题都是专注在 content relevance 的角度来讨论如何优化广告推荐系统的 efficiency。在 Data Analyst 或 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 个 follow-ups(加上分支题目一共 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点建议:
1. 专注于基础知识点的深刻理解
这是我在这篇文章中第4次提到这个事情,真的非常重要。上文中我举了几个具体例子,随后我计划写几篇关于数据科学基础知识点总结的文章,希望能帮大家更好地梳理知识结构。
2. 仔细研究 job description,明确面试要求
数据科学岗位面试的一大特点就是:不同岗位之间面试要求区别很大。由于绝大多数公司在一段时间内只会给申请者一次面试机会,因此大家一定要分清自己即将参加的面试的考察方向。必要时可以请教一下朋友或者前辈。注意:很多情况下 job title 并不能说明问题。我见过一些朋友本身是很优秀的 Data Engineer,目标是换到硅谷一线大厂的 Data Scientist,但是拿到的面试是偏 analysis 方向的 DS 职位。面试时被问到很多统计和 product sense 的问题,由于事先没有准备这方面内容,错失了这个公司的全部申请机会。希望这篇文章能给大家带来一些启发。