转自:【译Py】数据科学面试终极指南
欢迎来我的简书:呆鸟的译Py胡言
目录
-
面试内容
- 电话面试
- 家庭作业
- 招聘经理电话面试
- 招聘经理现场面试
- 技术挑战
- 总监面试
-
数据科学岗位技能矩阵
-
数据科学岗位纵览
-
数据科学面试题
- 行为试题
- 数学试题
- 统计学试题
- 编程试题
- 场景试题
- 面试提示
准备面试
希望为争取数据科学面试机会所做的一切都有回报,收到代表开启面试流程的邮件,或者有公司打电话叫你去面试。以下就是即将发生的事情,要准备好哦。
面试内容
数据科学面试十分复杂,行为问题混杂着技术问题。获得面试机会算是走的够远了,不过还有很多路要走。
从头说起吧,很大程度上,数据科学面试会根据求职岗位与公司的不同而有很大区别。一些公司非常严谨,需要通过许多技术挑战;另一些公司则会考虑企业文化匹配。如果有人推荐,你有可能会直接进入最后一轮面试。
最严谨的面试可能是这个样子:
1. 电话面试
一般来说,为了节约招聘经理的时间,人力资源的员工会通过电话面试初步筛选求职者。有时会询问些基本的技术问题,筛掉完全不合格的人。大多数情况下,从电话面试开始,公司就已经在考察求职者是否和他们的企业文化相匹配了,求职者要有较好的沟通技巧,才能面试成功。
本次通话可以让你初步了解数据团队的问题及其组织架构。准备好一些有深度的问题,展示你对业务和数据运营的理解,快结束时也可以提些关于公司的问题。
2. 家庭作业
电话面试后,有的公司会给求职者布置任务,要求限时完成。这个环节能有效地筛掉技术差、不愿下功夫的人。大部分公司不会这么干,但也有不少公司喜欢用家庭作业这种测试方法节约招聘经理的时间。
好的家庭作业设计也是了解公司的好机会,可以了解到这份工作要解决什么问题。家庭作业可能会让你深度分析给定的数据集,从数据中推导出洞察结果,并进行说明;也有可能是让你清理有明显错误的数据集;还有可能让你处理某些业务问题,比如基于职位描述中的数据为求职者开发职位推荐系统。
只有做好家庭作业的人才会获得和招聘经理面谈的机会。如果拒绝完成家庭作业,可能会被直接筛掉。
花点时间完成家庭作业,了解这家公司有什么样的数据问题。通过家庭作业,可以知道公司侧重于测试哪种技能,以及他们如何看待这个岗位,搞清楚这些问题,能让你更好地利用时间应对面试。做好这项作业可以充分体现实力,让你与众不同。
3. 招聘经理电话面试
求职者还会接到一次关于数学、统计学和编程的电话面试。本次面试一般由招聘经理或技术人员进行,这可能是现场面试前的最后一轮评测。一般为三部分,有时可能一个电话搞定,通话时间会比较长;通常分为三次电话面试,每次三十分钟。
-
数学与统计学
评测数学与统计学核心概念知识,面试的公司和岗位不同,具体的面试内容也不同。网络公司侧重于评测A/B分组测试的知识、计算P值的方法或统计显著性均值的概念。能源公司则侧重于测试对回归概念和线性代数的理解。不管面对哪种的面试,都要能描绘解决问题的整体思路。
如果问及A/B分组测试,需要描述A/B分组测试的细化流程。依托实战经验,避免问题里的陷阱。对待这个问题要像对待数学验证与统计推理一样,不要担心过度关注细节,要能条理清晰地回答问题。
-
编程
本次面试和其它技术面试非常相似。主要是评测技术能力,一般会要求用伪代码解决编程问题,复杂一些的面试会要求编译准备好的代码。如果应聘的是数据分析师,一般会测试使用SQL查询数据的能力。其它岗位则会测试之前提到的编程语言,比如Java和Python。
面试官可能会用HackerRank或Collabedit这样的工具在线评测。使用这些工具,招聘经理可以实时查看求职者输入的解决方案,准备好应对这种形式的测试,有可能的话去这类网站做些专项训练。
破解编程面试这样的书或InterviewCake这样的网站为求职者提供了很多应对编程面试的资源,利用好这些资源会对求职者有很大帮助。
要想顺利通关编程面试,就得勤做练习,熟,才能生巧。写代码时最好能找个舒适、安静的环境。不过大多数情况是接到电话后,手忙脚乱地在纸上写下代码,然后匆匆忙忙地在电话里解释;有的时候,面试官会要求使用在线测试工具进行编程测试,这时可别说自己不会用。总之,要对各种可能发生的情况做好准备。
这种面试经常会问到数据结构,要好好学习哈希映射、决策树、堆栈、队列这些概念。像软件工程师应对编程面试一样,你就能成功。
-
招聘经理电话面试
终于轮到招聘经理了,他会面试求职者的沟通能力,考核求职者能否与公司的团队融洽相处。这次面试通常是独立的电话面试,也可能是大型电话面试三大部分的最后一关。目的主要是让招聘经理了解求职者的个性、求职动机、团队匹配度及思维天赋。绝大多数招聘经理心里都会有目标人选的预期,越接近招聘经理的预期,就越可能获得现场面试的机会。
这时就体现出与第三方招聘公司合作的好处了,对招聘经理要解决的问题、想找什么样的人了解的越清楚,就越能充分准备,把自己打造成该岗位的完美人选。为实现这一目标,可以针对该岗位定制沟通内容,尽量表现得自信,再能表述清晰的话,顺利通关的可能性就会很大。还要处理好**“航行测试”**这样的情景问题,试想一下,和招聘经理一起坐几个小时的飞机,怎么能让他觉得你不是个无聊的人。这项测试非常重要,毕竟今后要天天和团队同事一起工作至少八小时,这时最好能表现出和领导融洽相处的本事。
4. 招聘经理现场面试
最后,恭喜你通过了电话面试,终于可以和招聘经理面谈啦。招聘经理会从技术和非技术角度两方面进行评测。确认求职者适不适合应聘的岗位,甚至会设定不同场景让求职者使用白板现场讲说,测试求职者的技术专长。
5. 技术挑战
如果现场面试没有考核技术能力,就会在本环节进行各种技术测试,特别是数据工程师这个岗位。这个环节与软件工程师面试非常相似,通常会要求在白板上写出应用的算法,解决特定的问题。
如果熟悉时间复杂度、大O表示法这样的软件工程概念,掌握数据算法背后的数学与统计学知识,这一关对你来说就不难。
6. 总监面试
通过了招聘经理的面试,最后一关通常是高级总监面试。创业公司一般会由联合创始人或CEO亲自面试。
恭喜你!终于到了这一关了。一般来说,通过了技术考核的求职者才有可能到这一关。虽然,到了这关基本上就说明公司会给你发Offer,不过也别得意忘形。现阶段只需着重说明怎么推动业务工作进展,怎么解决公司的问题就可以了,不用再证明自己什么,反倒要注意别犯低级错误。
数据科学岗位技能矩阵
岗位名称 | 数学/统计学 | 数据库 | 算法 | 软件工程 | 大数据/系统工程^1 | 软技能/领域专长 |
---|---|---|---|---|---|---|
数据产品科学家^2 | 中 | 中 | 中 | 高 | 高 | 中 |
数据工程师 | 低 | 中 | 低 | 高 | 高 | 低 |
数据科学家 | 高 | 中 | 高 | 低 | 低 | 高 |
商务智能专家 | 中 | 高 | 中 | 低 | 低 | 高 |
数据分析师 | 低 | 高 | 低 | 低 | 低 | 高 |
-
数学/统计学:如,P值分析、A/B测试
-
数据库:如,SQL查询
-
算法:如,监督学习、实体解析
-
软件工程:如,Python、Java、面向对象编程
-
大数据/系统工程:如,Spark、HBASE、Hadoop
-
软技能/领域专长:如,演说、演讲技能
不同的数据科学岗位对技能组合要求不一样。数据工程师不用具备太强的业务演示能力,但要能解决各种编程难题;数据分析师无需解决技术难题,能用好SQL就行了,不过却要是个优秀的演说家。
本表从高至低列出了业界对数据科学岗位的需求与标准。以最热门产品数据科学家为例说明了各岗位的专业性和难度水平。
搞清楚要应聘哪个岗位,了解应聘公司需要哪个岗位的人员,招聘岗位适不适合自己,有助于预估数据科学面试流程。
数据科学岗位纵览
数据产品科学家 :具备数据产品开发能力的全能型数据科学家。数据产品科学家带领团队开发数据产品,修改算法,精通用数据服务终端客户,具备开发能力,能规划各种数据产品。
数据科学家 :技术、业务与数学的独角兽能力混合体。数据科学家懂得怎样创建与优化数据算法,能够解释说明数据发掘到的内容。相对数据工程师而言,数据科学家不需要太懂编程,但是要能完美解析各种规模的数据。
商务智能专家 :关注从数据中提取商务洞察结果,精通统计学,与数据分析师的不同之处在于,能够掌握各种机器学习算法,编制各类数据仪表盘,进行各种数据分析,帮助公司各团队制定更好的决策。
数据工程师 :不必过多了解统计学或数学,但要能处理各类技术难题,针对大规模数据实现各种算法。
数据分析师 :入门级岗位,大部分工作内容是编写一次性数据报告,说明数据分析结果,要求熟练掌握SQL与Excel。
数据科学面试题
行为试题
与其它岗位的面试类似,数据科学面试也包括大量行为试题,面试官会考核求职者的软技能,了解求职者能否适应公司的企业文化。
-
请说明你以前做过的数据科学项目?
目的 :了解求职者对相关知识的理解程度,曾做过什么样的贡献。测试描述工作内容的能力,以及能否把数据科学项目经历与对公司产生的影响联系起来。
应答思路 :
- 介绍一个做过的产品与工程经验的数据项目,例如,提供数据分析并将分析结果产品化的数据项目。举例来说,通过主题提取技术识别文本数据集中的核心主题,说明主题识别的数据产品对促进公司业务增长产生了什么效果。
- 从业务目标角度,详细描述对这个数据项目的贡献和产出结果。面试官希望在了解该项目总体目标的同时,了解你做过什么。
- 要想讲好项目经验,需要多加演练。面试时经常会问到这个问题,准备两三个数据项目,要能说得生动、详实。
-
对以前的岗位,你喜欢什么?反感什么?
目的 :判断你适不适合面试的岗位,了解你离职的原因。
应答思路 :
- 充分理解岗位职能。通过HR联系人了解该岗位的信息。HR员工是获取信息的重要途径,通过他们可以了解到有关该岗位的职责、团队成员、发展历史及核心业务目标等诸多信息。
- 注意在讨论反感的事情时,要对事不要对人,表现出专业的素养。在讨论喜欢的事情时,仔细反思、论证哪些事情让你充满激情。比如,可以说喜欢的事情是从数据中分析出重要结果,汇报给管理层后能优化流程、促进业务。也可以说在公司里推行数据科学时可以学到新技术,同时又能让工作的效果更好。可以表示对公司没把数据科学作为战略核心的不满,也可以说公司高层的内耗,团队方向不清晰,但是一定要从积极地、有指向性的角度来说,千万不要带上个人色彩。
- 差:我就受不了数据科学家总是矮工程师一头,公司高管对企业发展方向一点头绪都没有!
- 好:我想在数据科学是企业战略核心、企业发展方向清晰的公司工作。
-
请说明,当必须说服别人认同你的观点时,你是怎么做的,效果如何?
目的 :了解你如何坚守自己的立场,以及影响他人的能力。
应答思路 : 举例说明你曾经成功地改变现状,量化这些改变带来的影响。如果可以的话,举出数据科学类的例子。此时,能够表现出沟通技巧与领导能力非常重要。
数学试题
数据科学家岗位的数学问题,不仅需要求职者能执行算法,还要能根据特定目的调整算法。
-
如何使用线性回归算法求解最优系数? (C3能源的数据科学家面试时曾问过这个问题)
原理 :了解求职者对线性回归理论的理解程度,线性回归理论对很多数据科学岗位都十分重要,数据科学家不能把算法视为黑箱,不仅要能执行算法,还要能理解算法。这类问题(各种算法)测试求职者对算法的理解程度。
应答思路 :简述每一步思路,列出方程式。描述思路的同时,还要详细说明解决方案。
答案 :在最高水平上,系数是最小化残差平方和的函数。下一步,列出方程,说明什么是残差。想要更进一步的话,可以考虑如下内容: 1)用给定的线性回归模型,列出残差平方和的最小化目标,最好用线性代数(矩阵)表示法。 2)残差平方和是可求微分的凸函数,将微分设为0,求解该方程,可导出系数,解出最小化方程式。 3)第2条给出的解决方案使用多项式时间求解线性代数问题,需要说这种方式比较复杂;还有一种常见的解决方案,通过观测可以发现该方程式是凸性的,因此用梯度下降这样的数值算法求解效率会更高。
统计学试题
统计学知识对解决数据科学问题至关重要。统计推理能力和统计学理论测试十分常见。一定要牢记常用的统计学概念,比如I型错误、II型错误,熟练掌握各种概率分布概念。
-
I型错误与II型错误的区别是什么? (Niraj,我们的校友就遇到了这个问题)
原理 :测试统计学基本概念的掌握程度、统计学基础水平,评测怎么使用统计学专业术语沟通各方人员的能力。
应答思路 :要有理有据,准确说明问题里的名词定义。
答案 :I型错误又称“假阳性”,是对零假设的错误拒绝。II型错误又称“假阴性”,是对零假设的错误接受。可以通过举例或实际业务说明对这两个概念的理解。I型错误认为男人怀孕了;II型错误则认为孕妇没怀孕。欺诈监测业务对假阳性的容忍度特别高,客户不会因为收到提醒小心受骗的邮件发火;可要是真被骗了,系统却没监测到,这种假阴性就麻烦大了。
-
这是一家大型保险公司的数据科学面试题。
将总体分为两组:暴脾气司机与好脾气司机。其中,暴脾气司机占总体的40%,好脾气司机占60%。暴脾气司机一年内发生3起事故的概率是15%,好脾气司机则是5%。已知张三去年发生了3起事故,a)他是暴脾气司机的概率是多少?b)他是好脾气司机的概率是多少?
原理 :很多公司通过贝叶斯推理测试求职者的统计思维能力。说明贝叶斯概率与统计学的频率解释的区别,展示推理各种贝叶斯问题的能力,可以让面试官快速了解你对统计概念的掌握水平和心算能力。想要重温这些知识,请参考Springboard导师Will Kurt的博客( CountBayesie ),里面有不少关于贝叶斯统计的好文章。
应答思路 :了解求职者对贝叶斯概率的理解水平,要逻辑清晰、条理分明地说明所有假设与计算过程。
答案 :首先,列出已知项: 暴脾气司机占总体的比例 = 40%或0.4 好脾气司机占总体的比例 = 60%或0.6 暴脾气司机一年内发生3起事故的概率 = 15%或0.15 好脾气司机一年内发生3起事故的概率 = 5%或0.05 需要理解贝叶斯方程式中先验条件与后验条件的概念。先验条件是在问题出现前给定的数据。某人在总体中属于暴脾气司机的概率就是给定的先验假设,不能改变。后验条件是根据贝叶斯定理的假设(P(A/B))得出的概率。
第一个问题是“如果张三一年内发生了3起事故,他是暴脾气司机的可能性是多少?”
画出显示概率的维恩图:一年内发生3起事故的人一共有多少?这些人里有多少是暴脾气司机,多少不是?
# 先验条件
aggDriver = 0.4
nonAggDriver = 0.6
threeAccAggDriver = 0.15
threeAccNonAggDriver = 0.05
# 某人一年内发生3起事故,他是暴脾气司机的概率是多少?
# 暴脾气司机占总体的比例乘以一年内发生3起事故的暴脾气司机的概率
A = (aggDriver * threeAccAggDriver)
"""分子(即A)加 好脾气司机占总体的比例乘以一年内发生3起事故的好脾气司机的概率。"""
B = ((aggDriver * threeAccAggDriver) + (nonAggDriver * threeAccNonAggDriver))
"""用一年内发生3起事故的暴脾气司机的概率 除以 一年内发生3起事故的好脾气与坏脾气司机的概率之和,得出后验概率"""
posterior = (A/B)
# 把小数转换为百分数
print ("{:.0f}%".format(posterior *100))
某人如果在一年内发生3起事故,此人是暴脾气司机的概率是67%(66.66%),这是后验概率。某人如果在一年内发生3起事故,此人是好脾气司机的概率是1 - 0.6666 = 0.3333,即33%。
-
什么是概率分布类型(说明概率分布函数的推导)?用随机变量描述。
a. T分钟内,某餐馆进来K个客人的概率
b. 一群人中,身高至少为X英寸的概率
c. 两个六面骰子,点数和为Y的概率
d. 投掷N次硬币,人像朝上为K次的概率
原理 :测试概率分布的知识及使用什么模型分析给定的数据。
应答思路 :说明数据假设,详细说明某模型是如何适用于某个概率分布的。对概率分布进行可视化,向面试官说明为什么使用该模型对某个概率分布进行可视化。
答案 :
a. 泊松分布。假设每个客人的到店行为都是完全独立的,与其他人没有关系。
b. 正态分布。注意,在连续分布中,精确到X英寸的可能性为零。
c. 根据公式 公式:
可以绘制出X轴是和,Y轴是概率的图形,说明概率质量函数与连续概率分布函数之间的关系。d. 二项分布。P(k是抛N次硬币头像朝上的次数):

