(接上文)
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个 follow-ups 给大家介绍了数据科学不同岗位的面试特点. 由于面试时间的限制和各岗位能力要求的不同侧重, 不可能有一个面试会 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点建议:
-
专注于基础知识点的深刻理解. 这是我在这篇文章中第4次提到这个事情, 真的非常重要. 上文中我举了几个具体例子, 随后我计划写几篇关于数据科学基础知识点总结的文章, 希望能给帮大家更好地梳理知识结构.
-
仔细研究job description, 明确面试要求. 数据科学岗位面试的一大特点就是: 不同岗位之间面试要求区别很大. 由于绝大多数公司在一段时间内只会给申请者一次面试机会, 因此大家一定要分清自己即将参加的面试的考察方向, 必要时可以请教一下朋友或者前辈. 注意: 很多情况下 job title 并不能说明问题. 我见过一些朋友本身是很优秀的 Data Engineer, 目标是换到硅谷一线大厂的 Data Scientist, 但是拿到的面试是偏 analysis 方向的DS职位, 面试时被问到很多统计和 product sense 的问题, 由于事先没有准备这方面内容, 错失了这个公司的全部申请机会.
-
通过模拟面试锻炼综合应用能力. 很多求职者在备考时有一个困惑: 虽然对大部分知识点都非常熟悉, 但是在面试时就是想不起来. 这个问题的核心原因是没有建立知识体系, 通过模拟面试可以很好地帮自己查漏补缺. 如果你在数据科学领域学习过程中有任何问题, 也欢迎添加我的微信 TonyCoding20, 期待和大家的沟通!
希望这篇文章能给大家带来一些启发, 祝大家都能顺利通过面试, 拿到理想的offer!