%matplotlib inline
import scipy, scipy.stats
import matplotlib as plot
x = scipy.linspace(0,10,11)
pmf = scipy.stats.binom.pmf(x,10,0.5)
import pylab
pylab.plot(x,pmf)
注意,此图说明抛10次硬币5次头像朝上的几率为25%。
编程试题
面试数据科学岗位,尤其是数据工程师岗位,算法编程是必考项。这个环节可以参考软件工程师的面试,公司常用开发工具和编程综合理论是常考的内容。
-
SQL问题 — 给定交易表(Transaction_ID,Item_ID,Quantity,Purchase_Date(MM/DD/YY))和售价表(Item_ID,Price),请提供以下信息 :
1)总收入
2)工作日(星期一至星期五)交易的总量、平均值与标准差,按购买量降序排列
3)工作日未交易的Item_ID数量
交易样表(表名为transactions) :
Transaction_ID | Item_ID | Quantity | Purchase_Date |
---|---|---|---|
1 | 1 | 5 | 06/28/2016 |
2 | 2 | 3 | 06/27/2016 |
3 | 2 | 5 | 06/27/2016 |
4 | 2 | 1 | 06/26/2016 |
在SQL Fiddle中创建transactions表
CREATE TABLE transactions
(`Transaction_ID` int, `Item_ID` int, `Quantity` int, `Purchase_Date` datetime)
;
INSERT INTO transactions
(`Transaction_ID`, `Item_ID`, `Quantity`, `Purchase_Date`)
VALUES
(1, 1, 5, '2016-06-28 00:00:00'),
(2, 2, 3, '2016-06-27 00:00:00'),
(3, 2, 5, '2016-06-27 00:00:00'),
(4, 2, 1, '2016-06-26 00:00:00')
;
价格样表(表名为prices) :
Item_ID | Price |
---|---|
1 | $2 |
2 | $3 |
在SQL Fiddle中创建prices表
CREATE TABLE prices
(`Item_ID` int, `Price` varchar(2))
;
INSERT INTO prices
(`Item_ID`, `Price`)
VALUES
(1, 2),
(2, 3)
;
原理 :大型创业公司和成熟公司普遍使用SQL查询数据库。如果面试的是数据分析师,技术面试主要以SQL问题为主。懂得如何正确提取数据,对面试成功很重要。
应答思路 :面试时,会让求职者在纸上写出代码,或使用HackerEarth等协同编码工具,这样面试官就可以在解释器中实时查看代码了。尽量在最短时间内,最有效的完成任务,并且尽量少犯错误。可以用 SQLFiddle等工具实战练习SQL查询技巧。
答案 :
1)总收入
SELECT sum(a.quantity * b.price)
FROM transactions AS a
JOIN prices AS b ON a.item_ID = b.item_ID
这段代码用于关联价格表与交易表,将每个产品的数量与价格相乘,进行汇总。计算得出总收入为37美元。
2)工作日交易的总量、平均值与标准差
SELECT DAYOFWEEK(purchase_date),
sum(quantity),
avg(quantity),
std(quantity)
FROM transactions
WHERE DAYOFWEEK(purchase_date) BETWEEN 2 AND 6
GROUP BY DAYOFWEEK(purchase_date)
ORDER BY 2 DESC
这段查询代码使用MySQL的DAYOFWEEK函数,为日期返回从1到7的数字索引,其中,1对应星期日,7对应星期六。
3)Left Join VS GroupBy
a. Left Join方法
SELECT count(distinct A.item_id)
FROM transactions A
LEFT JOIN
(
SELECT *
FROM transactions
WHERE DAYOFWEEK(purchase_date) BETWEEN 2 AND 6
) AS B
ON A.Item_ID = B.Item_ID
WHERE ISNULL(B.purchase_date)
b. Groupby方法^3
SELECT COUNT(*)
FROM
(
SELECT item_ID
FROM transactions
WHERE DAYOFWEEK(Purchase_Date) BETWEEN 2 AND 6
Group By item_ID
) AS B
两种方法都能计算出工作日未交易过的产品数量。
SQL答题技巧 :
- 在写子查询语句前,首先把整个查询语句分解成几个小的查询语句。把整个问题分解成特定的中间表,先为中间表写好查询语句;
- 处理JOIN列的时候要小心。搞清楚是否要保留未匹配的行,如果保留,就要使用Left Join;
- 要是不知道准确的转换函数,就假设一个,将输入输出内容告诉面试官,然后继续下一步。
- 算法问题 — 从0开始,编写K近邻算法
原理 :在规定时间内,写出算法背后的思想,并进行有效布署,这是评估数据开发能力的关键。这类问题一般会用来考核数据科学家的算法与技术实现能力,也会用来考核数据工程师的技术能力,通常会要求在给定条件下实现相应的算法。这个问题适用于各类算法,但大多数情况下以K近邻算法为主,因为这种算法比较容易实现。
应答思路 :首先,要搞清楚问题。给定一个特征向量,找出该向量到所有其它已知向量的欧式距离,并找出最接近的K个向量中的大多数向量属于哪一类。这个问题测试对矩阵计算的理解,还测试处理向量和矩阵的方法。回答这个问题,要从核对输入输出样本集开始,动手推导答案。另外,还要注意时空复杂度。下面的方案中,每个预测都是关于
的时间复杂度,其中,N是训练数据的行数。
给出解决方案。写清楚语法很重要,还有要注意避免各种让代码不能正常编译的错误,但最重要的是说清楚算法的逻辑,要证明你能将算法应用到计算机科学层面。
import collections
import numpy as np
class NearNeighbor(object):
def __int__():
pass
def fit(X,y):
self.X = X # NxM numpy矩阵
self.y = y # Nx1 Numpy向量
def predict(X_test,k): # X_test是1xN向量的输出
X_test_matrix = array([X_test,] * self.X.shape[0])
# 将X_test复制为N行
Distance_vector = np.sqrt(np.sum(abs(X_test_matrix - self.X)) ** 2,axis = 1)
# 此行是为了获取每个训练向量的距离
# 注意这里是使用**2和np.sum获取距离
Sort_index = np.argsort[Distance_vector]
Close_k_Classes = y[Sort_index][0:k] # 提取一组K个最邻近的向量
return collections.Counter(Closest_k_Class).most_common()[0][0]
# 返回出现最多的类
解决方案 :
其它的编程问题可能与大数据相关,比如,应聘岗位需要分析超大规模数据集,就会问到MapReduce。一般会包括,如何利用大规模数据集,查找事件流中的最频繁事件。
-
如何在Hadoop上使用MapReduce实现字数统计?
原理 :如果在简历中提及有使用Hadoop或大数据工具的相关经验,或应聘的公司有处理大规模数据集的需求,就问会这方面的问题。拥有超过百万用户规模数据的财富500强大公司或技术型创业公司,会考核求职者处理大数据的能力。求职者要证明自己具备MapReduce的工作或实战经验。要学习MapReduce,可以到Horton网站查找相关资源。
应答思路 :这个问题主要测试求职者对Hadoop里MapReduce框架的了解程度,一般用Java实现。尽管字数统计是个很常见的问题,但懂得怎么使用Java的Hadoop框架实现这个功能是测试的重点。
答案 :驱动代码设置作业和配置。如果数据来自于HDFS(Hadoop分布式文件系统),输出结果也要保存到HDFS,这时需要将作业的输入/输出路径添加到对应的目录。然后,Mapper作业会提取文件中的每一行内容,并将每个单词的键值设为1。注意在Mapper和Reducer间传递的数据必须使用Hadoop数据结构,如Text和IntWritables,这样做是因为序列化字节数组比Strings和Ints这样的原始类型更加高效。接着,将Mapper的输出采集到Executor里,执行Combiner任务。Combiner是本地聚合器,能减少Mapper和Reducer之间发送的数据量,这是个可选配置。
所有Mapper都完成后,才会进入混洗阶段。如果发现Reducer运行到33%时卡住了,就说明混洗阶段正在等待Mapper完成任务。在混洗阶段,当所有的键都发送到Reducer后,Reducer才开始进入排序阶段。之后,执行Reduce逻辑,并将输出结果写到另一个HDFS文件里。
常见的后续问题是估算这种算法的时间复杂性,还要注意系统在机器之间写入与通信的数据量。别忽略冗余的问题,比如,Hadoop系统经常会在机器出现故障时生成多个数据副本。
场景试题
-
假如你是一家鞋品电子商务公司的数据科学家,如何搭建一个鞋品访客推荐系统?
(Verizon公司面试数据科学家时问过这个问题)原理 :这个问题旨在测试求职者提交整体产品的思路。情景问题不测试各领域的知识细节,但是需要求职者描述从开始规划到交付产品的各个环节,目的是要了解求职者哪些方面的知识存在不足。这个问题除了评估求职者设计产品的全面知识,还要测试求职者的团队管理能力与协同能力。
面试官经常会问数据科学家这个问题,数据工程师或数据分析师只要回答这种情景问题的部分内容就可以了。一般情况下,会问数据工程师如何实现相关算法,而不用考虑算法本身;还会问数据分析师查询哪些数据以确定用户对鞋品的历史偏好。
应答思路 :坦诚地说明自己哪些方面比较拿手,哪些方面不太熟悉,但重点要说明有经验的内容,如果有不熟悉的内容,也别不好意思,该问就问。尽量把技术知识与业务成果联系起来,说明做出选择的思路和假设。如果能提出更好地解决方案,别犹豫,多提问,一定要把问题理解透彻。
答案 :将这个问题分解为数据科学与数据开发两部分。
先探讨数据科学部分,对于没有多少用户历史数据的新公司,可以用近似项目法解决。如果其它项目和鞋品的数据差异过大,可以考虑用矩阵分解技术降维处理。假设有鞋品评级等用户偏好历史数据,可以用协同过滤类型法。特别要说明生成矩阵的行和列。然后,再讨论用哪种相似性指标,比如,欧式距离,相似度或余弦距离。
解释完算法,就可以说明数据开发部分了。要提出能拓展到百万量级的用户/鞋品数据工程基础架构,还要能实时生成推荐信息。例如,将用户数据以数据流的形式传输到S3存储桶。设计该系统要基于所有个体用户,可以设计成每晚进行矩阵分析,预计算整个数据集的推荐信息,将结果存储在Redis这样的内存数据库里。然后,构建REST API查询数据库,对每个给定的用户标识进行响应式推荐。
-
Change.org在Facebook上每分享一次请愿书有多少货币价值?
原理 :本题旨在了解求职者对业务的理解,以及将复杂问题分解为基础概念,再根据有效数据将这些概念转换为可分析模块的能力。这个测试可以看出求职者对公司数据架构的了解,还有沟通业务数据分析结果的水平。
应答思路 :仔细研究应聘公司,特别是其盈利模式。了解该公司使用哪些重点指标跟踪绩效,搞明白该公司如何实现盈收。问清楚要解决的问题,提出假设。回答问题时,别紧张、要自信,像给平时给领导汇报工作一样就可以了。
答案 :回答这个问题要对Change.org的业务有一定了解。分享一次请愿书可以通过两种方式产生收入:
1)非注册用户点击广告,比如,签署付费请愿书
2)注册用户在其生命周期内点击广告第一步先找出求解这两种方式产出价值的方法。诀窍是把一个大问题拆分成多个小问题,简化价值计算方程: 分享一次的价值 = 点击一次广告的预期收益 + 新注册用户分享每次活动的平均数量 * 新注册用户的生命周期价值
点击一次广告的预期收益 = 点击广告的几率 * 平均每次点击向发布者收取的费用
点击一次广告的几率根据历史数据在时间窗口(一年或一个月)内的平均转化率得出,类似值通过每次点击的平均成本得出。
计算生命周期价值有点麻烦,要得出整个生命周期内用户产生的总收益,通常使用队列分析或保留分析等方法。按指定月份对注册用户进行分组,查看注册后十二个月内用户点击广告的次数。根据十二个不同队列月份,得出用户生命周期的平均收益。至此,可以将分析时限设置为任意时段,其因果关系可忽略不计,即由于初次分享且注册用户不管怎样都会在该时间窗口之外注册,因此,不能认为是分享行为带来的收入。
将求出的生命周期价值代入原始公式,就能得出分享一次请愿书的价值。还可以考虑更多元素,例如新注册用户分享自己的内容带来其他用户加入而产生的收益。要在答案里加入更多元素的话,注意不要冲淡核心信息。专注回答最初的问题,就算有不同的想法,留着最后再说。
-
给定一组分好类的新闻,如体育、政治、经济等类别,怎样为新文章分类?
原理 :目的在于测试求职者对数据科学方法论的理解,了解求职者处理非结构化文本数据的经验,这是了解求职者有没有能力与信心处理复杂数据的重要测试。
应答思路 :说明怎么组织文本,以及如何看待分类系统。
基本思路 :
1)探索数据,理解关键元素 a. 绘制训练集里的新闻分布,确定是否存在标签失衡。 b. 查看文本,识别异常,如非英文文本,重度缩写及拼写错误。 c. 主题提取,识别指定的潜在主题关键字,查找与标记类别的关联性。注意,使用潜在主题的关键字比使用全部单词能更好地体现关联性。
2)通过清理文本得出训练集。删除标点符号、缩写和Unicode字符这种信息量少的元素。还可以通过转换小写字母、词形还原与词干提取进一步清理数据。
3)使用TF-IDF矢量器把数据转换为TF-IDF指标的标准词袋模型,使用TF-IDF上下限缩减词汇量。
4)构建数据管道,训练不同模型,比较AUC,F1分值,精确度和召回度等指标的性能。还可以使用栅格搜索实现自动交叉验证。
5)获得最优化模型后,用Python的Pickled或Java的POJO把该模型发布到生产环境。这个模型还可处理其它新文章,使用和第2、3步相同的流程进行清理即可。
-
设计评估网页设计替代方案的实验。假设没有其它实验结果支持,也没有采集用户行为知识。讨论这一结论可能导致的潜在问题,以及如何避免这些问题。
原理 :网络公司大多会测试这个问题,因为优化网站争取更好的业绩是他们的生存之本。比如,Facebook就经常优化主页,刺激用户发布更多帖子。数据科学家的职责是帮助产品经理设计实验,解释实验结果。这个问题旨在了解求职者对这个主题的认知水平。
解决方案 :列出改版的本质和选择网站版本的决定性指标。例如,点击率与Facebook的平均分享次数。
接下来确定达到统计显著性(例如95%)的必要样本和访问次数。可以使用卡方检验(使用是否点击这样的二项式随机变量)或Z检验(使用正态分布随机变量)。然后,评估P值,确定B检验的指标与基准A检验的指标是否在统计上有显著不同,如果存在显著不同,且新版指标优于基准指标,则新版网站是最好的选择。
回答问题时,要考虑的问题 :
1)识别因页面交互产生的潜在偏差。和产品经理交流,探讨有没有可能随机样本无法测试出改版的本质。
2)对两个访客随机样本进行A/A测试,检查选择的分布和指标是否未具备统计显著差异。这是为了保证A/B测试的公平性。A/A测试可确保受众没有特定的偏置或偏差,并且确保A/B测试中随机选择的统计相关性。
3)假如评估指标中显著异常值,这样的话,平均值就不宜作为评估指标,此时,分布也可能会出现高度偏差。虽然根据中心极限定理可以假设平均值作为比较指标,但有时这种假设也可能不成立。因此,要核查指标,确保在对比不同方案时,转换率或用户分享次数的平均值是理想的指标。如果某个用户的分享次数多达几千次,使用每个用户的分享率就不是最佳的性能指标了。
总之,案例问题旨在测试求职者的经验和数据科学各领域的知识。目的是了解求职者的能力是否具有局限性。遇到这种问题时,尽量充分展示分析各类问题的能力。
面试提示
1)穿着得体。去创业公司面试,穿件衬衫就够了。去银行面试,最好穿西装,打领带。要是不确定穿什么合适,就提前问一下人力资源的人。
2)面试前,了解一下面试官和公司,想清楚要问的问题。
3)精神饱满。吃饱喝足,锻炼身体,尽量提前做好准备。
4)回答问题要详细,思路要清晰。
5)微笑,信心。用各种方式减缓压力,做做瑜伽、伸伸懒腰、读点闲书 — 尽可能保持巅峰状态。
结论
数据科学面试是个多面兽,求职者会面对各种挑战,现场编程、设计算法、统计知识、数学问题、领导能力、沟通技巧、说服力和影响力,真是不胜其烦。
数据科学面试很难,好在我们总结了求职成功者和招聘经理的想法与理念,将之整理成系统、可行的思路供大家参考。
作者:呆鸟
链接:https://juejin.im/post/5b3f818d5188251b3c3b0971
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。